summaryrefslogtreecommitdiff
path: root/src/bin
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/elementary/.gitignore7
-rw-r--r--src/bin/elementary/Makefile.am195
-rw-r--r--src/bin/elementary/config.c4115
-rw-r--r--src/bin/elementary/elementary_codegen.c887
-rw-r--r--src/bin/elementary/elm_prefs_cc.c201
-rw-r--r--src/bin/elementary/elm_prefs_cc.h107
-rw-r--r--src/bin/elementary/elm_prefs_cc_handlers.c1218
-rw-r--r--src/bin/elementary/elm_prefs_cc_mem.c35
-rw-r--r--src/bin/elementary/elm_prefs_cc_out.c52
-rw-r--r--src/bin/elementary/elm_prefs_cc_parse.c1401
-rw-r--r--src/bin/elementary/quicklaunch.c347
-rw-r--r--src/bin/elementary/run.c213
-rw-r--r--src/bin/elementary/test.c1030
-rw-r--r--src/bin/elementary/test.h12
-rw-r--r--src/bin/elementary/test_3d.c333
-rw-r--r--src/bin/elementary/test_access.c398
-rw-r--r--src/bin/elementary/test_actionslider.c209
-rw-r--r--src/bin/elementary/test_anim.c97
-rw-r--r--src/bin/elementary/test_application_server.c206
-rw-r--r--src/bin/elementary/test_bg.c270
-rw-r--r--src/bin/elementary/test_box.c882
-rw-r--r--src/bin/elementary/test_bubble.c176
-rw-r--r--src/bin/elementary/test_button.c205
-rw-r--r--src/bin/elementary/test_calendar.c375
-rw-r--r--src/bin/elementary/test_check.c190
-rw-r--r--src/bin/elementary/test_clock.c363
-rw-r--r--src/bin/elementary/test_cnp.c135
-rw-r--r--src/bin/elementary/test_colorclass.c24
-rw-r--r--src/bin/elementary/test_colorselector.c212
-rw-r--r--src/bin/elementary/test_combobox.c278
-rw-r--r--src/bin/elementary/test_config.c534
-rw-r--r--src/bin/elementary/test_conform.c195
-rw-r--r--src/bin/elementary/test_conform_indicator.c384
-rw-r--r--src/bin/elementary/test_ctxpopup.c433
-rw-r--r--src/bin/elementary/test_cursor.c473
-rw-r--r--src/bin/elementary/test_datetime.c107
-rw-r--r--src/bin/elementary/test_dayselector.c125
-rw-r--r--src/bin/elementary/test_disable.c207
-rw-r--r--src/bin/elementary/test_diskselector.c355
-rw-r--r--src/bin/elementary/test_dnd.c1399
-rw-r--r--src/bin/elementary/test_eio.c245
-rw-r--r--src/bin/elementary/test_entry.c2716
-rw-r--r--src/bin/elementary/test_entry_anchor.c236
-rw-r--r--src/bin/elementary/test_entry_anchor2.c109
-rw-r--r--src/bin/elementary/test_explode.c211
-rw-r--r--src/bin/elementary/test_explode.h1
-rw-r--r--src/bin/elementary/test_external.c182
-rw-r--r--src/bin/elementary/test_factory.c181
-rw-r--r--src/bin/elementary/test_fileselector.c589
-rw-r--r--src/bin/elementary/test_fileselector_button.c248
-rw-r--r--src/bin/elementary/test_fileselector_entry.c259
-rw-r--r--src/bin/elementary/test_flip.c711
-rw-r--r--src/bin/elementary/test_flip_page.c909
-rw-r--r--src/bin/elementary/test_flipselector.c188
-rw-r--r--src/bin/elementary/test_floating.c101
-rw-r--r--src/bin/elementary/test_focus.c902
-rw-r--r--src/bin/elementary/test_focus_custom_chain.c243
-rw-r--r--src/bin/elementary/test_focus_policy.c150
-rw-r--r--src/bin/elementary/test_focus_style.c234
-rw-r--r--src/bin/elementary/test_gengrid.c2231
-rw-r--r--src/bin/elementary/test_genlist.c5300
-rw-r--r--src/bin/elementary/test_gesture_layer.c400
-rw-r--r--src/bin/elementary/test_gesture_layer2.c808
-rw-r--r--src/bin/elementary/test_gesture_layer3.c585
-rw-r--r--src/bin/elementary/test_glview.c717
-rw-r--r--src/bin/elementary/test_glview_manygears.c951
-rw-r--r--src/bin/elementary/test_glview_simple.c290
-rw-r--r--src/bin/elementary/test_grid.c189
-rw-r--r--src/bin/elementary/test_hover.c249
-rw-r--r--src/bin/elementary/test_hoversel.c416
-rw-r--r--src/bin/elementary/test_icon.c437
-rw-r--r--src/bin/elementary/test_icon_animated.c57
-rw-r--r--src/bin/elementary/test_icon_desktops.c106
-rw-r--r--src/bin/elementary/test_image.c193
-rw-r--r--src/bin/elementary/test_index.c585
-rw-r--r--src/bin/elementary/test_inwin.c129
-rw-r--r--src/bin/elementary/test_label.c376
-rw-r--r--src/bin/elementary/test_launcher.c921
-rw-r--r--src/bin/elementary/test_layout.c271
-rw-r--r--src/bin/elementary/test_list.c1953
-rw-r--r--src/bin/elementary/test_main_menu.c77
-rw-r--r--src/bin/elementary/test_map.c1208
-rw-r--r--src/bin/elementary/test_menu.c312
-rw-r--r--src/bin/elementary/test_multi.c132
-rw-r--r--src/bin/elementary/test_multibuttonentry.c254
-rw-r--r--src/bin/elementary/test_naviframe.c388
-rw-r--r--src/bin/elementary/test_naviframe_complex.c367
-rw-r--r--src/bin/elementary/test_notify.c448
-rw-r--r--src/bin/elementary/test_panel.c369
-rw-r--r--src/bin/elementary/test_panes.c105
-rw-r--r--src/bin/elementary/test_photo.c100
-rw-r--r--src/bin/elementary/test_photocam.c616
-rw-r--r--src/bin/elementary/test_popup.c934
-rw-r--r--src/bin/elementary/test_prefs.c119
-rw-r--r--src/bin/elementary/test_progressbar.c397
-rw-r--r--src/bin/elementary/test_radio.c189
-rw-r--r--src/bin/elementary/test_scaling.c119
-rw-r--r--src/bin/elementary/test_scroller.c730
-rw-r--r--src/bin/elementary/test_segment_control.c156
-rw-r--r--src/bin/elementary/test_separator.c67
-rw-r--r--src/bin/elementary/test_slider.c307
-rw-r--r--src/bin/elementary/test_slideshow.c236
-rw-r--r--src/bin/elementary/test_spinner.c113
-rw-r--r--src/bin/elementary/test_store.c267
-rw-r--r--src/bin/elementary/test_sys_notify.c148
-rw-r--r--src/bin/elementary/test_systray.c192
-rw-r--r--src/bin/elementary/test_table.c539
-rw-r--r--src/bin/elementary/test_task_switcher.c400
-rw-r--r--src/bin/elementary/test_thumb.c63
-rw-r--r--src/bin/elementary/test_toolbar.c1314
-rw-r--r--src/bin/elementary/test_tooltip.c745
-rw-r--r--src/bin/elementary/test_transit.c770
-rw-r--r--src/bin/elementary/test_transit_bezier.c315
-rw-r--r--src/bin/elementary/test_video.c58
-rw-r--r--src/bin/elementary/test_weather.c168
-rw-r--r--src/bin/elementary/test_web.c693
-rw-r--r--src/bin/elementary/test_win_dialog.c48
-rw-r--r--src/bin/elementary/test_win_inline.c254
-rw-r--r--src/bin/elementary/test_win_keygrab.c243
-rw-r--r--src/bin/elementary/test_win_plug.c211
-rw-r--r--src/bin/elementary/test_win_socket.c202
-rw-r--r--src/bin/elementary/test_win_state.c630
-rw-r--r--src/bin/elementary/test_win_wm_rotation.c214
123 files changed, 59181 insertions, 0 deletions
diff --git a/src/bin/elementary/.gitignore b/src/bin/elementary/.gitignore
new file mode 100644
index 0000000000..5cbbb5c189
--- /dev/null
+++ b/src/bin/elementary/.gitignore
@@ -0,0 +1,7 @@
+/elementary_config
+/elementary_quicklaunch
+/elementary_run
+/elementary_test
+/elementary_codegen
+/elementary_testql
+/elm_prefs_cc
diff --git a/src/bin/elementary/Makefile.am b/src/bin/elementary/Makefile.am
new file mode 100644
index 0000000000..46db673e5d
--- /dev/null
+++ b/src/bin/elementary/Makefile.am
@@ -0,0 +1,195 @@
+AUTOMAKE_OPTIONS = 1.4 foreign
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib \
+-I$(top_builddir)/src/lib \
+-I$(top_srcdir)/src/bin \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+@ELEMENTARY_CFLAGS@
+
+bin_PROGRAMS = \
+@ELEMENTARY_TEST_PRG@ \
+@ELEMENTARY_CONFIG_PRG@ \
+@ELEMENTARY_CODEGEN_PRG@ \
+@ELM_PREFS_CC_PRG@
+
+if BUILD_QUICKLAUNCH
+bin_PROGRAMS += elementary_quicklaunch elementary_run
+endif
+
+EXTRA_PROGRAMS = elementary_test elementary_config elementary_codegen elm_prefs_cc
+
+elementary_test_SOURCES = \
+test.c \
+test_explode.c \
+test_explode.h \
+test_3d.c \
+test_access.c \
+test_actionslider.c \
+test_anim.c \
+test_application_server.c \
+test_bg.c \
+test_box.c \
+test_bubble.c \
+test_button.c \
+test_calendar.c \
+test_check.c \
+test_clock.c \
+test_cnp.c \
+test_colorselector.c \
+test_colorclass.c \
+test_combobox.c \
+test_config.c \
+test_conform.c \
+test_conform_indicator.c \
+test_ctxpopup.c \
+test_cursor.c \
+test_datetime.c \
+test_dayselector.c \
+test_disable.c \
+test_diskselector.c \
+test_dnd.c \
+test_eio.c \
+test_entry.c \
+test_entry_anchor.c \
+test_entry_anchor2.c \
+test_external.c \
+test_fileselector_button.c \
+test_fileselector.c \
+test_fileselector_entry.c \
+test_flip.c \
+test_flip_page.c \
+test_flipselector.c \
+test_floating.c \
+test_focus.c \
+test_focus_custom_chain.c \
+test_focus_policy.c \
+test_focus_style.c \
+test_gengrid.c \
+test_genlist.c \
+test_gesture_layer.c \
+test_gesture_layer2.c \
+test_gesture_layer3.c \
+test_glview_simple.c \
+test_glview.c \
+test_glview_manygears.c \
+test_grid.c \
+test_hover.c \
+test_hoversel.c \
+test_icon.c \
+test_icon_desktops.c \
+test_icon_animated.c \
+test_image.c \
+test_index.c \
+test_inwin.c \
+test_label.c \
+test_launcher.c \
+test_layout.c \
+test_list.c \
+test_map.c \
+test_main_menu.c \
+test_menu.c \
+test_multi.c \
+test_multibuttonentry.c \
+test_naviframe.c \
+test_naviframe_complex.c \
+test_notify.c \
+test_panel.c \
+test_panes.c \
+test_photo.c \
+test_photocam.c \
+test_popup.c \
+test_prefs.c \
+test_progressbar.c \
+test_radio.c \
+test_scaling.c \
+test_scroller.c \
+test_segment_control.c \
+test_separator.c \
+test_slider.c \
+test_slideshow.c \
+test_spinner.c \
+test_store.c \
+test_sys_notify.c \
+test_systray.c \
+test_task_switcher.c \
+test_table.c \
+test_thumb.c \
+test_toolbar.c \
+test_tooltip.c \
+test_transit.c \
+test_transit_bezier.c \
+test_video.c \
+test_weather.c \
+test_web.c \
+test_win_inline.c \
+test_win_keygrab.c \
+test_win_socket.c \
+test_win_plug.c \
+test_win_state.c \
+test_win_wm_rotation.c \
+test_win_dialog.c \
+test.h
+
+elementary_test_LDADD = $(top_builddir)/src/lib/libelementary.la \
+ @ELEMENTARY_LIBS@
+elementary_test_CFLAGS =
+elementary_test_LDFLAGS =
+
+elementary_config_SOURCES = \
+config.c
+
+elementary_config_LDADD = $(top_builddir)/src/lib/libelementary.la \
+ @ELEMENTARY_LIBS@
+elementary_config_LDFLAGS =
+
+elementary_codegen_SOURCES = \
+elementary_codegen.c
+
+elementary_codegen_LDADD = \
+ $(top_builddir)/src/lib/libelementary.la \
+ @ELEMENTARY_LIBS@
+elementary_codegen_LDFLAGS =
+
+noinst_HEADERS = \
+elm_prefs_cc.h
+
+elm_prefs_cc_SOURCES = \
+elm_prefs_cc.c \
+elm_prefs_cc_mem.c \
+elm_prefs_cc_out.c \
+elm_prefs_cc_parse.c \
+elm_prefs_cc_handlers.c
+
+elm_prefs_cc_LDADD = \
+$(top_builddir)/src/lib/libelementary.la \
+@ELEMENTARY_LIBS@
+
+if BUILD_QUICKLAUNCH
+elementary_quicklaunch_SOURCES = quicklaunch.c
+elementary_quicklaunch_LDADD = $(top_builddir)/src/lib/libelementary.la \
+ @ELEMENTARY_LIBS@
+elementary_quicklaunch_LDFLAGS =
+
+if BUILD_RUN
+elementary_run_CPPFLAGS = -I$(top_srcdir) \
+-I$(top_srcdir)/src/lib \
+-I$(top_builddir)/src/lib \
+-I$(top_srcdir)/src/bin \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\"
+
+elementary_run_SOURCES = run.c
+elementary_run_LDADD =
+elementary_run_LDFLAGS =
+endif
+endif
+
+EXTRA_DIST = \
+test_factory.c
diff --git a/src/bin/elementary/config.c b/src/bin/elementary/config.c
new file mode 100644
index 0000000000..d63bcef157
--- /dev/null
+++ b/src/bin/elementary/config.c
@@ -0,0 +1,4115 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct _Theme Theme;
+typedef struct _Fonts_Data Fonts_Data;
+typedef struct _Elm_Text_Class_Data Elm_Text_Class_Data;
+typedef struct _Elm_Font_Size_Data Elm_Font_Size_Data;
+
+struct _Theme
+{
+ const char *label;
+ const char *name;
+ const char *path;
+ Eina_Bool in_search_path;
+};
+
+static const Eina_List *tsel = NULL;
+static Eina_List *themes = NULL;
+
+struct _Elm_Text_Class_Data
+{
+ const char *name;
+ const char *desc;
+ const char *font;
+ const char *style;
+ Evas_Font_Size size;
+};
+
+struct _Elm_Font_Size_Data
+{
+ const char *size_str;
+ Evas_Font_Size size;
+};
+
+struct _Fonts_Data
+{
+ Eina_List *text_classes;
+
+ Eina_Hash *font_hash;
+ Eina_List *font_px_list;
+ Eina_List *font_scale_list;
+
+ const char *cur_font;
+ const char *cur_style;
+ double cur_size;
+};
+
+#define ELM_LIST_DISABLE(list) \
+ do \
+ { \
+ const Eina_List *_l = elm_list_items_get(list); \
+ if (_l) \
+ { \
+ elm_list_item_show(eina_list_data_get(_l));\
+ elm_object_disabled_set(list, EINA_TRUE); \
+ } \
+ } \
+ while (0)
+
+#define ELM_LIST_ENABLE(list) \
+ do \
+ { \
+ elm_object_disabled_set(list, EINA_FALSE); \
+ } \
+ while (0)
+
+#define LABEL_FRAME_ADD(label) \
+ do \
+ { \
+ pd = elm_frame_add(win); \
+ evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, 0.0); \
+ evas_object_size_hint_align_set(pd, EVAS_HINT_FILL, 0.5); \
+ elm_object_style_set(pd, "pad_medium"); \
+ elm_box_pack_end(bx, pd); \
+ evas_object_show(pd); \
+ \
+ lb = elm_label_add(win); \
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); \
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.5); \
+ elm_object_text_set(lb, label); \
+ elm_object_content_set(pd, lb); \
+ evas_object_show(lb); \
+ } \
+ while (0)
+
+#define CHECK_ADD(_label, _desc, _cb, _cb_param) \
+ ck = elm_check_add(win); \
+ elm_object_text_set(ck, _label); \
+ elm_object_tooltip_text_set(ck, _desc); \
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); \
+ evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.5); \
+ elm_box_pack_end(bx, ck); \
+ evas_object_show(ck); \
+ evas_object_smart_callback_add(ck, "changed", _cb, _cb_param);
+
+static int quiet = 0;
+static int interactive = 1;
+
+static const char *theme_set = NULL;
+static const char *finger_size_set = NULL;
+static const char *scale_set = NULL;
+static const char *web_backend = NULL;
+static Fonts_Data fndata = {NULL, NULL, NULL, NULL, NULL, NULL, 0.0};
+static Evas_Object *web_backend_entry = NULL;
+
+static void
+_font_styles_list_sel(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info);
+
+static void
+config_exit(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Text_Class_Data *tc_data;
+ Elm_Font_Size_Data *sd;
+
+ EINA_LIST_FREE(fndata.text_classes, tc_data)
+ {
+ eina_stringshare_del(tc_data->name);
+ eina_stringshare_del(tc_data->desc);
+ eina_stringshare_del(tc_data->font);
+ eina_stringshare_del(tc_data->style);
+ free(tc_data);
+ }
+
+ elm_font_available_hash_del(fndata.font_hash);
+ fndata.font_hash = NULL;
+
+ EINA_LIST_FREE(fndata.font_px_list, sd)
+ {
+ eina_stringshare_del(sd->size_str);
+ free(sd);
+ }
+
+ EINA_LIST_FREE(fndata.font_scale_list, sd)
+ {
+ eina_stringshare_del(sd->size_str);
+ free(sd);
+ }
+
+ if (fndata.cur_font) eina_stringshare_del(fndata.cur_font);
+ fndata.cur_font = NULL;
+
+ if (fndata.cur_style) eina_stringshare_del(fndata.cur_style);
+ fndata.cur_style = NULL;
+
+ elm_config_save();
+ elm_exit(); /* exit the program's main loop that runs in elm_run() */
+}
+
+static void
+scroll_animation_disable_change(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Eina_Bool val = elm_check_state_get(obj);
+ Eina_Bool sb = elm_config_scroll_animation_disable_get();
+
+ if (val == sb) return;
+ elm_config_scroll_animation_disable_set(val);
+ elm_config_all_flush();
+}
+
+static void
+scroll_accel_factor_change(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ double bf = elm_config_scroll_accel_factor_get();
+ double val = elm_slider_value_get(obj);
+
+ if (fabs(bf - val) < DBL_EPSILON) return;
+ elm_config_scroll_accel_factor_set(val);
+ elm_config_all_flush();
+}
+
+static void
+sb_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool val = elm_check_state_get(obj);
+ Eina_Bool sb = elm_config_scroll_bounce_enabled_get();
+
+ if (val == sb) return;
+ elm_config_scroll_bounce_enabled_set(val);
+ elm_config_all_flush();
+
+ /*TODO: enable/disable subordinate sliders (make 'em support it 1st)*/
+}
+
+static void
+ss_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool val = elm_check_state_get(obj);
+ Eina_Bool ss = elm_config_scroll_thumbscroll_smooth_start_get();
+
+ if (val == ss) return;
+ elm_config_scroll_thumbscroll_smooth_start_set(val);
+ elm_config_all_flush();
+}
+
+static void
+bf_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+bf_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double bf = elm_config_scroll_bounce_friction_get();
+ double val = elm_slider_value_get(obj);
+
+ if (bf == val) return;
+ elm_config_scroll_bounce_friction_set(val);
+ elm_config_all_flush();
+}
+
+static void
+ps_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+ps_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double ps = elm_config_scroll_page_scroll_friction_get();
+ double val = elm_slider_value_get(obj);
+
+ if (ps == val) return;
+ elm_config_scroll_page_scroll_friction_set(val);
+ elm_config_all_flush();
+}
+
+static void
+bis_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+bis_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double bis = elm_config_scroll_bring_in_scroll_friction_get();
+ double val = elm_slider_value_get(obj);
+
+ if (bis == val) return;
+ elm_config_scroll_bring_in_scroll_friction_set(val);
+ elm_config_all_flush();
+}
+
+static void
+zf_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+zf_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double zf = elm_config_scroll_zoom_friction_get();
+ double val = elm_slider_value_get(obj);
+
+ if (zf == val) return;
+ elm_config_scroll_zoom_friction_set(val);
+ elm_config_all_flush();
+}
+
+static void
+smooth_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 100.0))) / 100.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+smooth_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double zf = elm_config_scroll_thumbscroll_smooth_amount_get();
+ double val = elm_slider_value_get(obj);
+
+ if (zf == val) return;
+ elm_config_scroll_thumbscroll_smooth_amount_set(val);
+ elm_config_all_flush();
+}
+
+static void
+smooth_win_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 100.0))) / 100.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+smooth_win_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double zf = elm_config_scroll_thumbscroll_smooth_time_window_get();
+ double val = elm_slider_value_get(obj);
+
+ if (zf == val) return;
+ elm_config_scroll_thumbscroll_smooth_time_window_set(val);
+ elm_config_all_flush();
+}
+
+static void
+ts_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool val = elm_check_state_get(obj);
+ Eina_Bool sb = elm_config_scroll_thumbscroll_enabled_get();
+
+ if (val == sb) return;
+ elm_config_scroll_thumbscroll_enabled_set(val);
+ elm_config_all_flush();
+
+ /*TODO: enable/disable subordinate sliders (make 'em support it 1st)*/
+}
+
+static void
+tst_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tst_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tst = elm_config_scroll_thumbscroll_threshold_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tst == val) return;
+ elm_config_scroll_thumbscroll_threshold_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tsht_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tsht_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tst = elm_config_scroll_thumbscroll_hold_threshold_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tst == val) return;
+ elm_config_scroll_thumbscroll_hold_threshold_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tsmt_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tsmt_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tsmt = elm_config_scroll_thumbscroll_momentum_threshold_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tsmt == val) return;
+ elm_config_scroll_thumbscroll_momentum_threshold_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tsfdt_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tsfdt_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tsfdt = elm_config_scroll_thumbscroll_flick_distance_tolerance_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tsfdt == val) return;
+ elm_config_scroll_thumbscroll_flick_distance_tolerance_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tsf_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tsf_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tsf = elm_config_scroll_thumbscroll_friction_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tsf == val) return;
+ elm_config_scroll_thumbscroll_friction_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tsmf_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tsmf_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tsmf = elm_config_scroll_thumbscroll_min_friction_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tsmf == val) return;
+ elm_config_scroll_thumbscroll_min_friction_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tsfs_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tsfs_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tsfs = elm_config_scroll_thumbscroll_friction_standard_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tsfs == val) return;
+ elm_config_scroll_thumbscroll_friction_standard_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tsbf_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tsbf_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tsbf = elm_config_scroll_thumbscroll_border_friction_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tsbf == val) return;
+ elm_config_scroll_thumbscroll_border_friction_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tssf_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 20.0))) / 20.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tssf_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tssf = elm_config_scroll_thumbscroll_sensitivity_friction_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tssf == val) return;
+ elm_config_scroll_thumbscroll_sensitivity_friction_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tsat_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tsat_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tsat = elm_config_scroll_thumbscroll_acceleration_threshold_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tsat == val) return;
+ elm_config_scroll_thumbscroll_acceleration_threshold_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tsatl_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tsatl_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tsatl = elm_config_scroll_thumbscroll_acceleration_time_limit_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tsatl == val) return;
+ elm_config_scroll_thumbscroll_acceleration_time_limit_set(val);
+ elm_config_all_flush();
+}
+
+static void
+tsaw_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+tsaw_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double tsaw = elm_config_scroll_thumbscroll_acceleration_weight_get();
+ double val = elm_slider_value_get(obj);
+
+ if (tsaw == val) return;
+ elm_config_scroll_thumbscroll_acceleration_weight_set(val);
+ elm_config_all_flush();
+}
+
+static void
+cf_enable(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool cf = elm_config_cache_flush_enabled_get();
+ Eina_Bool val = elm_check_state_get(obj);
+
+ if (cf == val) return;
+ elm_object_disabled_set((Evas_Object *)data, !val);
+ elm_config_cache_flush_enabled_set(val);
+ elm_config_all_flush();
+}
+
+static void
+cf_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 5.0))) / 5.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+cf_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double cf = elm_config_cache_flush_interval_get();
+ double val = elm_slider_value_get(obj);
+
+ if (cf == val) return;
+ elm_config_cache_flush_interval_set(val);
+ elm_config_all_flush();
+}
+
+static void
+fc_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+fc_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double font_cache = elm_config_cache_font_cache_size_get();
+ double val = elm_slider_value_get(obj);
+
+ if (font_cache == val) return;
+ elm_config_cache_font_cache_size_set(val * 1024);
+ elm_config_all_flush();
+}
+
+static void
+ic_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+ic_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double image_cache = elm_config_cache_image_cache_size_get();
+ double val = elm_slider_value_get(obj);
+
+ if (image_cache == val) return;
+ elm_config_cache_image_cache_size_set(val * 1024);
+ elm_config_all_flush();
+}
+
+static void
+sc_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 10.0))) / 10.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+sc_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double scale = elm_config_scale_get();
+ double val = elm_slider_value_get(obj);
+
+ if (scale == val) return;
+ elm_config_scale_set(val);
+ elm_config_all_flush();
+}
+
+static void
+fs_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 5.0))) / 5.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+fs_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double fs = elm_config_finger_size_get();
+ double val = elm_slider_value_get(obj);
+
+ if (fs == val) return;
+ elm_config_finger_size_set(val);
+ elm_config_all_flush();
+}
+
+static void
+efc_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 5.0))) / 5.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+efc_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double efc = elm_config_cache_edje_file_cache_size_get();
+ double val = elm_slider_value_get(obj);
+
+ if (efc == val) return;
+ elm_config_cache_edje_file_cache_size_set(val);
+ elm_config_all_flush();
+}
+
+static void
+ecc_round(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ double v;
+
+ v = ((double)((int)(val * 5.0))) / 5.0;
+ if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+ecc_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double ecc = elm_config_cache_edje_collection_cache_size_get();
+ double val = elm_slider_value_get(obj);
+
+ if (ecc == val) return;
+ elm_config_cache_edje_collection_cache_size_set(val);
+ elm_config_all_flush();
+}
+
+static void
+ac_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool val = elm_check_state_get(obj);
+ Eina_Bool ac = elm_config_access_get();
+
+ if (val == ac) return;
+ elm_config_access_set(val);
+ elm_config_all_flush();
+}
+
+static void
+sel_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool val = elm_check_state_get(obj);
+ Eina_Bool sel = elm_config_selection_unfocused_clear_get();
+
+ if (val == sel) return;
+ elm_config_selection_unfocused_clear_set(val);
+ elm_config_all_flush();
+}
+
+static void
+dbg_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool val = elm_check_state_get(obj);
+ Eina_Bool sel = elm_config_clouseau_enabled_get();
+
+ if (val == sel) return;
+ elm_config_clouseau_enabled_set(val);
+ elm_config_all_flush();
+}
+
+static void
+atspi_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool val = elm_check_state_get(obj);
+ Eina_Bool sel = elm_config_atspi_mode_get();
+
+ if (val == sel) return;
+ elm_config_atspi_mode_set(val);
+ elm_config_all_flush();
+}
+
+static void
+transition_duration_change(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ Eina_Bool scale = elm_config_transition_duration_factor_get();
+
+ if (scale == val) return;
+ elm_config_transition_duration_factor_set(val);
+ elm_config_all_flush();
+}
+
+static void
+_status_basic(Evas_Object *win,
+ Evas_Object *bx0)
+{
+ Evas_Object *lb, *fr;
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_text_set(fr, "Information");
+ elm_box_pack_end(bx0, fr);
+ evas_object_show(fr);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "Applying configuration change"
+ );
+ elm_object_content_set(fr, lb);
+ evas_object_show(lb);
+}
+
+static void
+_status_config(Evas_Object *win,
+ Evas_Object *bx0)
+{
+ Evas_Object *lb, *pd, *bx, *fr, *sl, *sp;
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Sizing");
+ elm_box_pack_end(bx0, fr);
+ evas_object_show(fr);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5);
+
+ LABEL_FRAME_ADD("<hilight>Scale</>");
+
+ sl = elm_slider_add(win);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.2f");
+ elm_slider_indicator_format_set(sl, "%1.2f");
+ elm_slider_min_max_set(sl, 0.25, 5.0);
+ elm_slider_value_set(sl, elm_config_scale_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", sc_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", sc_change, NULL);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ LABEL_FRAME_ADD("<hilight>Finger Size</><br/>");
+
+ sl = elm_slider_add(win);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 5, 200);
+ elm_slider_value_set(sl, elm_config_finger_size_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", fs_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", fs_change, NULL);
+
+ // FIXME: add theme selector (basic mode and advanced for fallbacks)
+ // FIXME: save config
+ // FIXME: profile selector / creator etc.
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+}
+
+static void
+_flip_to(Evas_Object *win,
+ const char *name)
+{
+ Evas_Object *wid, *naviframe;
+ wid = evas_object_data_get(win, name);
+ naviframe = evas_object_data_get(win, "naviframe");
+ if (!naviframe) return;
+ elm_naviframe_item_simple_promote(naviframe, wid);
+}
+
+static void
+_cf_sizing(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _flip_to(data, "sizing");
+}
+
+static void
+_cf_themes(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _flip_to(data, "themes");
+}
+
+static void
+_cf_fonts(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _flip_to(data, "fonts");
+}
+
+static void
+_cf_profiles(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _flip_to(data, "profiles");
+}
+
+static void
+_cf_scrolling(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _flip_to(data, "scrolling");
+}
+
+static void
+_cf_rendering(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _flip_to(data, "rendering");
+}
+
+static void
+_cf_caches(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _flip_to(data, "caches");
+}
+
+static void
+_cf_audio(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _flip_to(data,"audio");
+}
+
+static void
+_cf_focus(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _flip_to(data, "focus");
+}
+
+static void
+_cf_etc(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _flip_to(data,"etc");
+}
+
+const char *
+_elm_theme_current_get(const char *theme_search_order)
+{
+ const char *ret;
+ const char *p;
+
+ if (!theme_search_order)
+ return NULL;
+
+ for (p = theme_search_order;; p++)
+ {
+ if ((*p == ':') || (!*p))
+ {
+ if (p > theme_search_order)
+ {
+ char *n = malloc(p - theme_search_order + 1);
+ if (!n)
+ return NULL;
+
+ strncpy(n, theme_search_order, p - theme_search_order);
+ n[p - theme_search_order] = 0;
+ ret = eina_stringshare_add(n);
+ free(n);
+ break;
+ }
+ }
+ }
+
+ return ret;
+}
+
+static void
+_font_overlay_set_all(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fclasses;
+ Elm_Text_Class_Data *tc_data, *tc;
+ Elm_Object_Item *list_it;
+ Eina_List *l;
+
+ win = data;
+
+ fclasses = evas_object_data_get(win, "font_classes_list");
+ list_it = elm_list_selected_item_get(fclasses);
+ if (!list_it) return;
+ tc_data = elm_object_item_data_get(list_it);
+ if (!tc_data) return;
+
+ EINA_LIST_FOREACH(fndata.text_classes, l, tc)
+ {
+ eina_stringshare_replace(&tc->font, tc_data->font);
+ eina_stringshare_replace(&tc->style, tc_data->style);
+ tc->size = tc_data->size;
+ }
+
+ elm_config_all_flush();
+}
+
+static void
+_font_overlay_reset(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fclasses, *fnames, *fstyles, *fsizes;
+ Elm_Text_Class_Data *tc_data;
+ Elm_Object_Item *list_it;
+
+ win = data;
+
+ fclasses = evas_object_data_get(win, "font_classes_list");
+ list_it = elm_list_selected_item_get(fclasses);
+ if (!list_it) return;
+ tc_data = elm_object_item_data_get(list_it);
+ if (!tc_data) return;
+
+ fnames = evas_object_data_get(win, "font_names_list");
+ fstyles = evas_object_data_get(win, "font_styles_list");
+ fsizes = evas_object_data_get(win, "font_sizes_list");
+
+ elm_config_font_overlay_unset(tc_data->name);
+
+ eina_stringshare_replace(&fndata.cur_font, NULL);
+ eina_stringshare_replace(&tc_data->font, NULL);
+ eina_stringshare_replace(&fndata.cur_style, NULL);
+ eina_stringshare_replace(&tc_data->style, NULL);
+ fndata.cur_size = 0.0;
+ tc_data->size = 0.0;
+
+ ELM_LIST_DISABLE(fnames);
+ ELM_LIST_DISABLE(fstyles);
+ ELM_LIST_DISABLE(fsizes);
+
+ elm_config_all_flush();
+}
+
+static void
+_font_overlay_reset_all(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fclasses, *fnames, *fstyles, *fsizes;
+ Elm_Text_Class_Data *tc_data;
+ Elm_Object_Item *list_it;
+ Eina_List *l;
+
+ win = data;
+ eina_stringshare_replace(&fndata.cur_font, NULL);
+ eina_stringshare_replace(&fndata.cur_style, NULL);
+ fndata.cur_size = 0.0;
+
+ EINA_LIST_FOREACH(fndata.text_classes, l, tc_data)
+ {
+ elm_config_font_overlay_unset(tc_data->name);
+
+ eina_stringshare_replace(&tc_data->font, NULL);
+ eina_stringshare_replace(&tc_data->style, NULL);
+ tc_data->size = 0.0;
+ }
+
+ fclasses = evas_object_data_get(win, "font_classes_list");
+ fnames = evas_object_data_get(win, "font_names_list");
+ fstyles = evas_object_data_get(win, "font_styles_list");
+ fsizes = evas_object_data_get(win, "font_sizes_list");
+
+ list_it = elm_list_selected_item_get(fclasses);
+ if (list_it) elm_list_item_selected_set(list_it, EINA_FALSE);
+
+ ELM_LIST_DISABLE(fnames);
+ ELM_LIST_DISABLE(fstyles);
+ ELM_LIST_DISABLE(fsizes);
+
+ elm_config_all_flush();
+}
+
+static void
+_font_overlay_change(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Text_Class_Data *tc_data;
+ Eina_List *l;
+
+ EINA_LIST_FOREACH(fndata.text_classes, l, tc_data)
+ {
+ if (tc_data->font)
+ {
+ char *name;
+
+ name = elm_font_fontconfig_name_get(tc_data->font,
+ tc_data->style);
+ elm_config_font_overlay_set(tc_data->name, name,
+ tc_data->size ? tc_data->size : -100);
+ elm_font_fontconfig_name_free(name);
+ }
+ else
+ elm_config_font_overlay_unset(tc_data->name);
+ }
+
+ elm_config_font_overlay_apply();
+ elm_config_all_flush();
+
+ /* TODO: apply hinting */
+}
+
+static void
+_config_display_update(Evas_Object *win)
+{
+ int flush_interval, font_c, image_c, edje_file_c, edje_col_c, ts_threshould,
+ ts_hold_threshold;
+ double scale, s_bounce_friction, ts_momentum_threshold,
+ ts_flick_distance_tolerance, ts_friction,
+ ts_min_friction, ts_friction_standard, ts_border_friction,
+ ts_sensitivity_friction, ts_acceleration_threshold,
+ ts_acceleration_time_limit, ts_acceleration_weight, page_friction,
+ bring_in_friction, zoom_friction, transition_duration,
+ smooth_amount, smooth_time_window;
+ const char *curr_theme;
+ Eina_Bool s_bounce, ts, smooth_start;
+ Elm_Theme *th;
+ int fs;
+
+ scale = elm_config_scale_get();
+ fs = elm_config_finger_size_get();
+ flush_interval = elm_config_cache_flush_interval_get();
+ font_c = elm_config_cache_font_cache_size_get();
+ image_c = elm_config_cache_image_cache_size_get();
+ transition_duration = elm_config_transition_duration_factor_get();
+ edje_file_c = elm_config_cache_edje_file_cache_size_get();
+ edje_col_c = elm_config_cache_edje_collection_cache_size_get();
+
+ s_bounce = elm_config_scroll_bounce_enabled_get();
+ s_bounce_friction = elm_config_scroll_bounce_friction_get();
+ ts = elm_config_scroll_thumbscroll_enabled_get();
+ ts_threshould = elm_config_scroll_thumbscroll_threshold_get();
+ ts_hold_threshold = elm_config_scroll_thumbscroll_hold_threshold_get();
+ ts_momentum_threshold = elm_config_scroll_thumbscroll_momentum_threshold_get();
+ ts_flick_distance_tolerance = elm_config_scroll_thumbscroll_flick_distance_tolerance_get();
+ ts_friction = elm_config_scroll_thumbscroll_friction_get();
+ ts_min_friction = elm_config_scroll_thumbscroll_min_friction_get();
+ ts_friction_standard = elm_config_scroll_thumbscroll_friction_standard_get();
+ ts_border_friction = elm_config_scroll_thumbscroll_border_friction_get();
+ ts_sensitivity_friction = elm_config_scroll_thumbscroll_sensitivity_friction_get();
+ ts_acceleration_threshold = elm_config_scroll_thumbscroll_acceleration_threshold_get();
+ ts_acceleration_time_limit = elm_config_scroll_thumbscroll_acceleration_time_limit_get();
+ ts_acceleration_weight = elm_config_scroll_thumbscroll_acceleration_weight_get();
+ page_friction = elm_config_scroll_page_scroll_friction_get();
+ bring_in_friction = elm_config_scroll_bring_in_scroll_friction_get();
+ zoom_friction = elm_config_scroll_zoom_friction_get();
+ smooth_start = elm_config_scroll_thumbscroll_smooth_start_get();
+ smooth_amount = elm_config_scroll_thumbscroll_smooth_amount_get();
+ smooth_time_window = elm_config_scroll_thumbscroll_smooth_time_window_get();
+
+ /* gotta update root windows' atoms */
+ elm_slider_value_set(evas_object_data_get(win, "scale_slider"), scale);
+ elm_slider_value_set(evas_object_data_get(win, "fs_slider"), fs);
+
+ elm_slider_value_set(evas_object_data_get(win,
+ "cache_flush_interval_slider"),
+ flush_interval);
+ elm_slider_value_set(evas_object_data_get(win, "font_cache_slider"),
+ font_c / 1024.0);
+ elm_slider_value_set(evas_object_data_get(win, "image_cache_slider"),
+ image_c / 1024.0);
+ elm_slider_value_set(evas_object_data_get(win, "edje_file_cache_slider"),
+ edje_file_c);
+ elm_slider_value_set(evas_object_data_get(win,
+ "edje_collection_cache_slider"),
+ edje_col_c);
+
+ elm_check_state_set(evas_object_data_get(win, "scroll_bounce_check"),
+ s_bounce);
+ elm_slider_value_set(evas_object_data_get(win, "bounce_friction_slider"),
+ s_bounce_friction);
+ elm_check_state_set(evas_object_data_get(win, "thumbscroll_check"), ts);
+ elm_slider_value_set(evas_object_data_get(win,
+ "ts_threshold_slider"),
+ ts_threshould);
+ elm_slider_value_set(evas_object_data_get(win,
+ "ts_hold_threshold_slider"),
+ ts_hold_threshold);
+ elm_slider_value_set(evas_object_data_get(win,
+ "ts_momentum_threshold_slider"),
+ ts_momentum_threshold);
+ elm_slider_value_set(evas_object_data_get(win,
+ "ts_flick_distance_tolerance_slider"),
+ ts_flick_distance_tolerance);
+ elm_slider_value_set(evas_object_data_get(win,
+ "ts_friction_slider"),
+ ts_friction);
+ elm_slider_value_set(evas_object_data_get(win,
+ "ts_min_friction_slider"),
+ ts_min_friction);
+ elm_slider_value_set(evas_object_data_get(win,
+ "ts_friction_standard_slider"),
+ ts_friction_standard);
+ elm_slider_value_set(evas_object_data_get(win, "ts_border_friction_slider"),
+ ts_border_friction);
+ elm_slider_value_set(evas_object_data_get(win, "ts_sensitivity_friction_slider"),
+ ts_sensitivity_friction);
+ elm_slider_value_set(evas_object_data_get(win, "ts_acceleration_threshold_slider"),
+ ts_acceleration_threshold);
+ elm_slider_value_set(evas_object_data_get(win, "ts_acceleration_time_limit_slider"),
+ ts_acceleration_time_limit);
+ elm_slider_value_set(evas_object_data_get(win, "ts_acceleration_weight_slider"),
+ ts_acceleration_weight);
+ elm_slider_value_set(evas_object_data_get(win,
+ "page_scroll_friction_slider"),
+ page_friction);
+ elm_slider_value_set(evas_object_data_get(win,
+ "bring_in_scroll_friction_slider"),
+ bring_in_friction);
+ elm_slider_value_set(evas_object_data_get(win,
+ "zoom_scroll_friction_slider"),
+ zoom_friction);
+
+ elm_check_state_set(evas_object_data_get(win, "scroll_smooth_start"),
+ smooth_start);
+ elm_slider_value_set(evas_object_data_get(win,
+ "scroll_smooth_amount"),
+ smooth_amount);
+ elm_slider_value_set(evas_object_data_get(win,
+ "scroll_smooth_time_window"),
+ smooth_time_window);
+
+ curr_theme = _elm_theme_current_get(elm_theme_get(NULL));
+
+ th = elm_theme_new();
+ elm_theme_set(th, curr_theme);
+ elm_object_theme_set(evas_object_data_get(win, "theme_preview"), th);
+ elm_theme_free(th);
+ elm_config_transition_duration_factor_set(transition_duration);
+ eina_stringshare_del(curr_theme);
+}
+
+static Eina_Bool
+_config_all_changed(void *data,
+ int ev_type EINA_UNUSED,
+ void *ev EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ _config_display_update(win);
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_profile_use(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *li;
+ const char *selection;
+ const char *profile;
+
+ li = data;
+ selection = elm_object_item_data_get(elm_list_selected_item_get(li));
+ if (!selection) return;
+ profile = elm_config_profile_get();
+
+ if (!profile)
+ {
+ fprintf(stderr, "No profile currently set!\n"); /* FIXME: log domain */
+ return;
+ }
+
+ if (!strcmp(profile, selection))
+ return;
+
+ elm_config_profile_set(selection); /* just here to update info for getters below */
+
+ _config_display_update(elm_object_top_widget_get(li));
+ elm_config_all_flush();
+}
+
+static void
+_btn_todo(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("To be done!\n");
+}
+
+static void
+_profile_reset(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ const char *selection;
+ const char *pdir;
+ Evas_Object *li;
+
+ li = data;
+ selection = elm_object_item_data_get(elm_list_selected_item_get(li));
+ if (!selection) return;
+
+ elm_config_all_flush();
+
+ pdir = elm_config_profile_dir_get(selection, EINA_TRUE);
+ if (!pdir)
+ return;
+
+ ecore_file_recursive_rm(pdir);
+ elm_config_profile_dir_free(pdir);
+
+ elm_config_reload();
+
+ elm_config_all_flush();
+ _config_display_update(elm_object_top_widget_get(li));
+}
+
+static void
+_theme_use(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ const char *defth;
+ Elm_Theme *th;
+ Evas_Object *win = elm_object_top_widget_get(obj);
+ Evas_Object *sample = evas_object_data_get(win, "theme_preview");
+
+ th = elm_object_theme_get(sample);
+ defth = elm_theme_get(th);
+ elm_theme_set(NULL, defth);
+ elm_config_all_flush();
+}
+
+static void
+_theme_sel(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = elm_object_top_widget_get(obj);
+ Evas_Object *sample = evas_object_data_get(win, "theme_preview");
+ Elm_Theme *th;
+ Elm_Object_Item *list_it;
+ Eina_Strbuf *newth;
+ Eina_List *l;
+
+ if (!sample) return;
+ tsel = elm_list_selected_items_get(obj);
+ newth = eina_strbuf_new();
+ EINA_SAFETY_ON_NULL_RETURN(newth);
+ th = elm_theme_new();
+ if (!th)
+ {
+ eina_strbuf_free(newth);
+ return;
+ }
+ EINA_LIST_REVERSE_FOREACH((Eina_List*)tsel, l, list_it)
+ {
+ Theme *t = elm_object_item_data_get(list_it);
+ if (!t) continue;
+
+ eina_strbuf_append_printf(newth, "%s:", t->name);
+ if ((!l->prev) && strcmp(t->name, "default"))
+ /* ensure default theme is always there for fallback */
+ eina_strbuf_append(newth, "default");
+ }
+ elm_theme_set(th, eina_strbuf_string_get(newth));
+ eina_strbuf_free(newth);
+ elm_object_theme_set(sample, th);
+ elm_theme_free(th);
+}
+
+/*static void
+ _theme_browse(void *data, Evas_Object *obj, void *event_info)
+ {
+ printf("not implemented\n");
+ }*/
+
+static void
+_status_config_sizing(Evas_Object *win,
+ Evas_Object *naviframe)
+{
+ Evas_Object *lb, *pd, *bx, *sl, *sp;
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5);
+
+ LABEL_FRAME_ADD("<hilight>Scale</>");
+
+ sl = elm_slider_add(win);
+ evas_object_data_set(win, "scale_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.2f");
+ elm_slider_indicator_format_set(sl, "%1.2f");
+ elm_slider_min_max_set(sl, 0.25, 5.0);
+ elm_slider_value_set(sl, elm_config_scale_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", sc_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", sc_change, NULL);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ LABEL_FRAME_ADD("<hilight>Finger Size</><br/>");
+
+ sl = elm_slider_add(win);
+ evas_object_data_set(win, "fs_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 5, 200);
+ elm_slider_value_set(sl, elm_config_finger_size_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", fs_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", fs_change, NULL);
+
+ evas_object_data_set(win, "sizing", bx);
+
+ elm_naviframe_item_simple_push(naviframe, bx);
+}
+
+#define MUTE_CB(_cb, _chan) \
+static void \
+_cb(void *data EINA_UNUSED, \
+ Evas_Object *obj, \
+ void *event_info EINA_UNUSED) \
+{ \
+ Eina_Bool val = elm_check_state_get(obj); \
+ Eina_Bool v = elm_config_audio_mute_get(_chan); \
+ if (val == v) return; \
+ elm_config_audio_mute_set(_chan, val); \
+ elm_config_all_flush(); \
+}
+
+MUTE_CB(mute_effect_change, EDJE_CHANNEL_EFFECT)
+MUTE_CB(mute_background_change, EDJE_CHANNEL_BACKGROUND)
+MUTE_CB(mute_music_change, EDJE_CHANNEL_MUSIC)
+MUTE_CB(mute_foreground_change, EDJE_CHANNEL_FOREGROUND)
+MUTE_CB(mute_interface_change, EDJE_CHANNEL_INTERFACE)
+MUTE_CB(mute_input_change, EDJE_CHANNEL_INPUT)
+MUTE_CB(mute_alert_change, EDJE_CHANNEL_ALERT)
+MUTE_CB(mute_all_change, EDJE_CHANNEL_ALL)
+
+static void
+_status_config_audio(Evas_Object *win,
+ Evas_Object *naviframe)
+{
+ Evas_Object *bx, *ck;
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5);
+
+#define MUTE_CHECK(_label, _chan, _cb) \
+ CHECK_ADD(_label, _label, _cb, NULL) \
+ elm_check_state_set(ck, elm_config_audio_mute_get(_chan));
+
+ MUTE_CHECK("Mute Effects", EDJE_CHANNEL_EFFECT, mute_effect_change);
+ MUTE_CHECK("Mute Background", EDJE_CHANNEL_BACKGROUND, mute_background_change);
+ MUTE_CHECK("Mute Music", EDJE_CHANNEL_MUSIC, mute_music_change);
+ MUTE_CHECK("Mute Foreground", EDJE_CHANNEL_FOREGROUND, mute_foreground_change);
+ MUTE_CHECK("Mute Interface", EDJE_CHANNEL_INTERFACE, mute_interface_change);
+ MUTE_CHECK("Mute Input", EDJE_CHANNEL_INPUT, mute_input_change);
+ MUTE_CHECK("Mute Alert", EDJE_CHANNEL_ALERT, mute_alert_change);
+ MUTE_CHECK("Mute Everything", EDJE_CHANNEL_ALL, mute_all_change);
+
+ evas_object_data_set(win, "audio", bx);
+
+ elm_naviframe_item_simple_push(naviframe, bx);
+}
+
+static void
+_config_focus_highlight_enabled_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool cf = elm_config_focus_highlight_enabled_get();
+ Eina_Bool val = elm_check_state_get(obj);
+
+ printf("%d %d\n", cf, val);
+ if (cf == val) return;
+ elm_config_focus_highlight_enabled_set(val);
+ elm_config_all_flush();
+}
+
+static void
+_config_focus_highlight_anim_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool cf = elm_config_focus_highlight_animate_get();
+ Eina_Bool val = elm_check_state_get(obj);
+
+ if (cf == val) return;
+ elm_config_focus_highlight_animate_set(val);
+ elm_config_all_flush();
+}
+
+static void
+_config_focus_highlight_clip_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool cf = elm_config_focus_highlight_clip_disabled_get();
+ Eina_Bool val = elm_check_state_get(obj);
+
+ if (cf == val) return;
+ elm_config_focus_highlight_clip_disabled_set(val);
+ elm_config_all_flush();
+}
+
+static void
+_config_focus_item_select_on_focus_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool cf = elm_config_item_select_on_focus_disabled_get();
+ Eina_Bool val = elm_check_state_get(obj);
+
+ if (cf == val) return;
+ elm_config_item_select_on_focus_disabled_set(val);
+ elm_config_all_flush();
+}
+
+static void
+_status_config_focus_autoscroll_changed_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_focus_autoscroll_mode_set(elm_radio_value_get(obj));
+}
+
+static void
+_config_focus_auto_show_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool cf = elm_config_window_auto_focus_enable_get();
+ Eina_Bool val = elm_check_state_get(obj);
+
+ if (cf == val) return;
+ elm_config_window_auto_focus_enable_set(val);
+ elm_config_all_flush();
+}
+
+static void
+_config_focus_auto_animate_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool cf = elm_config_window_auto_focus_animate_get();
+ Eina_Bool val = elm_check_state_get(obj);
+
+ if (cf == val) return;
+ elm_config_window_auto_focus_animate_set(val);
+ elm_config_all_flush();
+}
+
+static void
+_status_config_focus(Evas_Object *win,
+ Evas_Object *naviframe)
+{
+ Evas_Object *bx, *ck, *fr;
+
+ bx = elm_box_add(win);
+
+ CHECK_ADD("Enable Focus Highlight (only new window)",
+ "Set whether enable/disable focus highlight.<br/>"
+ "This feature is disabled by default.",
+ _config_focus_highlight_enabled_cb, NULL);
+ elm_check_state_set(ck, elm_config_focus_highlight_enabled_get());
+
+ CHECK_ADD("Enable Focus Highlight Animation (only new window)",
+ "Set whether enable/disable focus highlight animation.<br/>"
+ "This feature is disabled by default",
+ _config_focus_highlight_anim_cb, NULL);
+ elm_check_state_set(ck, elm_config_focus_highlight_animate_get());
+
+ CHECK_ADD("Disable Focus Highlight clip",
+ "Set whether enable/disable focus highlight clip feature.<br/>"
+ "If the focus highlight clip is disabled,<br/>"
+ "focus highlight object would not be clipped"
+ "by the target object's parent",
+ _config_focus_highlight_clip_cb, NULL);
+ elm_check_state_set(ck, elm_config_focus_highlight_clip_disabled_get());
+
+ CHECK_ADD("Disable Item Select on Focus",
+ "Set whether item would be selected on item focus.<br/>"
+ "This is enabled by default.",
+ _config_focus_item_select_on_focus_cb, NULL);
+ elm_check_state_set(ck, elm_config_item_select_on_focus_disabled_get());
+
+ CHECK_ADD("Enable Automatic focus display",
+ "Set whether enable/disable focus highlight automatically.",
+ _config_focus_auto_show_cb, NULL);
+ elm_check_state_set(ck, elm_config_window_auto_focus_enable_get());
+ CHECK_ADD("Enable Automatic focus animation",
+ "Set whether enable/disable focus highlight animation<br/>"
+ "automatically when automatic focus shows.",
+ _config_focus_auto_animate_cb, NULL);
+ elm_check_state_set(ck, elm_config_window_auto_focus_enable_get());
+
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Focus Autoscroll Mode");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+ {
+ Evas_Object *bx2, *rdg, *rd;
+ bx2 = elm_box_add(fr);
+ elm_object_content_set(fr, bx2);
+ evas_object_show(bx2);
+
+ rdg = rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_SHOW);
+ elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_SHOW");
+ elm_object_tooltip_text_set(rd, "Directly show the focused region<br/>"
+ "or item automatically inside a scroller.");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed",
+ _status_config_focus_autoscroll_changed_cb,
+ NULL);
+
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_NONE);
+ elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_NONE");
+ elm_object_tooltip_text_set(rd, "Do not show the focused region or<br/>"
+ "item automatically inside a scroller.");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, rd);
+ elm_radio_group_add(rd, rdg);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed",
+ _status_config_focus_autoscroll_changed_cb,
+ NULL);
+
+
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN);
+ elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN");
+ elm_object_tooltip_text_set(rd, "Bring in the focused region or item<br/>"
+ "automatically which might invole the scrolling.");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, rd);
+ elm_radio_group_add(rd, rdg);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed",
+ _status_config_focus_autoscroll_changed_cb,
+ NULL);
+
+ elm_radio_value_set(rdg, elm_config_focus_autoscroll_mode_get());
+ }
+
+ evas_object_data_set(win, "focus", bx);
+
+ elm_naviframe_item_simple_push(naviframe, bx);
+}
+
+static void
+_status_config_etc(Evas_Object *win,
+ Evas_Object *naviframe)
+{
+ Evas_Object *bx, *ck, *sl, *fr, *bx2, *fr2, *bx3, *en;
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5);
+
+ // access
+ CHECK_ADD("Enable Access Mode", "Set access mode", ac_change, NULL);
+ elm_check_state_set(ck, elm_config_access_get());
+
+ // selection
+ CHECK_ADD("Enable clear selection when unfocus", "Set selection mode",
+ sel_change, NULL);
+ elm_check_state_set(ck, elm_config_selection_unfocused_clear_get());
+
+ // clouseau
+ CHECK_ADD("Enable clouseau", "Set clouseau mode", dbg_change, NULL);
+ elm_check_state_set(ck, elm_config_clouseau_enabled_get());
+
+ // atspi
+ CHECK_ADD("Enable ATSPI support", "Set atspi mode", atspi_change, NULL);
+ elm_check_state_set(ck, elm_config_atspi_mode_get());
+
+ // transition duration in edje
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Edje Transition Duration Factor");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx2 = elm_box_add(fr);
+ elm_object_content_set(fr, bx2);
+ evas_object_show(bx2);
+
+ sl = elm_slider_add(bx2);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.1f");
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_min_max_set(sl, 0, 20.0);
+ elm_slider_value_set(sl, elm_config_transition_duration_factor_get());
+ elm_box_pack_end(bx2, sl);
+ evas_object_show(sl);
+ evas_object_smart_callback_add(sl, "changed", sc_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", transition_duration_change, NULL);
+
+ // Web backend
+ fr2 = elm_frame_add(bx);
+ elm_object_text_set(fr2, "Elm_Web backend");
+ evas_object_size_hint_weight_set(fr2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr2, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, fr2);
+ evas_object_show(fr2);
+
+ bx3 = elm_box_add(fr2);
+ elm_object_content_set(fr2, bx3);
+ evas_object_show(bx3);
+
+ en = elm_entry_add(win);
+ elm_entry_editable_set(en, EINA_TRUE);
+ elm_entry_scrollable_set(en, EINA_FALSE);
+ elm_object_text_set(en, elm_config_web_backend_get());
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(en);
+ elm_box_pack_end(bx3, en);
+
+ web_backend_entry = en;
+
+ evas_object_data_set(win, "etc", bx);
+
+ elm_naviframe_item_simple_push(naviframe, bx);
+}
+
+static Evas_Object *
+_sample_theme_new(Evas_Object *win)
+{
+ Evas_Object *base, *bg, *bt, *ck, *rd, *rdg, *sl, *fr, *li, *rc, *sp;
+
+ base = elm_table_add(win);
+ evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(base, bg, 0, 0, 2, 5);
+ evas_object_show(bg);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_object_text_set(bt, "Button");
+ elm_table_pack(base, bt, 0, 0, 1, 1);
+ evas_object_show(bt);
+
+ ck = elm_check_add(win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ elm_object_text_set(ck, "Check");
+ elm_table_pack(base, ck, 0, 1, 1, 1);
+ evas_object_show(ck);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ elm_radio_state_value_set(rd, 0);
+ elm_object_text_set(rd, "Radio 1");
+ elm_table_pack(base, rd, 1, 0, 1, 1);
+ evas_object_show(rd);
+ rdg = rd;
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ elm_radio_state_value_set(rd, 1);
+ elm_object_text_set(rd, "Radio 2");
+ elm_radio_group_add(rd, rdg);
+ elm_table_pack(base, rd, 1, 1, 1, 1);
+ evas_object_show(rd);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_table_pack(base, sp, 0, 2, 2, 1);
+ evas_object_show(sp);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "Slider");
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_min_max_set(sl, 1, 10);
+ elm_slider_value_set(sl, 4);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(base, sl, 0, 3, 2, 1);
+ evas_object_show(sl);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Frame");
+ elm_table_pack(base, fr, 0, 4, 2, 1);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(fr);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(fr, li);
+ evas_object_show(li);
+
+ elm_list_item_append(li, "List Item 1", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Second Item", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Third Item", NULL, NULL, NULL, NULL);
+ elm_list_go(li);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(rc, 160, 120);
+ elm_table_pack(base, rc, 0, 4, 2, 1);
+
+ return base;
+}
+
+static void
+_status_config_themes(Evas_Object *win,
+ Evas_Object *naviframe)
+{
+ Evas_Object *tb, *rc, *sc, *sp, *li, *pd, *fr, *bt, *sample;
+ Eina_List *list, *l;
+ char *th, *s, *ext;
+ Elm_Theme *d;
+ Elm_Object_Item *list_it, *def_it = NULL;
+ const char *theme_name, *sep[20];
+ unsigned int x;
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(rc, 0, 130);
+ elm_table_pack(tb, rc, 0, 0, 1, 1);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(rc, 0, 200);
+ elm_table_pack(tb, rc, 0, 1, 1, 1);
+
+ /////////////////////////////////////////////
+
+ pd = elm_frame_add(win);
+ elm_object_style_set(pd, "pad_medium");
+ evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(pd, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, pd, 0, 0, 1, 1);
+ evas_object_show(pd);
+
+ li = elm_list_add(win);
+ elm_list_multi_select_set(li, EINA_TRUE);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(pd, li);
+ evas_object_show(li);
+
+ list = elm_theme_name_available_list_new();
+ d = elm_theme_default_get();
+ theme_name = elm_theme_get(d);
+ for (x = 1, sep[0] = theme_name; x < sizeof(sep) / sizeof(sep[0]); x++)
+ {
+ sep[x] = strchr(sep[x - 1] + 1, ':');
+ if (!sep[x]) break;
+ }
+ EINA_LIST_FOREACH(list, l, th)
+ {
+ Theme *t;
+ int y;
+
+ t = calloc(1, sizeof(Theme));
+ t->name = eina_stringshare_add(th);
+ s = elm_theme_list_item_path_get(th, &(t->in_search_path));
+ if (s)
+ {
+ t->path = eina_stringshare_add(s);
+ free(s);
+ }
+ if (t->in_search_path)
+ {
+ s = strdup(th);
+ if (s)
+ {
+ s[0] = toupper(s[0]);
+ t->label = eina_stringshare_add(s);
+ free(s);
+ }
+ else
+ t->label = eina_stringshare_add(s);
+ }
+ else
+ {
+ s = strdup(ecore_file_file_get(th));
+ if (s)
+ {
+ s[0] = toupper(s[0]);
+ ext = strrchr(s, '.');
+ if (ext) *ext = 0;
+ t->label = eina_stringshare_add(s);
+ free(s);
+ }
+ else
+ t->label = eina_stringshare_add(s);
+ }
+ themes = eina_list_append(themes, t);
+ list_it = elm_list_item_append(li, t->label, NULL, NULL, NULL, t);
+ if (!strcmp(t->name, "default")) def_it = list_it;
+ for (y = x - 1 /* ignore default e theme */; y > 0; y--)
+ {
+ const char *start = (sep[y - 1][0] == ':') ? sep[y - 1] + 1 : sep[y - 1];
+ unsigned int len = (unsigned int)(sep[y] - start);
+ if (strncmp(start , t->name, len) || (strlen(t->name) != len)) continue;
+
+ if (!elm_list_item_selected_get(list_it))
+ elm_list_item_selected_set(list_it, EINA_TRUE);
+ break;
+ }
+ }
+ if (!elm_list_selected_items_get(li))
+ elm_list_item_selected_set(def_it, EINA_TRUE);
+ evas_object_smart_callback_add(li, "selected", _theme_sel, NULL);
+ evas_object_smart_callback_add(li, "unselected", _theme_sel, NULL);
+ elm_theme_name_available_list_free(list);
+
+ elm_list_go(li);
+
+ pd = elm_frame_add(win);
+ elm_object_style_set(pd, "pad_medium");
+ evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(pd, 0.9, 0.9);
+ elm_table_pack(tb, pd, 0, 0, 1, 1);
+ evas_object_show(pd);
+
+ /* FIXME: not implemented yet
+ bt = elm_button_add(win);
+ evas_object_smart_callback_add(bt, "clicked", _theme_browse, win);
+ elm_object_text_set(bt, "Browse...");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.9);
+ elm_object_content_set(pd, bt);
+ evas_object_show(bt);
+ */
+ pd = elm_frame_add(win);
+ elm_object_style_set(pd, "pad_medium");
+ evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pd, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, pd, 0, 1, 1, 1);
+ evas_object_show(pd);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Preview");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(pd, fr);
+ evas_object_show(fr);
+
+ sc = elm_scroller_add(win);
+ elm_scroller_bounce_set(sc, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(fr, sc);
+ evas_object_show(sc);
+
+ sample = _sample_theme_new(win);
+ elm_object_content_set(sc, sample);
+ evas_object_show(sample);
+ evas_object_data_set(win, "theme_preview", sample);
+
+ /////////////////////////////////////////////
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_table_pack(tb, sp, 0, 2, 1, 1);
+ evas_object_show(sp);
+
+ pd = elm_frame_add(win);
+ elm_object_style_set(pd, "pad_medium");
+ evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pd, 0.5, 0.5);
+ elm_table_pack(tb, pd, 0, 3, 1, 1);
+ evas_object_show(pd);
+
+ bt = elm_button_add(win);
+ evas_object_smart_callback_add(bt, "clicked", _theme_use, win);
+ elm_object_text_set(bt, "Use Theme");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, 0.5, 0.5);
+ elm_object_content_set(pd, bt);
+ evas_object_show(bt);
+
+ evas_object_data_set(win, "themes", tb);
+ elm_naviframe_item_simple_push(naviframe, tb);
+}
+
+static void
+_font_preview_update(Evas_Object *win)
+{
+ Evas_Font_Size sz;
+ char *name;
+
+ if (!fndata.cur_font)
+ return;
+
+ name = elm_font_fontconfig_name_get(fndata.cur_font, fndata.cur_style);
+ sz = fndata.cur_size;
+
+ if (sz < 0)
+ sz = (-sz * 10) / 100;
+ if (sz == 0)
+ sz = 10;
+
+ edje_object_text_class_set(evas_object_data_get(win, "font_preview"),
+ "font_preview", name, sz);
+
+ elm_font_fontconfig_name_free(name);
+}
+
+static void
+_font_classes_list_sel(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info)
+{
+ const Eina_List *f_names_items, *l;
+ Elm_Text_Class_Data *tc_data;
+ Evas_Object *f_names_list;
+ Elm_Object_Item *list_it;
+
+ tc_data = elm_object_item_data_get(event_info);
+ if (!tc_data) return;
+
+ f_names_list = evas_object_data_get(elm_object_top_widget_get(obj),
+ "font_names_list");
+ ELM_LIST_ENABLE(f_names_list);
+
+ f_names_items = elm_list_items_get(f_names_list);
+
+ EINA_LIST_FOREACH(f_names_items, l, list_it)
+ {
+ const char *s;
+
+ s = elm_object_item_text_get(list_it);
+ if (!s) continue;
+
+ if (tc_data->font && !strcmp(s, tc_data->font))
+ {
+ elm_list_item_selected_set(list_it, EINA_TRUE);
+ elm_list_item_show(list_it);
+ break;
+ }
+ }
+}
+
+static void
+_font_names_list_sel(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Evas_Object *style_list, *cls_list, *win;
+ const char *style, *sel_font;
+ Elm_Text_Class_Data *tc_data;
+ Elm_Object_Item *list_it, *fc_list_it;
+ Elm_Font_Properties *efp;
+ const Eina_List *l;
+
+ list_it = event_info;
+ sel_font = elm_object_item_text_get(list_it);
+
+ win = elm_object_top_widget_get(obj);
+ style_list = evas_object_data_get(win, "font_styles_list");
+ cls_list = evas_object_data_get(win, "font_classes_list");
+
+ fc_list_it = elm_list_selected_item_get(cls_list);
+ if (!fc_list_it) return; /* should not happen, fonts list disabled in
+ * this case */
+
+ eina_stringshare_replace(&fndata.cur_font, sel_font);
+
+ tc_data = elm_object_item_data_get(fc_list_it);
+ if (!tc_data) return;
+ if (tc_data->font) eina_stringshare_del(tc_data->font);
+ if (fndata.cur_font) tc_data->font = eina_stringshare_ref(fndata.cur_font);
+
+ /* load styles list */
+ efp = eina_hash_find(fndata.font_hash, sel_font);
+ if (!efp) return;
+
+ ELM_LIST_ENABLE(style_list);
+ elm_list_clear(style_list);
+
+ evas_event_freeze(evas_object_evas_get(style_list));
+ edje_freeze();
+
+ list_it = NULL;
+
+ EINA_LIST_FOREACH(efp->styles, l, style)
+ {
+ Elm_Object_Item *i;
+
+ i = elm_list_item_append(style_list, style, NULL, NULL,
+ _font_styles_list_sel, NULL);
+
+ if (tc_data->style && (!strcmp(style, tc_data->style)))
+ list_it = i;
+ }
+
+ elm_list_go(style_list);
+
+ edje_thaw();
+ evas_event_thaw(evas_object_evas_get(style_list));
+
+ if (list_it)
+ elm_list_item_selected_set(list_it, EINA_TRUE);
+
+ _font_preview_update(win);
+}
+
+static void
+_font_styles_list_sel(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Evas_Object *fc_list, *fs_list, *win;
+ Elm_Text_Class_Data *tc_data;
+ const Eina_List *l;
+ Elm_Object_Item *list_it;
+
+ win = elm_object_top_widget_get(obj);
+ fc_list = evas_object_data_get(win, "font_classes_list");
+ fs_list = evas_object_data_get(win, "font_sizes_list");
+
+ list_it = elm_list_selected_item_get(fc_list);
+ if (!list_it) return; /* should not happen */
+
+ eina_stringshare_replace(&fndata.cur_style,
+ elm_object_item_text_get(event_info));
+ ELM_LIST_ENABLE(fs_list);
+
+ tc_data = elm_object_item_data_get(list_it);
+ if (!tc_data) return;
+ eina_stringshare_del(tc_data->style);
+ tc_data->style = eina_stringshare_ref(fndata.cur_style);
+
+ evas_event_freeze(evas_object_evas_get(fs_list));
+ edje_freeze();
+
+ EINA_LIST_FOREACH(elm_list_items_get(fs_list), l, list_it)
+ {
+ Elm_Font_Size_Data *sdata;
+
+ sdata = elm_object_item_data_get(list_it);
+ if (!sdata) continue;
+ elm_list_item_selected_set(l->data, EINA_FALSE);
+
+ if (tc_data->size == sdata->size)
+ {
+ elm_list_item_selected_set(list_it, EINA_TRUE);
+ elm_list_item_show(list_it);
+ break;
+ }
+ }
+
+ edje_thaw();
+ evas_event_thaw(evas_object_evas_get(fs_list));
+
+ _font_preview_update(win);
+}
+
+static void
+_font_sizes_list_sel(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Text_Class_Data *tc_data;
+ Evas_Object *fc_list, *win;
+ Elm_Font_Size_Data *sd;
+ Elm_Object_Item *list_it;
+
+ win = elm_object_top_widget_get(obj);
+ fc_list = evas_object_data_get(win, "font_classes_list");
+
+ list_it = elm_list_selected_item_get(fc_list);
+ if (!list_it) return; /* should not happen */
+ sd = elm_object_item_data_get(event_info);
+ if (!sd) return;
+
+ fndata.cur_size = sd->size;
+
+ tc_data = elm_object_item_data_get(list_it);
+ if (!tc_data) return;
+ tc_data->size = fndata.cur_size;
+
+ _font_preview_update(win);
+}
+
+static void
+_fstyle_list_unselect_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *sizes_list, *win;
+
+ if (elm_list_selected_item_get(obj)) return;
+
+ win = elm_object_top_widget_get(obj);
+
+ sizes_list = evas_object_data_get(win, "font_sizes_list");
+ ELM_LIST_DISABLE(sizes_list);
+}
+
+static void
+_fc_list_unselect_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *font_names_list, *styles_list, *sizes_list, *win;
+
+ if (elm_list_selected_item_get(obj)) return;
+
+ win = elm_object_top_widget_get(obj);
+
+ font_names_list = evas_object_data_get(win, "font_names_list");
+ ELM_LIST_DISABLE(font_names_list);
+
+ styles_list = evas_object_data_get(win, "font_styles_list");
+ ELM_LIST_DISABLE(styles_list);
+
+ sizes_list = evas_object_data_get(win, "font_sizes_list");
+ ELM_LIST_DISABLE(sizes_list);
+}
+
+static void
+_font_classes_list_load(Evas_Object *li)
+{
+ Elm_Text_Class_Data *tc_data;
+ Eina_List *l;
+ Evas *evas;
+
+ evas = evas_object_evas_get(li);
+ evas_event_freeze(evas);
+ edje_freeze();
+
+ EINA_LIST_FOREACH(fndata.text_classes, l, tc_data)
+ elm_list_item_append(li, tc_data->desc, NULL, NULL,
+ _font_classes_list_sel, tc_data);
+
+ evas_object_smart_callback_add(li, "unselected", _fc_list_unselect_cb,
+ NULL);
+
+ elm_list_go(li);
+ edje_thaw();
+ evas_event_thaw(evas);
+}
+
+static void
+_fonts_data_fill(Evas *evas)
+{
+ const Eina_List *fo_list, *l;
+ Eina_List *text_classes;
+ Elm_Text_Class_Data *tc_data;
+ Elm_Font_Size_Data *sd;
+ Elm_Font_Overlay *efo;
+ Eina_List *evas_fonts;
+ Elm_Text_Class *etc;
+ int i;
+
+ evas_fonts = evas_font_available_list(evas);
+ fndata.font_hash = elm_font_available_hash_add(evas_fonts);
+ evas_font_available_list_free(evas, evas_fonts);
+
+ text_classes = elm_config_text_classes_list_get();
+ fo_list = elm_config_font_overlay_list_get();
+
+ EINA_LIST_FOREACH(text_classes, l, etc)
+ {
+ const Eina_List *ll;
+
+ tc_data = calloc(1, sizeof(*tc_data));
+ if (!tc_data) continue;
+
+ tc_data->name = eina_stringshare_add(etc->name);
+ tc_data->desc = eina_stringshare_add(etc->desc);
+
+ EINA_LIST_FOREACH(fo_list, ll, efo)
+ {
+ if (strcmp(tc_data->name, efo->text_class))
+ continue;
+
+ if (efo->font)
+ {
+ Elm_Font_Properties *efp;
+
+ efp = elm_font_properties_get(efo->font);
+ if (efp)
+ {
+ tc_data->font = eina_stringshare_add(efp->name);
+ /* we're sure we recorded with only 1 style selected */
+ tc_data->style = eina_stringshare_add(efp->styles->data);
+ elm_font_properties_free(efp);
+ }
+ }
+ tc_data->size = efo->size;
+ }
+
+ fndata.text_classes = eina_list_append(fndata.text_classes, tc_data);
+ }
+
+ elm_config_text_classes_list_free(text_classes);
+
+ /* FIXME: hinting later */
+ /* fndata.hinting = e_config->font_hinting; */
+
+ sd = calloc(1, sizeof(Elm_Font_Size_Data));
+ sd->size_str = eina_stringshare_add("Tiny");
+ sd->size = -50;
+ fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd);
+
+ sd = calloc(1, sizeof(Elm_Font_Size_Data));
+ sd->size_str = eina_stringshare_add("Small");
+ sd->size = -80;
+ fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd);
+
+ sd = calloc(1, sizeof(Elm_Font_Size_Data));
+ sd->size_str = eina_stringshare_add("Normal");
+ sd->size = -100;
+ fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd);
+
+ sd = calloc(1, sizeof(Elm_Font_Size_Data));
+ sd->size_str = eina_stringshare_add("Big");
+ sd->size = -150;
+ fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd);
+
+ sd = calloc(1, sizeof(Elm_Font_Size_Data));
+ sd->size_str = eina_stringshare_add("Really Big");
+ sd->size = -190;
+ fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd);
+
+ sd = calloc(1, sizeof(Elm_Font_Size_Data));
+ sd->size_str = eina_stringshare_add("Huge");
+ sd->size = -250;
+ fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd);
+
+ for (i = 5; i < 51; i++)
+ {
+ char str[16];
+
+ str[0] = 0;
+ snprintf(str, sizeof(str), "%d pixels", i);
+
+ sd = calloc(1, sizeof(Elm_Font_Size_Data));
+ sd->size_str = eina_stringshare_add(str);
+ sd->size = i;
+ fndata.font_px_list = eina_list_append(fndata.font_px_list, sd);
+ }
+}
+
+static int
+_font_sort_cb(const void *data1,
+ const void *data2)
+{
+ if (!data1) return 1;
+ if (!data2) return -1;
+ return strcmp(data1, data2);
+}
+
+static void
+_font_sizes_list_load(Evas_Object *size_list)
+{
+ Elm_Font_Size_Data *size_data;
+ Eina_List *l;
+ Evas *evas;
+
+ evas = evas_object_evas_get(size_list);
+ evas_event_freeze(evas);
+ edje_freeze();
+
+ EINA_LIST_FOREACH(fndata.font_scale_list, l, size_data)
+ elm_list_item_append(size_list, size_data->size_str, NULL, NULL,
+ _font_sizes_list_sel, size_data);
+
+ EINA_LIST_FOREACH(fndata.font_px_list, l, size_data)
+ elm_list_item_append(size_list, size_data->size_str, NULL, NULL,
+ _font_sizes_list_sel, size_data);
+
+ elm_list_go(size_list);
+ edje_thaw();
+ evas_event_thaw(evas);
+}
+
+static void
+_fnames_list_unselect_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *styles_list, *sizes_list, *win;
+
+ if (elm_list_selected_item_get(obj)) return;
+
+ win = elm_object_top_widget_get(obj);
+
+ styles_list = evas_object_data_get(win, "font_styles_list");
+ ELM_LIST_DISABLE(styles_list);
+
+ sizes_list = evas_object_data_get(win, "font_sizes_list");
+ ELM_LIST_DISABLE(sizes_list);
+}
+
+static Eina_Bool
+_font_list_fill(const Eina_Hash *hash EINA_UNUSED,
+ const void *key EINA_UNUSED,
+ void *data,
+ void *fdata)
+{
+ Elm_Font_Properties *efp;
+ Eina_List **flist;
+
+ flist = fdata;
+ efp = data;
+
+ *flist = eina_list_append(*flist, efp->name);
+
+ return EINA_TRUE;
+}
+
+static void
+_font_names_list_load(Evas_Object *flist)
+{
+ Eina_List *l, *names_list = NULL;
+ const char *font;
+ Evas *evas;
+
+ evas = evas_object_evas_get(flist);
+ evas_event_freeze(evas);
+ edje_freeze();
+
+ eina_hash_foreach(fndata.font_hash, _font_list_fill, &names_list);
+ names_list = eina_list_sort(names_list, eina_list_count(names_list),
+ _font_sort_cb);
+
+ EINA_LIST_FOREACH(names_list, l, font)
+ elm_list_item_append(flist, font, NULL, NULL, _font_names_list_sel, NULL);
+
+ eina_list_free(names_list);
+
+ evas_object_smart_callback_add(flist, "unselected",
+ _fnames_list_unselect_cb, NULL);
+
+ elm_list_go(flist);
+
+ edje_thaw();
+ evas_event_thaw(evas);
+}
+
+static void
+_status_config_fonts(Evas_Object *win,
+ Evas_Object *naviframe)
+{
+ Evas_Object *base, *fr, *li, *rc, *preview, *sp, *pd, *bt, *bx;
+ char buf[PATH_MAX];
+
+ _fonts_data_fill(evas_object_evas_get(win));
+
+ base = elm_table_add(win);
+ evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ /* yeah, dummy rectangles are ugly as hell, but no good way yet of
+ fixing sizes */
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(rc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_min_set(rc, 70, 170);
+ elm_table_pack(base, rc, 1, 0, 1, 1);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Font Class");
+ elm_table_pack(base, fr, 0, 0, 1, 2);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(fr);
+
+ /* FIXME: no multiselection for this list, for now */
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(fr, li);
+ evas_object_show(li);
+
+ evas_object_data_set(win, "font_classes_list", li);
+ _font_classes_list_load(li);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Font");
+ elm_table_pack(base, fr, 1, 0, 1, 2);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(fr);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(fr, li);
+ evas_object_show(li);
+
+ evas_object_data_set(win, "font_names_list", li);
+ _font_names_list_load(li);
+ ELM_LIST_DISABLE(li);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(rc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_min_set(rc, 70, 130);
+ elm_table_pack(base, rc, 1, 2, 1, 1);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Style");
+ elm_table_pack(base, fr, 0, 2, 1, 1);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(fr);
+ ELM_LIST_DISABLE(li);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(fr, li);
+ evas_object_show(li);
+
+ evas_object_data_set(win, "font_styles_list", li);
+ evas_object_smart_callback_add(li, "unselected", _fstyle_list_unselect_cb,
+ NULL);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Size");
+ elm_table_pack(base, fr, 1, 2, 1, 1);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(fr);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(fr, li);
+ evas_object_show(li);
+
+ evas_object_data_set(win, "font_sizes_list", li);
+ _font_sizes_list_load(li);
+ ELM_LIST_DISABLE(li);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(base, bx, 0, 3, 2, 1);
+ evas_object_show(bx);
+
+ /* FIXME: what to do here? dedicated widget? some new entry API set? */
+ snprintf(buf, sizeof(buf), "%s/objects/font_preview.edj", elm_app_data_dir_get());
+ preview = elm_layout_add(win);
+ elm_layout_file_set(preview, buf, "font_preview");
+ elm_object_part_text_set(preview, "elm.text", "Preview Text — 我真的会写中文");
+ evas_object_size_hint_weight_set(preview, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(preview, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(preview);
+
+ elm_box_pack_end(bx, preview);
+ evas_object_data_set(win, "font_preview", elm_layout_edje_get(preview));
+
+ /////////////////////////////////////////////
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_table_pack(base, sp, 0, 4, 2, 1);
+ evas_object_show(sp);
+
+ pd = elm_frame_add(win);
+ elm_object_style_set(pd, "pad_medium");
+ evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pd, 0.5, 0.5);
+ elm_table_pack(base, pd, 0, 5, 2, 1);
+ evas_object_show(pd);
+
+ bx = elm_box_add(win);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ evas_object_smart_callback_add(bt, "clicked", _font_overlay_set_all, win);
+ elm_object_text_set(bt, "Set to All");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, 0.5, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_smart_callback_add(bt, "clicked", _font_overlay_reset, win);
+ elm_object_text_set(bt, "Reset");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, 0.5, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_smart_callback_add(bt, "clicked", _font_overlay_reset_all, win);
+ elm_object_text_set(bt, "Reset All");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, 0.5, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_smart_callback_add(bt, "clicked", _font_overlay_change, win);
+ elm_object_text_set(bt, "Apply");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, 0.5, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ elm_object_content_set(pd, bx);
+
+ evas_object_data_set(win, "fonts", base);
+
+ elm_naviframe_item_simple_push(naviframe, base);
+}
+
+static void
+_profiles_list_item_del_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+static void
+_profiles_list_selected_cb(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ const char *cur_profile = NULL;
+ const char *sel_profile, *pdir;
+ const char *prof_name;
+ char buf[PATH_MAX];
+ Evas_Object *en;
+#ifdef ELM_EFREET
+ Efreet_Desktop *desk = NULL;
+#endif
+
+ sel_profile = data;
+ if (!sel_profile)
+ return;
+
+ cur_profile = elm_config_profile_get();
+
+ pdir = elm_config_profile_dir_get(sel_profile, EINA_TRUE);
+ if (!pdir) pdir = elm_config_profile_dir_get(sel_profile, EINA_FALSE);
+#ifdef ELM_EFREET
+ snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir);
+ desk = efreet_desktop_new(buf);
+ if ((desk) && (desk->name)) prof_name = desk->name;
+ else
+ {
+ if (desk) efreet_desktop_free(desk);
+ if (pdir) elm_config_profile_dir_free(pdir);
+
+ pdir = elm_config_profile_dir_get(sel_profile, EINA_FALSE);
+ snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir);
+ desk = efreet_desktop_new(buf);
+ if ((desk) && (desk->name)) prof_name = desk->name;
+ else prof_name = cur_profile;
+ }
+#endif
+
+ if (!pdir)
+ elm_object_disabled_set(evas_object_data_get(obj, "prof_reset_btn"),
+ EINA_TRUE);
+ else
+ {
+ elm_object_disabled_set(evas_object_data_get(obj, "prof_del_btn"),
+ EINA_TRUE);
+ elm_object_disabled_set(evas_object_data_get(obj, "prof_reset_btn"),
+ EINA_FALSE);
+ elm_object_disabled_set(evas_object_data_get(obj, "prof_use_btn"),
+ EINA_FALSE);
+ elm_config_profile_dir_free(pdir);
+ }
+
+ snprintf(buf, sizeof(buf), "<hilight>Selected profile: %s</><br/>",
+ prof_name);
+ elm_object_text_set(evas_object_data_get(obj, "prof_name_lbl"), buf);
+
+ en = evas_object_data_get(obj, "prof_desc_entry");
+#ifdef ELM_EFREET
+ if (desk) elm_object_text_set(en, desk->comment);
+ else
+#endif
+ elm_object_text_set(en, "Unknown");
+
+#ifdef ELM_EFREET
+ if (desk) efreet_desktop_free(desk);
+#endif
+}
+
+static void
+_profiles_list_fill(Evas_Object *l_widget,
+ Eina_List *p_names)
+{
+ const char *cur_profile = NULL;
+ const char *profile;
+ void *sel_it = NULL;
+ Eina_List *l;
+
+ if (!p_names)
+ return;
+
+ elm_list_clear(l_widget);
+
+ cur_profile = elm_config_profile_get();
+
+ EINA_LIST_FOREACH(p_names, l, profile)
+ {
+#ifdef ELM_EFREET
+ Efreet_Desktop *desk = NULL;
+#endif
+ const char *label, *ext, *pdir;
+ char buf[PATH_MAX];
+ Elm_Object_Item *list_it;
+ Evas_Object *ic;
+
+ pdir = elm_config_profile_dir_get(profile, EINA_TRUE);
+ if (!pdir) pdir = elm_config_profile_dir_get(profile, EINA_FALSE);
+
+#ifdef ELM_EFREET
+ snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir);
+ desk = efreet_desktop_new(buf);
+ if ((desk) && (desk->name)) label = desk->name;
+ else
+ {
+ if (desk) efreet_desktop_free(desk);
+ if (pdir) elm_config_profile_dir_free(pdir);
+
+ pdir = elm_config_profile_dir_get(profile, EINA_FALSE);
+ snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir);
+ desk = efreet_desktop_new(buf);
+ if ((desk) && (desk->name)) label = desk->name;
+ else label = profile;
+ }
+#endif
+
+ buf[0] = 0;
+ if (pdir) snprintf(buf, sizeof(buf), "%s/icon.edj", pdir);
+#ifdef ELM_EFREET
+ if ((desk) && (desk->icon) && (pdir))
+ snprintf(buf, sizeof(buf), "%s/%s", pdir, desk->icon);
+#endif
+ ic = elm_icon_add(l_widget);
+ ext = strrchr(buf, '.');
+ if (ext)
+ {
+ if (!strcmp(ext, ".edj")) elm_image_file_set(ic, buf, "icon");
+ else elm_image_file_set(ic, buf, NULL);
+ }
+
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL,
+ 1, 1);
+ evas_object_show(ic);
+
+ list_it = elm_list_item_append(l_widget, label, ic, NULL,
+ _profiles_list_selected_cb,
+ strdup(profile));
+ elm_object_item_del_cb_set(list_it, _profiles_list_item_del_cb);
+ if (cur_profile && !strcmp(profile, cur_profile))
+ sel_it = list_it;
+
+ elm_config_profile_dir_free(pdir);
+
+#ifdef ELM_EFREET
+ if (desk) efreet_desktop_free(desk);
+#endif
+ }
+
+ if (sel_it) elm_list_item_selected_set(sel_it, EINA_TRUE);
+ elm_list_go(l_widget);
+}
+
+static void
+_profiles_list_unselect_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ if (elm_list_selected_item_get(obj)) return;
+ elm_object_disabled_set(evas_object_data_get(obj, "prof_del_btn"),
+ EINA_TRUE);
+ elm_object_disabled_set(evas_object_data_get(obj, "prof_reset_btn"),
+ EINA_TRUE);
+ elm_object_disabled_set(evas_object_data_get(obj, "prof_use_btn"),
+ EINA_TRUE);
+}
+
+static void
+_status_config_profiles(Evas_Object *win,
+ Evas_Object *naviframe)
+{
+ Evas_Object *li, *bx, *fr_bx1, *fr_bx2, *btn_bx, *fr, *lb, *en, *sp, *pd,
+ *bt;
+ Eina_List *profs;
+ Evas *evas;
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ fr_bx1 = elm_box_add(win);
+ evas_object_size_hint_weight_set(fr_bx1, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr_bx1, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_homogeneous_set(fr_bx1, EINA_TRUE);
+ evas_object_show(fr_bx1);
+
+ fr_bx2 = elm_box_add(win);
+ evas_object_size_hint_weight_set(fr_bx2, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr_bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(fr_bx2);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Available Profiles");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(fr, fr_bx1);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(li, "unselected", _profiles_list_unselect_cb,
+ NULL);
+
+ profs = elm_config_profile_list_get();
+
+ evas_object_show(li);
+ elm_box_pack_end(fr_bx2, li);
+
+ lb = elm_label_add(win);
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.5);
+
+ evas_object_show(lb);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_editable_set(en, EINA_FALSE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(en);
+
+ evas_object_data_set(li, "prof_name_lbl", lb);
+ evas_object_data_set(li, "prof_desc_entry", en);
+
+ elm_box_pack_end(fr_bx2, lb);
+ elm_box_pack_end(fr_bx1, fr_bx2);
+ elm_box_pack_end(fr_bx1, en);
+
+ /////////////////////////////////////////////
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ pd = elm_frame_add(win);
+ elm_object_style_set(pd, "pad_medium");
+ evas_object_size_hint_weight_set(pd, 0.0, 0.0);
+ evas_object_size_hint_align_set(pd, 0.5, 0.5);
+ elm_box_pack_end(bx, pd);
+ evas_object_show(pd);
+
+ btn_bx = elm_box_add(win);
+ elm_box_horizontal_set(btn_bx, EINA_TRUE);
+ evas_object_size_hint_weight_set(btn_bx, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn_bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(btn_bx);
+
+ bt = elm_button_add(win);
+ evas_object_smart_callback_add(bt, "clicked", _profile_use, li);
+ elm_object_text_set(bt, "Use");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, 0.5, 0.5);
+ elm_box_pack_end(btn_bx, bt);
+ evas_object_show(bt);
+
+ evas_object_data_set(li, "prof_use_btn", bt);
+
+ bt = elm_button_add(win);
+ evas_object_smart_callback_add(bt, "clicked", _btn_todo, NULL); /* TODO */
+ elm_object_text_set(bt, "Delete");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, 0.5, 0.5);
+ elm_box_pack_end(btn_bx, bt);
+ evas_object_show(bt);
+
+ evas_object_data_set(li, "prof_del_btn", bt);
+
+ bt = elm_button_add(win);
+ evas_object_smart_callback_add(bt, "clicked", _profile_reset, li);
+ elm_object_text_set(bt, "Reset");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, 0.5, 0.5);
+ elm_box_pack_end(btn_bx, bt);
+ evas_object_show(bt);
+
+ evas_object_data_set(li, "prof_reset_btn", bt);
+
+ bt = elm_button_add(win);
+ evas_object_smart_callback_add(bt, "clicked", _btn_todo, NULL); /* TODO */
+ elm_object_text_set(bt, "Add new");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, 0.5, 0.5);
+ elm_box_pack_end(btn_bx, bt);
+ evas_object_show(bt);
+
+ elm_object_content_set(pd, btn_bx);
+
+ evas = evas_object_evas_get(li);
+ evas_event_freeze(evas);
+ edje_freeze();
+
+ _profiles_list_fill(li, profs);
+
+ elm_config_profile_list_free(profs);
+
+ edje_thaw();
+ evas_event_thaw(evas);
+
+ evas_object_data_set(win, "profiles", bx);
+ elm_naviframe_item_simple_push(naviframe, bx);
+}
+
+static void
+_status_config_scrolling_bounce(Evas_Object *win, Evas_Object *box)
+{
+ Evas_Object *fr, *bx, *ck, *pd, *lb, *sl;
+
+ fr = elm_frame_add(box);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Bounce");
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ /* Enable Scroll Bounce */
+ CHECK_ADD("Enable scroll bounce",
+ "Set whether scrollers should bounce<br/>"
+ "when they reach their viewport's edge<br/>"
+ "during a scroll",
+ sb_change, NULL);
+ evas_object_data_set(win, "scroll_bounce_check", ck);
+ elm_check_state_set(ck, elm_config_scroll_bounce_enabled_get());
+
+ /* Scroll bounce friction */
+ LABEL_FRAME_ADD("<hilight>Scroll bounce friction</>");
+
+ sl = elm_slider_add(bx);
+ elm_object_tooltip_text_set(sl, "This is the amount of inertia a <br/>"
+ "scroller will impose at bounce animations");
+ evas_object_data_set(win, "bounce_friction_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.2f");
+ elm_slider_indicator_format_set(sl, "%1.2f");
+ elm_slider_min_max_set(sl, 0.0, 4.0);
+ elm_slider_value_set(sl, elm_config_scroll_bounce_friction_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", bf_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", bf_change, NULL);
+}
+
+static void
+_status_config_scrolling_thumb(Evas_Object *win, Evas_Object *box)
+{
+ Evas_Object *fr, *bx, *ck, *sl, *sp, *pd, *lb;
+
+ fr = elm_frame_add(box);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Thumb Scroll");
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ /* Enable thumb scroll */
+ CHECK_ADD("Enable thumb scroll",
+ "Set whether scrollers should be<br/>"
+ "draggable from any point in their views",
+ ts_change, NULL);
+ evas_object_data_set(win, "thumbscroll_check", ck);
+ elm_check_state_set(ck, elm_config_scroll_thumbscroll_enabled_get());
+
+ /* Thumb scroll threadhold */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll threshold</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the number of pixels one should<br/>"
+ "travel while dragging a scroller's view<br/>"
+ "to actually trigger scrolling");
+ evas_object_data_set(win, "ts_threshold_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f pixels");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 8.0, 50.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_threshold_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tst_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tst_change, NULL);
+
+ /* Thumb scroll hold threashold */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll hold threshold</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the number of pixels the range<br/>"
+ "which can be scrolled, while the scroller<br/>"
+ "is holed");
+ evas_object_data_set(win, "ts_hold_threshold_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f pixels");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 4.0, 500.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_hold_threshold_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tsht_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tsht_change, NULL);
+
+ /* Thumb scroll momentum threshold */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll momentum threshold</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the minimum speed of mouse <br/>"
+ "cursor movement which will trigger<br/>"
+ "list self scrolling animation after a<br/>"
+ "mouse up event (pixels/second)");
+ evas_object_data_set(win, "ts_momentum_threshold_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f pixels/s");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 10.0, 200.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_momentum_threshold_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tsmt_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tsmt_change,
+ NULL);
+
+ /* Thumb scroll flick distance tolerance */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll flick distance tolerance</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the number of pixels the maximum<br/>"
+ "distance which can be flicked. If it is<br/>"
+ "flicked more than this, the flick distance<br/>"
+ "is same with maximum distance");
+ evas_object_data_set(win, "ts_flick_distance_tolerance_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f pixels");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 100.0, 3000.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_flick_distance_tolerance_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tsfdt_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tsfdt_change, NULL);
+
+ /* Thumb scroll friction */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll friction</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the amount of inertia a<br/>"
+ "scroller will impose at self scrolling<br/>"
+ "animations");
+ evas_object_data_set(win, "ts_friction_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.1f");
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_min_max_set(sl, 0.1, 10.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_friction_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tsf_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tsf_change, NULL);
+
+ /* Thumb scroll min friction */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll min friction</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the min amount of inertia a<br/>"
+ "scroller will impose at self scrolling<br/>"
+ "animations");
+ evas_object_data_set(win, "ts_min_friction_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.1f");
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_min_max_set(sl, 0.1, 10.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_min_friction_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tsmf_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tsmf_change, NULL);
+
+ /* Thumb scroll friction standard */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll friction standard</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the standard velocity of the scroller."
+ "<br/>The scroll animation time is same<br/>"
+ "with thumbscroll friction, if the velocity"
+ "<br/>is same with standard velocity.");
+ evas_object_data_set(win, "ts_friction_standard_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f pixel/s");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 10.0, 5000.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_friction_standard_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tsfs_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tsfs_change, NULL);
+
+ /* Thumb scroll border friction */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll border friction</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the amount of lag between your<br/>"
+ "actual mouse cursor dragging movement<br/>"
+ "and a scroller's view movement itself,<br/>"
+ "while pushing it into bounce state<br/>"
+ "manually");
+ evas_object_data_set(win, "ts_border_friction_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.2f");
+ elm_slider_indicator_format_set(sl, "%1.2f");
+ elm_slider_min_max_set(sl, 0.0, 1.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_border_friction_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tsbf_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tsbf_change, NULL);
+
+ /* Thumb scroll sensitivity friction */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll sensitivity friction</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the sensitivity amount which<br/>"
+ "is be multiplied by the length of mouse<br/>"
+ "dragging.");
+ evas_object_data_set(win, "ts_sensitivity_friction_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.2f");
+ elm_slider_indicator_format_set(sl, "%1.2f");
+ elm_slider_min_max_set(sl, 0.1, 1.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_sensitivity_friction_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tssf_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tssf_change, NULL);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+}
+
+static void
+_status_config_scrolling_acceleration(Evas_Object *win, Evas_Object *box)
+{
+ Evas_Object *fr, *bx, *sl, *pd, *lb;
+
+ fr = elm_frame_add(box);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Thumb Scroll Acceleration");
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ /* Thumb scroll acceleration threshold */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll acceleration threshold</>");
+
+ sl = elm_slider_add(bx);
+ elm_object_tooltip_text_set(sl, "This is the minimum speed of mouse <br/>"
+ "cursor movement which will accelerate<br/>"
+ "scrolling velocity after a<br/>"
+ "mouse up event (pixels/second)");
+ evas_object_data_set(win, "ts_acceleration_threshold_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f pixels/s");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 10.0, 5000.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_acceleration_threshold_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tsat_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tsat_change, NULL);
+
+ /* Thumb scroll acceleration time limit */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll acceleration time limit</>");
+
+ sl = elm_slider_add(bx);
+ elm_object_tooltip_text_set(sl, "This is the time limit for<br/>"
+ "accelerating velocity<br/>");
+ evas_object_data_set(win, "ts_acceleration_time_limit_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.1f");
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_min_max_set(sl, 0.0, 15.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_acceleration_time_limit_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tsatl_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tsatl_change, NULL);
+
+ /* Thumb scroll acceleration weight */
+ LABEL_FRAME_ADD("<hilight>Thumb scroll acceleration weight</>");
+
+ sl = elm_slider_add(bx);
+ elm_object_tooltip_text_set(sl, "This is the weight for acceleration");
+ evas_object_data_set(win, "ts_acceleration_weight_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.1f");
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_min_max_set(sl, 1.0, 10.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_acceleration_weight_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", tsaw_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", tsaw_change, NULL);
+}
+
+static void
+_status_config_scrolling(Evas_Object *win,
+ Evas_Object *naviframe)
+{
+ Evas_Object *lb, *pd, *box, *bx, *sl, *sc, *ck, *fr;
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.5);
+
+ sc = elm_scroller_add(win);
+ elm_scroller_step_size_set(sc, 32, 64 * elm_config_scale_get());
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
+ evas_object_show(sc);
+ elm_object_content_set(sc, box);
+
+ fr = elm_frame_add(box);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Acceleration");
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ LABEL_FRAME_ADD("<hilight>Wheel acceleration factor</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the factor by which scrolling<br/>"
+ "increments will be multiplied when scrolling<br/>"
+ "quickly");
+ evas_object_data_set(win, "scroll_accel_factor", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.1f");
+ elm_slider_indicator_format_set(sl, "%2.1f");
+ elm_slider_min_max_set(sl, 0.0, 10.0);
+ elm_slider_value_set(sl, elm_config_scroll_accel_factor_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", bis_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", scroll_accel_factor_change, NULL);
+
+ fr = elm_frame_add(box);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Animation");
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ /* Disable Scroll Animation */
+ CHECK_ADD("Disable scroll animation",
+ "Set whether scrollers should scroll<br/>"
+ "immediately instead of animating",
+ scroll_animation_disable_change, NULL);
+ evas_object_data_set(win, "scroll_animation_disable", ck);
+ elm_check_state_set(ck, elm_config_scroll_animation_disable_get());
+
+ /* Bounce */
+ _status_config_scrolling_bounce(win, box);
+
+ _status_config_scrolling_thumb(win, box);
+
+ /* Acceleration */
+ _status_config_scrolling_acceleration(win, box);
+
+ fr = elm_frame_add(box);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Friction");
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+ /* Page scroll friction */
+ LABEL_FRAME_ADD("<hilight>Page scroll friction</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the amount of inertia a<br/>"
+ "paged scroller will impose at<br/>"
+ "page fitting animations");
+ evas_object_data_set(win, "page_scroll_friction_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.1f");
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_min_max_set(sl, 0.0, 5.0);
+ elm_slider_value_set(sl, elm_config_scroll_page_scroll_friction_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", ps_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", ps_change, NULL);
+
+ /* Bring in scroll friction */
+ LABEL_FRAME_ADD("<hilight>Bring in scroll friction</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the amount of inertia a<br/>"
+ "scroller will impose at region bring<br/>"
+ "animations");
+ evas_object_data_set(win, "bring_in_scroll_friction_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.1f");
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_min_max_set(sl, 0.0, 5.0);
+ elm_slider_value_set(sl, elm_config_scroll_bring_in_scroll_friction_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", bis_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", bis_change, NULL);
+
+ /* Zoom scroll friction */
+ LABEL_FRAME_ADD("<hilight>Zoom scroll friction</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the amount of inertia<br/>"
+ "scrollers will impose at animations<br/>"
+ "triggered by Elementary widgets'<br/>"
+ "zooming API");
+ evas_object_data_set(win, "zoom_scroll_friction_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.1f");
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_min_max_set(sl, 0.0, 5.0);
+ elm_slider_value_set(sl, elm_config_scroll_zoom_friction_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", zf_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", zf_change, NULL);
+
+ fr = elm_frame_add(box);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Smooth Start");
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+ CHECK_ADD("Enable smooth start",
+ "Set whether scrollers start smoothly on thumb<br/>"
+ "scroll",
+ ss_change, NULL);
+ evas_object_data_set(win, "scroll_smooth_start", ck);
+ elm_check_state_set(ck, elm_config_scroll_thumbscroll_smooth_start_get());
+
+ /* Scroll Smooth Amount */
+ LABEL_FRAME_ADD("<hilight>Scroll Smooth Amount</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the amount smoothing to apply<br/>"
+ "to thumbscroll to avoid jerky input");
+ evas_object_data_set(win, "scroll_smooth_amount", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.2f");
+ elm_slider_indicator_format_set(sl, "%1.2f");
+ elm_slider_min_max_set(sl, 0.0, 1.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_smooth_amount_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", smooth_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", smooth_change, NULL);
+
+ /* Scroll Smooth Time Window */
+ LABEL_FRAME_ADD("<hilight>Scroll Smooth Time Window</>");
+
+ sl = elm_slider_add(win);
+ elm_object_tooltip_text_set(sl, "This is the window of time to look back<br/>"
+ "into for smoothing of thumbscroll");
+ evas_object_data_set(win, "scroll_smooth_time_window", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.2f");
+ elm_slider_indicator_format_set(sl, "%1.2f");
+ elm_slider_min_max_set(sl, 0.0, 1.0);
+ elm_slider_value_set(sl, elm_config_scroll_thumbscroll_smooth_time_window_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", smooth_win_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", smooth_win_change, NULL);
+
+
+ evas_object_data_set(win, "scrolling", sc);
+
+ elm_naviframe_item_simple_push(naviframe, sc);
+}
+
+static void
+_cb_accel(void *data, Evas_Object *obj EINA_UNUSED, void *info EINA_UNUSED)
+{
+ const char *val = data;
+ const char *ss = elm_config_accel_preference_get();
+
+ if ((!ss) || (ss && (strcasecmp(ss, val))))
+ {
+ elm_config_accel_preference_set(val);
+ elm_config_all_flush();
+ }
+}
+
+static void
+_cb_accel_override(void *data EINA_UNUSED, Evas_Object *obj, void *info EINA_UNUSED)
+{
+ Eina_Bool val = elm_check_state_get(obj);
+ Eina_Bool sb = elm_config_accel_preference_override_get();
+
+ if (val != sb)
+ {
+ elm_config_accel_preference_override_set(val);
+ elm_config_all_flush();
+ }
+}
+
+static void
+_cb_vsync(void *data EINA_UNUSED, Evas_Object *obj, void *info EINA_UNUSED)
+{
+ Eina_Bool val = elm_check_state_get(obj);
+ Eina_Bool sb = elm_config_vsync_get();
+
+ if (val != sb)
+ {
+ elm_config_vsync_set(val);
+ elm_config_all_flush();
+ }
+}
+
+static void
+_status_config_rendering(Evas_Object *win,
+ Evas_Object *naviframe)
+{
+ Evas_Object *li, *bx, *ck, *sp;
+ Elm_Object_Item *it;
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, li);
+ evas_object_show(li);
+
+ it = elm_list_item_append(li, "No Acceleration", NULL, NULL,
+ _cb_accel, "none");
+ if (!elm_config_accel_preference_get() ||
+ (!strcasecmp(elm_config_accel_preference_get(), "none")))
+ elm_list_item_selected_set(it, EINA_TRUE);
+
+ it = elm_list_item_append(li, "OpenGL / OpenGL-ES", NULL, NULL,
+ _cb_accel, "gl");
+ if (elm_config_accel_preference_get() &&
+ ((!strcasecmp(elm_config_accel_preference_get(), "gl")) ||
+ (!strcasecmp(elm_config_accel_preference_get(), "opengl"))))
+ elm_list_item_selected_set(it, EINA_TRUE);
+
+ it = elm_list_item_append(li, "3D (any 3D hardware)", NULL, NULL,
+ _cb_accel, "3d");
+ if (elm_config_accel_preference_get() &&
+ (!strcasecmp(elm_config_accel_preference_get(), "3d")))
+ elm_list_item_selected_set(it, EINA_TRUE);
+
+ it = elm_list_item_append(li, "Hardware (any hardware)", NULL, NULL,
+ _cb_accel, "hw");
+ if (elm_config_accel_preference_get() &&
+ ((!strcasecmp(elm_config_accel_preference_get(), "hw")) ||
+ (!strcasecmp(elm_config_accel_preference_get(), "hardware")) ||
+ (!strcasecmp(elm_config_accel_preference_get(), "accel"))))
+ elm_list_item_selected_set(it, EINA_TRUE);
+
+ elm_list_go(li);
+
+ CHECK_ADD("Override Preferred Acceleration",
+ "Force any application requesting<br>"
+ "acceleration to use the system<br>"
+ "configured acceleration as above",
+ _cb_accel_override, NULL);
+ elm_check_state_set(ck, elm_config_accel_preference_override_get());
+
+ /////////////////////////////////////////////
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ CHECK_ADD("Tear-free rendering (VSync)",
+ "This enables Vsync hints for some<br>"
+ "rendering engines to try keep display<br>"
+ "VSynced and from Tearing",
+ _cb_vsync, NULL);
+ elm_check_state_set(ck, elm_config_vsync_get());
+
+ evas_object_data_set(win, "rendering", bx);
+ elm_naviframe_item_simple_push(naviframe, bx);
+}
+
+static void
+_status_config_caches(Evas_Object *win,
+ Evas_Object *naviframe)
+{
+ Evas_Object *lb, *pd, *bx, *sl, *sp, *ck;
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5);
+
+ LABEL_FRAME_ADD("<hilight>Cache Flush Interval (8 ticks per second)</>");
+
+ sl = elm_slider_add(win);
+ evas_object_data_set(win, "cache_flush_interval_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f ticks");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 8.0, 4096.0);
+ elm_slider_value_set(sl, elm_config_cache_flush_interval_get());
+ elm_object_disabled_set(sl, !elm_config_cache_flush_enabled_get());
+
+ CHECK_ADD("Enable Flushing", "Enable Flushing", cf_enable, sl);
+ elm_check_state_set(ck, elm_config_cache_flush_enabled_get());
+
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", cf_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", cf_change, NULL);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ LABEL_FRAME_ADD("<hilight>Font Cache Size</>");
+
+ sl = elm_slider_add(win);
+ evas_object_data_set(win, "font_cache_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.1f MB");
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_min_max_set(sl, 0.0, 4.0);
+ elm_slider_value_set(sl, (double)elm_config_cache_font_cache_size_get() / 1024.0);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", fc_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", fc_change, NULL);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ LABEL_FRAME_ADD("<hilight>Image Cache Size</>");
+
+ sl = elm_slider_add(win);
+ evas_object_data_set(win, "image_cache_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f MB");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 0, 32);
+ elm_slider_value_set(sl, (double)elm_config_cache_image_cache_size_get() / 1024.0);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", ic_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", ic_change, NULL);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ LABEL_FRAME_ADD("<hilight>Number of Edje Files to Cache</>");
+
+ sl = elm_slider_add(win);
+ evas_object_data_set(win, "edje_file_cache_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f files");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 0, 32);
+ elm_slider_value_set(sl, elm_config_cache_edje_file_cache_size_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", efc_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", efc_change, NULL);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ LABEL_FRAME_ADD("<hilight>Number of Edje Collections to Cache</>");
+
+ sl = elm_slider_add(win);
+ evas_object_data_set(win, "edje_collection_cache_slider", sl);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_unit_format_set(sl, "%1.0f collections");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_min_max_set(sl, 0, 128);
+ elm_slider_value_set(sl, elm_config_cache_edje_collection_cache_size_get());
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl, "changed", ecc_round, NULL);
+ evas_object_smart_callback_add(sl, "delay,changed", ecc_change, NULL);
+
+ evas_object_data_set(win, "caches", bx);
+
+ elm_naviframe_item_simple_push(naviframe, bx);
+}
+
+static void
+_status_config_full(Evas_Object *win,
+ Evas_Object *bx0)
+{
+ Evas_Object *tb, *naviframe;
+ Elm_Object_Item *tb_sizing, *tb_it;
+
+ tb = elm_toolbar_add(win);
+ elm_toolbar_select_mode_set(tb, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ elm_toolbar_menu_parent_set(tb, win);
+ elm_toolbar_homogeneous_set(tb, EINA_FALSE);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ tb_sizing = elm_toolbar_item_append(tb, "zoom-fit-best", "Sizing",
+ _cf_sizing, win);
+ elm_toolbar_item_priority_set(tb_sizing, 100);
+
+ tb_it = elm_toolbar_item_append(tb, "preferences-desktop-theme", "Theme",
+ _cf_themes, win);
+ elm_toolbar_item_priority_set(tb_it, 90);
+
+ elm_toolbar_item_append(tb, "preferences-desktop-font", "Fonts",
+ _cf_fonts, win);
+
+ tb_it = elm_toolbar_item_append(tb, "system-users", "Profiles",
+ _cf_profiles, win);
+ elm_toolbar_item_priority_set(tb_it, 90);
+
+ elm_toolbar_item_append(tb, "system-run", "Scrolling", _cf_scrolling, win);
+ elm_toolbar_item_append(tb, "video-display", "Rendering",
+ _cf_rendering, win);
+ elm_toolbar_item_append(tb, "appointment-new", "Caches", _cf_caches, win);
+ elm_toolbar_item_append(tb, "sound", "Audio", _cf_audio, win);
+ elm_toolbar_item_append(tb, NULL, "Focus", _cf_focus, win);
+ elm_toolbar_item_append(tb, NULL, "Etc", _cf_etc, win);
+
+ elm_box_pack_end(bx0, tb);
+ evas_object_show(tb);
+
+ naviframe = elm_naviframe_add(win);
+ evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_data_set(win, "naviframe", naviframe);
+
+ _status_config_themes(win, naviframe);
+ _status_config_fonts(win, naviframe);
+ _status_config_profiles(win, naviframe);
+ _status_config_rendering(win, naviframe);
+ _status_config_scrolling(win, naviframe);
+ _status_config_caches(win, naviframe);
+ _status_config_audio(win, naviframe);
+ _status_config_focus(win, naviframe);
+ _status_config_etc(win, naviframe);
+ _status_config_sizing(win, naviframe); // Note: call this at the end.
+
+ // FIXME uncomment after flip style fix, please
+ //elm_object_style_set(naviframe, "flip");
+ elm_toolbar_item_selected_set(tb_sizing, EINA_TRUE);
+ elm_box_pack_end(bx0, naviframe);
+ evas_object_show(naviframe);
+}
+
+static void
+win_create(void)
+{
+ Evas_Object *win, *bx0;
+
+ win = elm_win_util_standard_add("main", "Elementary Config");
+ if (!win) exit(1);
+ ecore_event_handler_add(ELM_EVENT_CONFIG_ALL_CHANGED, _config_all_changed,
+ win);
+ evas_object_smart_callback_add(win, "delete,request", config_exit, NULL);
+
+ bx0 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx0);
+ evas_object_show(bx0);
+
+ if (!interactive) _status_basic(win, bx0);
+ else if (0)
+ _status_config(win, bx0);
+ else _status_config_full(win, bx0);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+static Eina_Bool
+_exit_timer(void *data EINA_UNUSED)
+{
+ elm_exit();
+ return ECORE_CALLBACK_CANCEL;
+}
+
+/* this is your elementary main function - it MUST be called IMMEDIATELY
+ * after elm_init() and MUST be passed argc and argv, and MUST be called
+ * elm_main and not be static - must be a visible symbol with EAPI infront */
+EAPI_MAIN int
+elm_main(int argc,
+ char **argv)
+{
+ int i;
+
+ elm_app_info_set(elm_main, "elementary", "images/logo.png");
+ elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR);
+ elm_app_compile_data_dir_set(PACKAGE_DATA_DIR);
+
+ for (i = 1; i < argc; i++)
+ {
+ if (!strcmp(argv[i], "-h"))
+ {
+ printf("Usage:\n"
+ " -h This help\n"
+ " -q Quiet mode (dont show window)\n"
+ " -t THEME Set theme to THEME (ELM_THEME spec)\n"
+ " -f SIZE Set finger size to SIZE pixels\n"
+ " -s SCALE Set scale factor to SCALE\n"
+ " -w WEB_BACKEND Set the web backend to be used\n"
+ );
+ }
+ else if (!strcmp(argv[i], "-q"))
+ {
+ quiet = 1;
+ interactive = 0;
+ }
+ else if ((!strcmp(argv[i], "-t")) && (i < argc - 1))
+ {
+ i++;
+ theme_set = argv[i];
+ interactive = 0;
+ }
+ else if ((!strcmp(argv[i], "-f")) && (i < argc - 1))
+ {
+ i++;
+ finger_size_set = argv[i];
+ interactive = 0;
+ }
+ else if ((!strcmp(argv[i], "-s")) && (i < argc - 1))
+ {
+ i++;
+ scale_set = argv[i];
+ interactive = 0;
+ }
+ else if ((!strcmp(argv[i], "-w")) && (i < argc - 1))
+ {
+ i++;
+ web_backend = argv[i];
+ interactive = 0;
+ }
+ }
+ /* put here any init code specific to this app like parsing args, etc. */
+ if (!quiet)
+ {
+#ifdef ELM_EFREET
+ elm_need_efreet();
+#endif
+ win_create(); /* create main window */
+ if (!interactive)
+ ecore_timer_add(2.0, _exit_timer, NULL);
+ }
+ if (!interactive)
+ {
+ if (theme_set) elm_theme_set(NULL, theme_set);
+ if (finger_size_set) elm_config_finger_size_set(atoi(finger_size_set));
+ if (scale_set) elm_config_scale_set(atof(scale_set));
+ if (web_backend) elm_config_web_backend_set(web_backend);
+
+ elm_config_all_flush();
+
+ if (quiet) elm_exit();
+ }
+ elm_run(); /* and run the program now and handle all events, etc. */
+ /* if the mainloop that elm_run() runs exists, we exit the app */
+ /* exit code */
+
+ if (interactive)
+ {
+ const char *web_backend_set = elm_config_web_backend_get();
+
+ web_backend = elm_object_text_get(web_backend_entry);
+ fprintf(stderr, "[%s] vs [%s]\n", web_backend, web_backend_set);
+ if (strcmp(web_backend, web_backend_set))
+ {
+ elm_config_web_backend_set(web_backend);
+ fprintf(stderr, "web backend set to : [%s]\n", elm_config_web_backend_get());
+ elm_config_all_flush();
+ }
+ }
+
+ return 0;
+}
+/* All elementary apps should use this. Put it right after elm_main() */
+ELM_MAIN()
diff --git a/src/bin/elementary/elementary_codegen.c b/src/bin/elementary/elementary_codegen.c
new file mode 100644
index 0000000000..e9cc685b66
--- /dev/null
+++ b/src/bin/elementary/elementary_codegen.c
@@ -0,0 +1,887 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+#include <Ecore_Getopt.h>
+#include <Edje.h>
+#define EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT 1
+#include <Edje_Edit.h>
+#include <Eina.h>
+
+#include <Elementary.h>
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <locale.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#ifndef ENABLE_NLS
+# ifndef libintl_setlocale
+# define libintl_setlocale(c, l)
+# endif
+#endif
+
+static int _log_dom;
+#define DBG(...) EINA_LOG_DOM_DBG(_log_dom, __VA_ARGS__)
+#define ERR(...) EINA_LOG_DOM_ERR(_log_dom, __VA_ARGS__)
+#define WRN(...) EINA_LOG_DOM_WARN(_log_dom, __VA_ARGS__)
+
+static Ecore_Evas *ee = NULL;
+static char *file = NULL;
+static char *group = NULL;
+static char *prefix = NULL;
+static FILE *source_fd = NULL;
+static FILE *header_fd = NULL;
+
+#define H_HEADER \
+ "#ifndef _%s\n" \
+ "#define _%s\n\n" \
+ "#include <Edje.h>\n" \
+ "#include <Elementary.h>\n" \
+ "#include <Evas.h>\n\n" \
+ "#include <stdlib.h>\n\n"
+
+#define H_FOOTER \
+ "\n#endif /* _%s */\n"
+
+#define C_HEADER \
+ "#include \"%s\"\n\n"
+
+#define H_CODEGEN_LAYOUT_ADD \
+ "/**\n * @brief Creates the layout object and set the theme\n" \
+ " * @param o The parent\n" \
+ " * @param th The theme to add to, or if NULL, the default theme\n" \
+ " * @param edje_file The path to edj, if NULL it's used the path given\n" \
+ " * to elementary_codegen\n */\n" \
+ "Evas_Object *%s_layout_add(Evas_Object *o, Elm_Theme *th, " \
+ "const char *edje_file);\n"
+
+#define C_CODEGEN_LAYOUT_ADD \
+ "Evas_Object *\n" \
+ "%s_layout_add(Evas_Object *o, Elm_Theme *th, const char *edje_file)\n" \
+ "{\n" \
+ " Evas_Object *l;\n\n" \
+ " if (edje_file)\n" \
+ " elm_theme_extension_add(th, edje_file);\n" \
+ " else\n" \
+ " elm_theme_extension_add(th, \"./%s\");\n\n" \
+ " l = elm_layout_add(o);\n" \
+ " if (!l) return NULL;\n\n" \
+ " if (!elm_layout_theme_set(l, \"%s\", \"%s\", \"%s\"))\n" \
+ " {\n" \
+ " evas_object_del(l);\n" \
+ " return NULL;\n" \
+ " }\n\n" \
+ " return l;\n" \
+ "}\n\n"
+
+#define C_CODEGEN_PART_CONTENT_SET \
+ "void\n" \
+ "%s_%s_set(Evas_Object *o, Evas_Object *value)\n" \
+ "{\n" \
+ " elm_layout_content_set(o, \"%s\", value);\n" \
+ "}\n\n"
+
+#define C_CODEGEN_PART_TEXT_SET \
+ "void\n" \
+ "%s_%s_set(Evas_Object *o, const char *value)\n" \
+ "{\n" \
+ " elm_layout_text_set(o, \"%s\", value);\n" \
+ "}\n\n"
+
+#define C_CODEGEN_PART_CONTENT_UNSET \
+ "Evas_Object *\n" \
+ "%s_%s_unset(Evas_Object *o)\n" \
+ "{\n" \
+ " return elm_layout_content_unset(o, \"%s\");\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_CONTENT_SET \
+ "void %s_%s_set(Evas_Object *o, Evas_Object *value);\n"
+
+#define H_CODEGEN_PART_TEXT_SET \
+ "void %s_%s_set(Evas_Object *o, const char *value);\n"
+
+#define H_CODEGEN_PART_CONTENT_UNSET \
+ "Evas_Object *%s_%s_unset(Evas_Object *o);\n"
+
+#define C_CODEGEN_PART_CONTENT_GET \
+ "Evas_Object *\n" \
+ "%s_%s_get(const Evas_Object *o)\n" \
+ "{\n" \
+ " return elm_layout_content_get(o, \"%s\");\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_CONTENT_GET \
+ "Evas_Object *%s_%s_get(const Evas_Object *o);\n"
+
+#define C_CODEGEN_PART_TEXT_GET \
+ "const char *\n" \
+ "%s_%s_get(const Evas_Object *o)\n" \
+ "{\n" \
+ " return elm_layout_text_get(o, \"%s\");\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_TEXT_GET \
+ "const char *%s_%s_get(const Evas_Object *o);\n"
+
+#define C_CODEGEN_PART_BOX_APPEND \
+ "Eina_Bool\n" \
+ "%s_%s_append(Evas_Object *o, Evas_Object *child)\n" \
+ "{\n" \
+ " return elm_layout_box_append(o, \"%s\", child);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_BOX_APPEND \
+ "Eina_Bool %s_%s_append(Evas_Object *o, Evas_Object *child);\n"
+
+#define C_CODEGEN_PART_BOX_PREPEND \
+ "Eina_Bool\n" \
+ "%s_%s_prepend(Evas_Object *o, Evas_Object *child)\n" \
+ "{\n" \
+ " return elm_layout_box_prepend(o, \"%s\", child);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_BOX_PREPEND \
+ "Eina_Bool %s_%s_prepend(Evas_Object *o, Evas_Object *child);\n"
+
+#define C_CODEGEN_PART_BOX_INSERT_BEFORE \
+ "Eina_Bool\n" \
+ "%s_%s_insert_before(Evas_Object *o, Evas_Object *child, " \
+ "const Evas_Object *reference)\n" \
+ "{\n" \
+ " return elm_layout_box_insert_before(o, \"%s\", " \
+ "child, reference);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_BOX_INSERT_BEFORE \
+ "Eina_Bool %s_%s_insert_before(Evas_Object *o, Evas_Object *child, " \
+ "const Evas_Object *reference);\n"
+
+#define C_CODEGEN_PART_BOX_INSERT_AT \
+ "Eina_Bool\n" \
+ "%s_%s_insert_at(Evas_Object *o, Evas_Object *child, unsigned int pos)\n" \
+ "{\n" \
+ " return elm_layout_box_insert_at(o, \"%s\", child, pos);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_BOX_INSERT_AT \
+ "Eina_Bool %s_%s_insert_at(Evas_Object *o, Evas_Object *child, " \
+ "unsigned int pos);\n"
+
+#define C_CODEGEN_PART_BOX_REMOVE \
+ "Evas_Object *\n" \
+ "%s_%s_remove(Evas_Object *o, Evas_Object *child)\n" \
+ "{\n" \
+ " return elm_layout_box_remove(o, \"%s\", child);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_BOX_REMOVE \
+ "Evas_Object *%s_%s_remove(Evas_Object *o, Evas_Object *child);\n"
+
+#define C_CODEGEN_PART_BOX_REMOVE_ALL \
+ "Eina_Bool\n" \
+ "%s_%s_remove_all(Evas_Object *o, Eina_Bool clear)\n" \
+ "{\n" \
+ " return elm_layout_box_remove_all(o, \"%s\", clear);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_BOX_REMOVE_ALL \
+ "Eina_Bool %s_%s_remove_all(Evas_Object *o, Eina_Bool clear);\n"
+
+#define C_CODEGEN_PART_TABLE_PACK \
+ "Eina_Bool\n" \
+ "%s_%s_pack(Evas_Object *o, Evas_Object *child, unsigned short col, " \
+ "unsigned short row, unsigned short colspan, unsigned short rowspan)\n" \
+ "{\n" \
+ " return elm_layout_table_pack(o, \"%s\", child, col, row, " \
+ "colspan, rowspan);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_TABLE_PACK \
+ "Eina_Bool %s_%s_pack(Evas_Object *o, Evas_Object *child, " \
+ "unsigned short col, unsigned short row, unsigned short " \
+ "colspan, unsigned short rowspan);\n"
+
+#define C_CODEGEN_PART_TABLE_UNPACK \
+ "Evas_Object *\n" \
+ "%s_%s_unpack(Evas_Object *o, Evas_Object *child)\n" \
+ "{\n" \
+ " return elm_layout_table_unpack(o, \"%s\", child);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_TABLE_UNPACK \
+ "Evas_Object *%s_%s_unpack(Evas_Object *o, Evas_Object *child);\n"
+
+#define C_CODEGEN_PART_TABLE_CLEAR \
+ "Eina_Bool\n" \
+ "%s_%s_clear(Evas_Object *o, Eina_Bool clear)\n" \
+ "{\n" \
+ " return elm_layout_table_clear(o, \"%s\", clear);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PART_TABLE_CLEAR \
+ "Eina_Bool %s_%s_clear(Evas_Object *o, Eina_Bool clear);\n"
+
+#define C_CODEGEN_PROGRAM_EMIT \
+ "void\n" \
+ "%s_%s_emit(Evas_Object *o)\n" \
+ "{\n" \
+ " elm_layout_signal_emit(o, \"%s\", \"%s\");\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PROGRAM_EMIT \
+ "void %s_%s_emit(Evas_Object *o);\n"
+
+#define C_CODEGEN_PROGRAM_CALLBACK_ADD \
+ "void\n" \
+ "%s_%s_callback_add(Evas_Object *o, Edje_Signal_Cb func, void *data)\n" \
+ "{\n" \
+ " elm_layout_signal_callback_add(o, \"%s\", \"%s\", func, data);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PROGRAM_CALLBACK_ADD \
+ "void %s_%s_callback_add(Evas_Object *o, Edje_Signal_Cb func, " \
+ "void *data);\n"
+
+#define C_CODEGEN_PROGRAM_CALLBACK_DEL \
+ "void\n" \
+ "%s_%s_callback_del(Evas_Object *o, Edje_Signal_Cb func)\n" \
+ "{\n" \
+ " elm_layout_signal_callback_del(o, \"%s\", \"%s\", func);\n" \
+ "}\n\n"
+
+#define H_CODEGEN_PROGRAM_CALLBACK_DEL \
+ "void %s_%s_callback_del(Evas_Object *o, Edje_Signal_Cb func);\n"
+
+const Ecore_Getopt optdesc =
+{
+ "elm_codegen",
+ "%prog [options] <file.edj> <group> <source_file_name> <header_file_name>",
+ PACKAGE_VERSION,
+ "(C) 2012 - The Enlightenment Project",
+ "BSD",
+ "elm_codegen generates the boilerplate code to get and set the "
+ "parts of a group from a compiled (binary) edje "
+ "file avoiding common errors with typos.\n",
+ 0,
+ {
+ ECORE_GETOPT_STORE_STR('p', "prefix", "The prefix for the " \
+ "generataed code."),
+ ECORE_GETOPT_LICENSE('L', "license"),
+ ECORE_GETOPT_COPYRIGHT('C', "copyright"),
+ ECORE_GETOPT_VERSION('V', "version"),
+ ECORE_GETOPT_HELP('h', "help"),
+ ECORE_GETOPT_SENTINEL
+ }
+};
+
+static char *
+_header_standardize(const char *filename)
+{
+ char *str, *itr, *aux;
+
+ aux = strrchr(filename, '/');
+ str = itr = strdup(aux ? aux + 1 : filename);
+
+ for (; *itr; itr++)
+ if (*itr == '.')
+ *itr = '_';
+ else
+ *itr = toupper(*itr);
+
+ return str;
+}
+
+static Eina_Bool
+_file_descriptors_open(const char *source, const char *header)
+{
+ header_fd = fopen(header, "w");
+ if (!header_fd)
+ return EINA_FALSE;
+
+ source_fd = fopen(source, "w");
+ if (!source_fd)
+ goto err;
+
+ return EINA_TRUE;
+
+ err:
+ fclose(header_fd);
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+_file_descriptors_close(void)
+{
+ Eina_Bool ret = EINA_FALSE;
+
+ if (!fclose(header_fd))
+ ret = EINA_TRUE;
+
+ if (!fclose(source_fd))
+ ret &= EINA_TRUE;
+
+ return ret;
+}
+
+static Eina_Bool
+_headers_write(const char *filename)
+{
+ char buf[512];
+ char *str;
+
+ str = _header_standardize(filename);
+ snprintf(buf, sizeof(buf), H_HEADER, str, str);
+ if (fwrite(buf, strlen(buf), 1, header_fd) != 1)
+ {
+ free(str);
+ return EINA_FALSE;
+ }
+
+ free(str);
+
+ snprintf(buf, sizeof(buf), C_HEADER, filename);
+ if (fwrite(buf, strlen(buf), 1, source_fd) != 1)
+ return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_footer_write(const char *filename)
+{
+ char buf[512];
+ char *str;
+
+ str = _header_standardize(filename);
+ snprintf(buf, sizeof(buf), H_FOOTER, str);
+ if (fwrite(buf, strlen(buf), 1, header_fd) != 1)
+ {
+ free(str);
+ return EINA_FALSE;
+ }
+
+ free(str);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_theme_set_write(void)
+{
+ Eina_Bool ret = EINA_FALSE;
+ char *str[3]; /* *klas, *style, *group */
+ char *token, *_group, buf[512];
+ int i;
+
+ str[0] = str[1] = str[2] = NULL;
+ if (strncmp(group, "elm/", 4)) return EINA_FALSE;
+
+ _group = strdup(group);
+ if (!_group) return EINA_FALSE;
+
+ strtok(_group, "/");
+ for (i = 0; i < 3; i++)
+ {
+ token = strtok(NULL, "/");
+ if (!token) break;
+
+ str[i] = token;
+ }
+
+ if (!str[0] || !str[1] || !str[2])
+ goto end;
+
+ snprintf(buf, sizeof(buf), C_CODEGEN_LAYOUT_ADD, prefix, file, str[0],
+ str[1], str[2]);
+ if (fwrite(buf, strlen(buf), 1, source_fd) != 1)
+ goto end;
+
+ snprintf(buf, sizeof(buf), H_CODEGEN_LAYOUT_ADD, prefix);
+ if (fwrite(buf, strlen(buf), 1, header_fd) != 1)
+ goto end;
+
+ ret = EINA_TRUE;
+
+end:
+ free(_group);
+ return ret;
+}
+
+static Eina_Bool
+_part_write(const char *apiname, const char *partname, const char *description,
+ Edje_Part_Type type)
+{
+ char buf[1024];
+
+#define TEMPLATE_NAME(sufix) \
+ do { \
+ snprintf(buf, sizeof(buf), C_CODEGEN_PART_##sufix, prefix, \
+ apiname, partname); \
+ if (fwrite(buf, strlen(buf), 1, source_fd) != 1) \
+ goto err; \
+ snprintf(buf, sizeof(buf), H_CODEGEN_PART_##sufix, prefix, \
+ apiname); \
+ if (fwrite(buf, strlen(buf), 1, header_fd) != 1) \
+ goto err; \
+ } while(0)
+
+ if (description)
+ {
+ snprintf(buf, sizeof(buf), "\n/**\n * @brief %s\n */\n", description);
+ if (fwrite(buf, strlen(buf), 1, header_fd) != 1)
+ goto err;
+ }
+
+ switch (type)
+ {
+ case EDJE_PART_TYPE_BOX:
+ TEMPLATE_NAME(BOX_APPEND);
+ TEMPLATE_NAME(BOX_PREPEND);
+ TEMPLATE_NAME(BOX_INSERT_BEFORE);
+ TEMPLATE_NAME(BOX_INSERT_AT);
+ TEMPLATE_NAME(BOX_REMOVE);
+ TEMPLATE_NAME(BOX_REMOVE_ALL);
+ break;
+
+ case EDJE_PART_TYPE_TABLE:
+ TEMPLATE_NAME(TABLE_PACK);
+ TEMPLATE_NAME(TABLE_UNPACK);
+ TEMPLATE_NAME(TABLE_CLEAR);
+ break;
+
+ case EDJE_PART_TYPE_TEXT:
+ TEMPLATE_NAME(TEXT_SET);
+ TEMPLATE_NAME(TEXT_GET);
+ break;
+
+ default:
+ TEMPLATE_NAME(CONTENT_SET);
+ TEMPLATE_NAME(CONTENT_UNSET);
+ TEMPLATE_NAME(CONTENT_GET);
+ break;
+ }
+
+#undef TEMPLATE_NAME
+
+ return EINA_TRUE;
+
+ err:
+ ERR("Could not write the part: %s", partname);
+ return EINA_FALSE;
+}
+
+static inline Eina_Bool
+_c_id_allowed(char c)
+{
+ if ((c >= '0') && (c <= '9')) return EINA_TRUE;
+ if ((c >= 'a') && (c <= 'z')) return EINA_TRUE;
+ if ((c >= 'A') && (c <= 'Z')) return EINA_TRUE;
+
+ return EINA_FALSE;
+}
+
+static char *
+_api_name_fix(const char *orig)
+{
+ char *d, *d_end, buf[256];
+ const char *s;
+
+ if (!orig) return NULL;
+
+ s = orig;
+ d = buf;
+ d_end = d + sizeof(buf) - 1;
+
+ for (; (*s != '\0') && (d < d_end); s++, d++)
+ if (_c_id_allowed(*s)) *d = *s;
+ else *d = '_';
+ *d = '\0';
+
+ return strdup(buf);
+}
+
+static char *
+_part_api_name_get(Evas_Object *ed, const char *program)
+{
+ const char *orig;
+ char *fix;
+
+ orig = edje_edit_part_api_name_get(ed, program);
+ fix = _api_name_fix(orig);
+ edje_edit_string_free(orig);
+
+ return fix;
+}
+
+static Eina_Bool
+_parts_parse(Evas_Object *ed)
+{
+ Eina_List *parts, *l;
+ const char *name, *description;
+ char *apiname;
+ Edje_Part_Type type;
+ Eina_Bool ret = EINA_TRUE;
+
+ parts = edje_edit_parts_list_get(ed);
+ EINA_LIST_FOREACH(parts, l, name)
+ {
+ if (!(apiname = _part_api_name_get(ed, name)))
+ {
+ DBG("filter out part '%s': not API.", name);
+ continue;
+ }
+
+ type = edje_edit_part_type_get(ed, name);
+ if ((type != EDJE_PART_TYPE_SWALLOW) &&
+ (type != EDJE_PART_TYPE_TEXT) &&
+ (type != EDJE_PART_TYPE_BOX) &&
+ (type != EDJE_PART_TYPE_TABLE))
+ {
+ free(apiname);
+ continue;
+ }
+
+ description = edje_edit_part_api_description_get(ed, name);
+ if (!_part_write(apiname, name, description, type))
+ {
+ ret = EINA_FALSE;
+ edje_edit_string_free(description);
+ free(apiname);
+ break;
+ }
+
+ edje_edit_string_free(description);
+ free(apiname);
+ }
+
+ edje_edit_string_list_free(parts);
+ return ret;
+}
+
+static Eina_Bool
+_program_emit_write(const char *apiname, const char *source, const char *sig,
+ const char *description)
+{
+ char buf[512];
+
+ snprintf(buf, sizeof(buf), C_CODEGEN_PROGRAM_EMIT, prefix,
+ apiname, sig, source);
+ if (fwrite(buf, strlen(buf), 1, source_fd) != 1)
+ goto err;
+
+ if (description)
+ {
+ snprintf(buf, sizeof(buf), "\n/**\n * @brief %s\n */\n", description);
+ if (fwrite(buf, strlen(buf), 1, header_fd) != 1)
+ goto err;
+ }
+
+ snprintf(buf, sizeof(buf), H_CODEGEN_PROGRAM_EMIT, prefix,
+ apiname);
+ if (fwrite(buf, strlen(buf), 1, header_fd) != 1)
+ goto err;
+
+ return EINA_TRUE;
+
+ err:
+ ERR("Could not write the program: %s", apiname);
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+_program_add_write(const char *apiname, const char *source, const char *sig,
+ const char *description)
+{
+ char buf[512];
+
+ snprintf(buf, sizeof(buf), C_CODEGEN_PROGRAM_CALLBACK_ADD, prefix,
+ apiname, sig, source);
+ if (fwrite(buf, strlen(buf), 1, source_fd) != 1)
+ goto err;
+
+ snprintf(buf, sizeof(buf), C_CODEGEN_PROGRAM_CALLBACK_DEL, prefix,
+ apiname, sig, source);
+ if (fwrite(buf, strlen(buf), 1, source_fd) != 1)
+ goto err;
+
+ if (description)
+ {
+ snprintf(buf, sizeof(buf), "\n/**\n * @brief %s\n */\n", description);
+ if (fwrite(buf, strlen(buf), 1, header_fd) != 1)
+ goto err;
+ }
+
+ snprintf(buf, sizeof(buf), H_CODEGEN_PROGRAM_CALLBACK_ADD, prefix,
+ apiname);
+ if (fwrite(buf, strlen(buf), 1, header_fd) != 1)
+ goto err;
+
+ snprintf(buf, sizeof(buf), H_CODEGEN_PROGRAM_CALLBACK_DEL, prefix,
+ apiname);
+ if (fwrite(buf, strlen(buf), 1, header_fd) != 1)
+ goto err;
+
+ return EINA_TRUE;
+
+ err:
+ ERR("Could not write the program [action]: %s", apiname);
+ return EINA_FALSE;
+}
+
+static char *
+_program_api_name_get(Evas_Object *ed, const char *program)
+{
+ const char *orig;
+ char *fix;
+
+ orig = edje_edit_program_api_name_get(ed, program);
+ fix = _api_name_fix(orig);
+ edje_edit_string_free(orig);
+
+ return fix;
+}
+
+static Eina_Bool
+_programs_parse(Evas_Object *ed)
+{
+ Eina_Bool ret = EINA_TRUE;
+ Eina_List *programs, *l;
+ const char *name, *source = NULL, *sig = NULL, *description;
+ char *apiname;
+ Edje_Action_Type type;
+
+ programs = edje_edit_programs_list_get(ed);
+ EINA_LIST_FOREACH(programs, l, name)
+ {
+ if (!(apiname = _program_api_name_get(ed, name)))
+ {
+ DBG("filter out program '%s': not API.", name);
+ continue;
+ }
+
+ description = edje_edit_program_api_description_get(ed, name);
+ type = edje_edit_program_action_get(ed, name);
+ if (type == EDJE_ACTION_TYPE_SIGNAL_EMIT)
+ {
+ const char *str, *str2;
+ str = edje_edit_program_state_get(ed, name);
+ str2 = edje_edit_program_state2_get(ed, name);
+
+ if (!_program_add_write(apiname, str2, str, description))
+ {
+ ret = EINA_FALSE;
+ edje_edit_string_free(str);
+ edje_edit_string_free(str2);
+ break;
+ }
+
+ edje_edit_string_free(str);
+ edje_edit_string_free(str2);
+ }
+
+ sig = edje_edit_program_signal_get(ed, name);
+ if (!sig) sig = eina_stringshare_add("");
+
+ source = edje_edit_program_source_get(ed, name);
+ if (!source) source = eina_stringshare_add("");
+
+ if (strlen (sig))
+ {
+ if (!_program_emit_write(apiname, source, sig, description))
+ {
+ ret = EINA_FALSE;
+ break;
+ }
+ }
+
+ edje_edit_string_free(description);
+ edje_edit_string_free(sig);
+ edje_edit_string_free(source);
+ free(apiname);
+ }
+
+ edje_edit_string_list_free(programs);
+ if (!ret)
+ {
+ edje_edit_string_free(description);
+ edje_edit_string_free(sig);
+ edje_edit_string_free(source);
+ free(apiname);
+ }
+
+ return ret;
+}
+
+static Eina_Bool
+_parse(void)
+{
+ Evas_Object *ed;
+ Eina_Bool ret;
+
+ ed = edje_edit_object_add(ecore_evas_get(ee));
+ if (!edje_object_file_set(ed, file, group))
+ {
+ Edje_Load_Error err = edje_object_load_error_get(ed);
+ const char *errmsg = edje_load_error_str(err);
+ ERR("could not load group '%s' from file '%s': %s",
+ group, file, errmsg);
+ evas_object_del(ed);
+ return EINA_FALSE;
+ }
+
+ ret = _parts_parse(ed) && _programs_parse(ed);
+
+ evas_object_del(ed);
+ return ret;
+}
+
+int
+main(int argc, char *argv[])
+{
+ Eina_Bool quit_option = EINA_FALSE;
+ char *source = NULL, *header = NULL;
+ int arg_index, ret = 0;
+ Ecore_Getopt_Value values[] = {
+ ECORE_GETOPT_VALUE_STR(prefix),
+ ECORE_GETOPT_VALUE_BOOL(quit_option),
+ ECORE_GETOPT_VALUE_BOOL(quit_option),
+ ECORE_GETOPT_VALUE_BOOL(quit_option),
+ ECORE_GETOPT_VALUE_BOOL(quit_option),
+ ECORE_GETOPT_VALUE_NONE
+ };
+
+ setlocale(LC_NUMERIC, "C");
+
+ eina_init();
+ ecore_init();
+ ecore_evas_init();
+ edje_init();
+
+ if (argc < 2)
+ {
+ fprintf(stderr, "Missing action. See '--help or -h'.\n");
+ ret = 1;
+ goto error_log;
+ }
+
+ _log_dom = eina_log_domain_register("elementary_codegen", EINA_COLOR_YELLOW);
+ if (_log_dom < 0)
+ {
+ EINA_LOG_CRIT("could not register log domain 'elementary_codegen'");
+ ret = 1;
+ goto error_log;
+ }
+
+ arg_index = ecore_getopt_parse(&optdesc, values, argc, argv);
+ if (arg_index < 0)
+ {
+ ERR("could not parse arguments.");
+ ret = 1;
+ goto error_getopt;
+ }
+ else if (quit_option) goto error_getopt;
+ else if (arg_index != argc - 4)
+ {
+ fprintf(stderr, "Incorrect number of parameters. Requires " \
+ "fours arguments, an edje, the group, " \
+ "the source output (foo.c) and the header(foo.h).\n" \
+ "See %s --help\n", argv[0]);
+ ret = 1;
+ goto error_getopt;
+ }
+
+ file = argv[arg_index++];
+
+ // check if the file is accessible
+ if (access(file, R_OK) == -1)
+ {
+ ERR("File '%s' not accessible, error %d (%s).\n",
+ file, errno, strerror(errno));
+ ret = 1;
+ goto error_getopt;
+ }
+
+ group = argv[arg_index++];
+ source = argv[arg_index++];
+ header = argv[arg_index++];
+
+ if (!edje_file_group_exists(file, group))
+ {
+ ERR("The group %s not exists", group);
+ ret = 2;
+ goto error_getopt;
+ }
+
+ ee = ecore_evas_buffer_new(1, 1);
+ if (!ee)
+ {
+ ERR("could not create ecore_evas_buffer");
+ ret = 3;
+ goto error_getopt;
+ }
+
+ if (!_file_descriptors_open(source, header))
+ {
+ ERR("Could not create the source files, error %d (%s)",
+ errno, strerror(errno));
+ ret = 4;
+ goto error_getopt;
+ }
+
+ if (!_headers_write(header))
+ {
+ ERR("Could not write the header, error %d (%s)",
+ errno, strerror(errno));
+ ret = 5;
+ goto error_getopt;
+ }
+
+ if (!_theme_set_write())
+ WRN("Theme set getter/setter not created. Group name: %s invalid.", group);
+
+ if (!_parse())
+ {
+ ERR("Could not parsing the EDJE");
+ ret = 6;
+ goto error_getopt;
+ }
+
+ if (!_footer_write(header))
+ {
+ ERR("Could not write the footer, error %d (%s)",
+ errno, strerror(errno));
+ ret = 7;
+ goto error_getopt;
+ }
+
+ if (!_file_descriptors_close())
+ {
+ ERR("Could not close the source files, error %d (%s)",
+ errno, strerror(errno));
+ ret = 8;
+ }
+
+error_getopt:
+ if (ee)
+ ecore_evas_free(ee);
+
+error_log:
+ edje_shutdown();
+ ecore_evas_shutdown();
+ ecore_shutdown();
+ eina_log_domain_unregister(_log_dom);
+ eina_shutdown();
+
+ if (ret > 4)
+ {
+ unlink(header);
+ unlink(source);
+ }
+
+ return ret;
+}
diff --git a/src/bin/elementary/elm_prefs_cc.c b/src/bin/elementary/elm_prefs_cc.c
new file mode 100644
index 0000000000..9f5da87bf9
--- /dev/null
+++ b/src/bin/elementary/elm_prefs_cc.c
@@ -0,0 +1,201 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <string.h>
+#include <locale.h>
+#include <limits.h>
+#include <sys/stat.h>
+
+#include "elm_prefs_cc.h"
+
+int _elm_prefs_cc_log_dom = -1;
+static void main_help(void);
+
+Eina_Prefix *pfx = NULL;
+char *file_in = NULL;
+const char *tmp_dir = NULL;
+char *file_out = NULL;
+
+static const char *progname = NULL;
+
+static void
+_elm_prefs_cc_log_cb(const Eina_Log_Domain *d,
+ Eina_Log_Level level,
+ const char *file,
+ const char *fnc,
+ int _line,
+ const char *fmt,
+ EINA_UNUSED void *data,
+ va_list args)
+{
+ if ((d->name) && (d->namelen == sizeof("elm_prefs_cc") - 1) &&
+ (memcmp(d->name, "elm_prefs_cc", sizeof("elm_prefs_cc") - 1) == 0))
+ {
+ const char *prefix;
+
+ eina_log_console_color_set(stderr, eina_log_level_color_get(level));
+ switch (level)
+ {
+ case EINA_LOG_LEVEL_CRITICAL:
+ prefix = "Critical. ";
+ break;
+
+ case EINA_LOG_LEVEL_ERR:
+ prefix = "Error. ";
+ break;
+
+ case EINA_LOG_LEVEL_WARN:
+ prefix = "Warning. ";
+ break;
+
+ default:
+ prefix = "";
+ }
+ fprintf(stderr, "%s: %s", progname, prefix);
+ eina_log_console_color_set(stderr, EINA_COLOR_RESET);
+
+ vfprintf(stderr, fmt, args);
+ putc('\n', stderr);
+ }
+ else
+ eina_log_print_cb_stderr(d, level, file, fnc, _line, fmt, NULL, args);
+}
+
+static void
+main_help(void)
+{
+ printf
+ ("Usage:\n"
+ "\t%s [OPTIONS] input_file.epc [output_file.epb]\n"
+ "\n"
+ "Where OPTIONS is one or more of:\n"
+ "\n"
+ "-v Verbose output\n"
+ , progname);
+}
+
+int
+main(int argc, char **argv)
+{
+ int i;
+ struct stat st;
+#ifdef HAVE_REALPATH
+ char rpath[PATH_MAX], rpath2[PATH_MAX];
+#endif
+
+ setlocale(LC_NUMERIC, "C");
+
+ if (!eina_init())
+ return -1;
+
+ _elm_prefs_cc_log_dom = eina_log_domain_register
+ ("elm_prefs_cc", ELM_PREFS_CC_DEFAULT_LOG_COLOR);
+ if (_elm_prefs_cc_log_dom < 0)
+ {
+ EINA_LOG_ERR("Unable to create a log domain.");
+ exit(-1);
+ }
+ if (!eina_log_domain_level_check(_elm_prefs_cc_log_dom, EINA_LOG_LEVEL_WARN))
+ eina_log_domain_level_set("elm_prefs_cc", EINA_LOG_LEVEL_WARN);
+
+ progname = ecore_file_file_get(argv[0]);
+ eina_log_print_cb_set(_elm_prefs_cc_log_cb, NULL);
+
+ tmp_dir = eina_environment_tmp_get();
+
+ for (i = 1; i < argc; i++)
+ {
+ if (!strcmp(argv[i], "-h"))
+ {
+ main_help();
+ exit(0);
+ }
+ else if (!strcmp(argv[i], "-v"))
+ {
+ eina_log_domain_level_set("elm_prefs_cc", EINA_LOG_LEVEL_INFO);
+ }
+ else if (!file_in)
+ file_in = argv[i];
+ else if (!file_out)
+ file_out = argv[i];
+ }
+
+ if (!file_in)
+ {
+ ERR("no input file specified.");
+ main_help();
+ exit(-1);
+ }
+
+ pfx = eina_prefix_new(argv[0], /* argv[0] value (optional) */
+ main, /* an optional symbol to check path of */
+ "ELM_PREFS", /* env var prefix to use (XXX_PREFIX, XXX_BIN_DIR etc. */
+ "elementary", /* dir to add after "share" (PREFIX/share/DIRNAME) */
+ "themes/default.edj", /* a magic file to check for in PREFIX/share/DIRNAME for success */
+ PACKAGE_BIN_DIR, /* package bin dir @ compile time */
+ PACKAGE_LIB_DIR, /* package lib dir @ compile time */
+ PACKAGE_DATA_DIR, /* package data dir @ compile time */
+ PACKAGE_DATA_DIR); /* if locale needed use LOCALE_DIR */
+
+ /* check whether file_in exists */
+#ifdef HAVE_REALPATH
+ if (!realpath(file_in, rpath) || stat(rpath, &st) || !S_ISREG(st.st_mode))
+#else
+ if (stat(file_in, &st) || !S_ISREG(st.st_mode))
+#endif
+ {
+ ERR("file not found: %s.", file_in);
+ main_help();
+ exit(-1);
+ }
+
+ if (!file_out)
+ {
+ char *suffix;
+
+ if ((suffix = strstr(file_in, ".epc")) && (suffix[4] == 0))
+ {
+ file_out = strdup(file_in);
+ if (file_out)
+ {
+ suffix = strstr(file_out, ".epc");
+ strcpy(suffix, ".epb");
+ }
+ }
+ }
+ if (!file_out)
+ {
+ ERR("no output file specified.");
+ main_help();
+ exit(-1);
+ }
+
+#ifdef HAVE_REALPATH
+ if (realpath(file_out, rpath2) && !strcmp(rpath, rpath2))
+#else
+ if (!strcmp(file_in, file_out))
+#endif
+ {
+ ERR("input file equals output file.");
+ main_help();
+ exit(-1);
+ }
+
+ elm_prefs_file = mem_alloc(SZ(Elm_Prefs_File));
+ elm_prefs_file->compiler = strdup("elm_prefs_cc");
+
+ compile();
+
+ data_init();
+ data_write();
+ data_shutdown();
+
+ eina_prefix_free(pfx);
+ pfx = NULL;
+
+ eina_log_domain_unregister(_elm_prefs_cc_log_dom);
+ eina_shutdown();
+
+ return 0;
+}
diff --git a/src/bin/elementary/elm_prefs_cc.h b/src/bin/elementary/elm_prefs_cc.h
new file mode 100644
index 0000000000..ef848babc8
--- /dev/null
+++ b/src/bin/elementary/elm_prefs_cc.h
@@ -0,0 +1,107 @@
+#ifndef ELM_PREFS_CC_H
+#define ELM_PREFS_CC_H
+
+#include <Elementary.h>
+
+#define ELM_INTERNAL_API_ARGESFSDFEFC
+#include "elm_priv.h"
+#include "elm_widget_prefs.h"
+
+extern Eina_Prefix *pfx;
+
+/*
+ * On Windows, if the file is not opened in binary mode,
+ * read does not return the correct size, because of
+ * CR / LF translation.
+ */
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+/* logging variables */
+extern int _elm_prefs_cc_log_dom;
+#define ELM_PREFS_CC_DEFAULT_LOG_COLOR EINA_COLOR_CYAN
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_elm_prefs_cc_log_dom, __VA_ARGS__)
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_elm_prefs_cc_log_dom, __VA_ARGS__)
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_elm_prefs_cc_log_dom, __VA_ARGS__)
+#ifdef CRI
+# undef CRI
+#endif
+#define CRI(...) EINA_LOG_DOM_CRIT(_elm_prefs_cc_log_dom, __VA_ARGS__)
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_elm_prefs_cc_log_dom, __VA_ARGS__)
+
+/* types */
+typedef struct _Elm_Prefs_File Elm_Prefs_File;
+typedef struct _New_Object_Handler New_Object_Handler;
+typedef struct _New_Statement_Handler New_Statement_Handler;
+
+struct _Elm_Prefs_File
+{
+ const char *compiler;
+
+ Eina_List *pages;
+};
+
+struct _New_Object_Handler
+{
+ const char *type;
+ void (*func)(void);
+};
+
+struct _New_Statement_Handler
+{
+ const char *type;
+ void (*func)(void);
+};
+
+/* global fn calls */
+void compile(void);
+char *parse_str(int n);
+int parse_enum(int n, ...);
+int parse_int(int n);
+int parse_int_range(int n, int f, int t);
+int parse_bool(int n);
+double parse_float(int n);
+void check_arg_count(int n);
+void check_regex(const char *regex);
+void set_verbatim(char *s, int l1, int l2);
+
+void data_init(void);
+void data_write(void);
+void data_shutdown(void);
+
+int object_handler_num(void);
+int statement_handler_num(void);
+
+void *mem_alloc(size_t size);
+char *mem_strdup(const char *s);
+#define SZ sizeof
+
+/* global vars */
+extern char *file_in;
+extern const char *tmp_dir;
+extern char *file_out;
+extern int line;
+extern Eina_List *stack;
+extern Eina_List *params;
+
+extern Elm_Prefs_File *elm_prefs_file;
+
+extern Eina_List *elm_prefs_pages;
+extern New_Object_Handler object_handlers[];
+extern New_Statement_Handler statement_handlers[];
+
+#endif
diff --git a/src/bin/elementary/elm_prefs_cc_handlers.c b/src/bin/elementary/elm_prefs_cc_handlers.c
new file mode 100644
index 0000000000..93577ed38f
--- /dev/null
+++ b/src/bin/elementary/elm_prefs_cc_handlers.c
@@ -0,0 +1,1218 @@
+/*
+ Concerning the EPC reference:
+
+ The formatting for blocks and properties has been implemented as a table
+ which is filled using ALIASES.
+ For maximum flexibility I implemented them in the \@code/\@encode style,
+ this means that missing one or changing the order most certainly cause
+ formatting errors.
+
+ \@block
+ block name
+ \@context
+ code sample of the block
+ \@description
+ the block's description
+ \@endblock
+
+ \@property
+ property name
+ \@parameters
+ property's parameter list
+ \@effect
+ the property description (lol)
+ \@endproperty
+*/
+
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <string.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#include "elm_prefs_cc.h"
+
+void check_min_arg_count(int min_required_args);
+int params_min_check(int n);
+
+/**
+ * @page epcref Elementary Prefs Data Collection Reference
+ * An Elementary Prefs Collection is a plain text file (normally
+ * identified with the .epc extension), consisting of instructions for the
+ * Elm Prefs Compiler.
+ *
+ * The syntax for the elementary prefs data files follows a simple structure of
+ * "blocks { .. }" that can contain "properties: ..", more blocks, or both.
+ *
+ * @anchor sec_quickaccess Quick access to block descriptions:
+ * <ul>
+ * <li>@ref sec_page "Page"</li>
+ * <li>@ref sec_items "Items"</li>
+ * <ul>
+ * <li>@ref sec_items_bool "Bool"</li>
+ * <li>@ref sec_items_int "Int"</li>
+ * <li>@ref sec_items_float "Float"</li>
+ * <li>@ref sec_items_date "Date"</li>
+ * <li>@ref sec_items_text "Text"</li>
+ * <li>@ref sec_items_textarea "Text Area"</li>
+ * </ul>
+ * </ul>
+ *
+ * @author Ricardo de Almeida Gonzaga (ricardotk) ricardo@profusion.mobi
+ *
+ * <table class="edcref" border="0">
+ */
+
+static Elm_Prefs_Page_Node *current_page = NULL;
+static Elm_Prefs_Item_Node *current_item = NULL;
+
+/* objects and statments */
+
+/* Collection */
+static void ob_collection(void);
+
+/**
+ @epcsection{page,Page}
+ */
+
+/**
+ @page epcref
+ @block
+ page
+ @context
+ collection {
+ ..
+ page {
+ name: "main";
+ version: 1;
+ title: "Preference Widgets";
+ subtitle: "Subtitle";
+ widget: "elm/vertical_frame";
+
+ items { }
+ }
+ ..
+ }
+ @description
+ A "page" block is a grouping of prefs items together. A prefs widget
+ must always be bound to a page, that can address other pages in the
+ collection too as @b sub-pages.
+ @endblock
+
+ @property
+ name
+ @parameters
+ [page name]
+ @effect
+ The name of the page (to be referred by the application). It must be
+ unique within the collection.
+ @endproperty
+
+ @property
+ version
+ @parameters
+ [page version]
+ @effect
+ The page's version.
+ @endproperty
+
+ @property
+ title
+ @parameters
+ [page title]
+ @effect
+ Set page's title.
+ @endproperty
+
+ @property
+ subtitle
+ @parameters
+ [page subtitle]
+ @effect
+ Set page's subtitle.
+ @endproperty
+
+ @property
+ widget
+ @parameters
+ [page widget]
+ @effect
+ Set the widget from among the available page widgets. Valid, built-in
+ page widgets are:
+ @li elm/horizontal_box
+ @li elm/vertical_box
+ @li elm/horizontal_frame
+ @li elm/vertical_frame
+ @endproperty
+
+ @property
+ style
+ @parameters
+ [page style]
+ @effect
+ Set page's style.
+ @endproperty
+
+ @property
+ icon
+ @parameters
+ [page icon]
+ @effect
+ Set page's icon.
+ @endproperty
+
+ @property
+ autosave
+ @parameters
+ [1 or 0]
+ @effect
+ Takes a boolean value specifying whether page is autosaved (1)
+ or not (0). The default value is 1.
+ @endproperty
+*/
+
+/* Page */
+static void ob_collection_page(void);
+static void st_collection_page_name(void);
+static void st_collection_page_version(void);
+static void st_collection_page_title(void);
+static void st_collection_page_subtitle(void);
+static void st_collection_page_widget(void);
+static void st_collection_page_style(void);
+static void st_collection_page_icon(void);
+static void st_collection_page_autosave(void);
+
+/**
+ @epcsection{items,Items}
+ */
+
+/**
+ @page epcref
+ @block
+ items
+ @context
+ page {
+ ..
+ items {
+ name: "item";
+ type: INT;
+ label: "Just a item label...";
+
+ type { }
+ }
+ ..
+ }
+
+ @description
+ An "item" block declares a new Prefs item, along with its properties.
+ @endblock
+
+ @property
+ name
+ @parameters
+ [item name]
+ @effect
+ The item's name, to be referred by the application. It must be unique
+ within the page.
+ @endproperty
+
+ @property
+ type
+ @parameters
+ [TYPE]
+ @effect
+ Set the type (all types must be entered in capitals) from among the
+ available types, that are:
+ @li BOOL - Checkbox.
+ @li INT - Slider.
+ @li FLOAT - Slider.
+ @li DATE - Date/time display and input widget.
+ @li TEXT - Single-line text entry.
+ @li TEXTAREA - Text entry.
+ @li LABEL - Read-only label.
+ @li PAGE - Prefs subpage object.
+ @li SEPARATOR - Line that serves only to divide and organize prefs
+ item.
+ @li SWALLOW - Swallows an Evas_Object.
+ @li SAVE - Button that will get all the values bounded to items and
+ save it on CFG file.
+ @li ACTION - Button that will emit a signal to .C file and call a
+ smart callback.
+ @li RESET - Button that will return all the values bounded to items
+ as default declared on .EPC file.
+ @endproperty
+
+ @property
+ label
+ @parameters
+ [a string to label]
+ @effect
+ Set a string to item's label.
+ @endproperty
+
+ @property
+ icon
+ @parameters
+ [item icon]
+ @effect
+ This is the item icon.
+ @endproperty
+
+ @property
+ persistent
+ @parameters
+ [1 or 0]
+ @effect
+ Takes a boolean value specifying whether item is persistent (1) or
+ not (0). The default value is 1. A non persistent item doesn't save
+ its values when saved.
+ @endproperty
+
+ @property
+ editable
+ @parameters
+ [1 or 0]
+ @effect
+ Takes a boolean value specifying whether item is editable (1)
+ or not (0). The default value is 1.
+ @endproperty
+
+ @property
+ visible
+ @parameters
+ [1 or 0]
+ @effect
+ Takes a boolean value specifying whether item is visible (1) or not (0).
+ The default value is 1.
+ @endproperty
+
+ @property
+ style
+ @parameters
+ [item style]
+ @effect
+ This is the item's style.
+ @endproperty
+
+ @property
+ widget
+ @parameters
+ [item widget]
+ @effect
+ This is the item's widget, for cases where a widget differs than the
+ default assigned to the type is desired.
+ @endproperty
+*/
+/* Items */
+
+static void ob_collection_page_items(void);
+
+static void ob_collection_page_items_item(void);
+static void st_collection_page_items_item_name(void);
+static void st_collection_page_items_item_type(void);
+static void st_collection_page_items_item_label(void);
+static void st_collection_page_items_item_icon(void);
+static void st_collection_page_items_item_persistent(void);
+static void st_collection_page_items_item_editable(void);
+static void st_collection_page_items_item_visible(void);
+static void st_collection_page_items_item_source(void);
+static void st_collection_page_items_item_style(void);
+static void st_collection_page_items_item_widget(void);
+
+/**
+ @epcsection{items_bool,Bool item sub blocks}
+ */
+
+/**
+ @page epcref
+
+ @block
+ bool
+ @context
+ item {
+ ..
+ bool {
+ default: true;
+ }
+ ..
+ }
+ @description
+ @endblock
+
+ @property
+ default
+ @parameters
+ [true or false]
+ @effect
+ Takes a boolean value specifying whether item is checked (true)
+ or not (false).
+ @endproperty
+*/
+
+/* Item: Bool */
+static void ob_collection_page_items_item_bool(void);
+static void st_collection_page_items_item_bool_default(void);
+
+/**
+ @epcsection{items_int,Int item sub blocks}
+ */
+
+/**
+ @page epcref
+
+ @block
+ int
+ @context
+ item {
+ ..
+ int {
+ default: 150;
+ min: 0;
+ max: 300;
+ }
+ ..
+ }
+ @description
+ @endblock
+
+ @property
+ default
+ @parameters
+ [value]
+ @effect
+ Set a default (initial) value to the item.
+ @endproperty
+
+ @property
+ min
+ @parameters
+ [value]
+ @effect
+ Set a minimum value to the item. Note that, without a minimum
+ value, the widget implementing the item visually will get an
+ available range of values bound to the minimum of the least
+ integer number representable, and it might not be what you
+ want.
+
+ @endproperty
+
+ @property
+ max
+ @parameters
+ [value]
+ @effect
+ Set a maximum value to the item. Note that, without a maximum
+ value, the widget implementing the item visually will get an
+ available range of values bound to the maximum of the least
+ integer number representable, and it might not be what you
+ want.
+ @endproperty
+*/
+
+/* Item: Integer */
+static void ob_collection_page_items_item_int(void);
+static void st_collection_page_items_item_int_default(void);
+static void st_collection_page_items_item_int_max(void);
+static void st_collection_page_items_item_int_min(void);
+
+/**
+ @epcsection{items_float,Float item sub blocks}
+ */
+
+/**
+ @page epcref
+
+ @block
+ float
+ @context
+ item {
+ ..
+ float {
+ default: 0.5;
+ min: 0;
+ max: 1;
+ }
+ ..
+ }
+ @description
+ @endblock
+
+ @property
+ default
+ @parameters
+ [value]
+ @effect
+ Set a default (initial) value to the item.
+ @endproperty
+
+ @property
+ min
+ @parameters
+ [value]
+ @effect
+ Set a minimum value to the item. Note that, without a minimum
+ value, the widget implementing the item visually will get an
+ available range of values bound to the minimum of the least
+ floating point number representable, and it might not be what you
+ want.
+ @endproperty
+
+ @property
+ max
+ @parameters
+ [value]
+ @effect
+ Set a maximum value to the item. Note that, without a maximum
+ value, the widget implementing the item visually will get an
+ available range of values bound to the maximum of the least
+ floating point number representable, and it might not be what you
+ want.
+ @endproperty
+*/
+
+/* Item: Float */
+static void ob_collection_page_items_item_float(void);
+static void st_collection_page_items_item_float_default(void);
+static void st_collection_page_items_item_float_max(void);
+static void st_collection_page_items_item_float_min(void);
+
+/**
+ @epcsection{items_date,Date item sub blocks}
+ */
+
+/**
+ @page epcref
+
+ @block
+ date
+ @context
+ item {
+ ..
+ date {
+ default: 2012 11 05;
+ min: 1900 1 1;
+ max: 2200 12 31;
+ }
+ ..
+ }
+ @description
+ @endblock
+
+ @property
+ default
+ @parameters
+ [year month date] or "today"
+ @effect
+ Set a default (initial) date to the item. "today" will translate
+ to current date.
+ @endproperty
+
+ @property
+ min
+ @parameters
+ [year month date] or "today"
+ @effect
+ Set a minimum date to the item. "today" will translate
+ to current date.
+ @endproperty
+
+ @property
+ max
+ @parameters
+ [year month date] or "today"
+ @effect
+ Set a maximum date to the item. "today" will translate
+ to current date.
+ @endproperty
+*/
+
+/* Item: Date */
+static void ob_collection_page_items_item_date(void);
+static void st_collection_page_items_item_date_default(void);
+static void st_collection_page_items_item_date_max(void);
+static void st_collection_page_items_item_date_min(void);
+
+/**
+ @epcsection{items_text,Text item sub blocks}
+ */
+
+/**
+ @page epcref
+
+ @block
+ text
+ @context
+ item {
+ ..
+ text {
+ default: "Default text";
+ placeholder: "Text:";
+ accept: "^[a-zA-Z ]$";
+ deny: "";
+ }
+ ..
+ }
+ @description
+ @endblock
+
+ @property
+ default
+ @parameters
+ [a string of text]
+ @effect
+ Set a default text.
+ @endproperty
+
+ @property
+ placeholder
+ @parameters
+ [a string of text]
+ @effect
+ Set a placeholder.
+ @endproperty
+
+ @property
+ accept
+ @parameters
+ [regular expression]
+ @effect
+ Set an acceptance regular expression. It must be a valid one.
+ @endproperty
+
+ @property
+ deny
+ @parameters
+ [regular expression]
+ @effect
+ Set a denial regular expression. It must be a valid one.
+ @endproperty
+*/
+
+/**
+ @epcsection{items_textarea,Text Area item sub blocks}
+ */
+
+/**
+ @page epcref
+
+ @block
+ textarea
+ @context
+ item {
+ ..
+ textarea {
+ default: "Default text";
+ placeholder: "No Numbers!";
+ accept: "";
+ deny: "^[0-9]*$";
+ }
+ ..
+ }
+ @description
+ @endblock
+
+ @property
+ default
+ @parameters
+ [a string of text]
+ @effect
+ Set a default text.
+ @endproperty
+
+ @property
+ placeholder
+ @parameters
+ [a string of text]
+ @effect
+ Set a placeholder.
+ @endproperty
+
+ @property
+ accept
+ @parameters
+ [regular expression]
+ @effect
+ Set an acceptance regular expression. It must be a valid one.
+ @endproperty
+
+ @property
+ deny
+ @parameters
+ [regular expression]
+ @effect
+ Set a denial regular expression. It must be a valid one.
+ @endproperty
+*/
+
+/* Item: Text and Text Area */
+static void ob_collection_page_items_item_text(void);
+static void ob_collection_page_items_item_textarea(void);
+
+/* String shared statements */
+static void st_collection_page_items_item_string_default(void);
+static void st_collection_page_items_item_string_placeholder(void);
+static void st_collection_page_items_item_string_accept(void);
+static void st_collection_page_items_item_string_deny(void);
+static void st_collection_page_items_item_string_max(void);
+static void st_collection_page_items_item_string_min(void);
+
+/* Statement Array */
+New_Statement_Handler statement_handlers[] =
+{
+ {"collection.page.name", st_collection_page_name},
+ {"collection.page.name", st_collection_page_name},
+ {"collection.page.version", st_collection_page_version},
+ {"collection.page.title", st_collection_page_title},
+ {"collection.page.subtitle", st_collection_page_subtitle},
+ {"collection.page.widget", st_collection_page_widget},
+ {"collection.page.style", st_collection_page_style},
+ {"collection.page.icon", st_collection_page_icon},
+ {"collection.page.autosave", st_collection_page_autosave},
+
+ {"collection.page.items.item.name", st_collection_page_items_item_name},
+ {"collection.page.items.item.type", st_collection_page_items_item_type},
+ {"collection.page.items.item.label", st_collection_page_items_item_label},
+ {"collection.page.items.item.icon", st_collection_page_items_item_icon},
+ {"collection.page.items.item.persistent", st_collection_page_items_item_persistent},
+ {"collection.page.items.item.editable", st_collection_page_items_item_editable},
+ {"collection.page.items.item.visible", st_collection_page_items_item_visible},
+ {"collection.page.items.item.source", st_collection_page_items_item_source},
+ {"collection.page.items.item.style", st_collection_page_items_item_style},
+ {"collection.page.items.item.widget", st_collection_page_items_item_widget},
+
+ {"collection.page.items.item.bool.default", st_collection_page_items_item_bool_default},
+
+ {"collection.page.items.item.int.default", st_collection_page_items_item_int_default},
+ {"collection.page.items.item.int.max", st_collection_page_items_item_int_max},
+ {"collection.page.items.item.int.min", st_collection_page_items_item_int_min},
+
+ {"collection.page.items.item.float.default", st_collection_page_items_item_float_default},
+ {"collection.page.items.item.float.max", st_collection_page_items_item_float_max},
+ {"collection.page.items.item.float.min", st_collection_page_items_item_float_min},
+
+ {"collection.page.items.item.date.default", st_collection_page_items_item_date_default},
+ {"collection.page.items.item.date.max", st_collection_page_items_item_date_max},
+ {"collection.page.items.item.date.min", st_collection_page_items_item_date_min},
+
+ {"collection.page.items.item.text.placeholder", st_collection_page_items_item_string_placeholder},
+ {"collection.page.items.item.text.default", st_collection_page_items_item_string_default},
+ {"collection.page.items.item.text.accept", st_collection_page_items_item_string_accept},
+ {"collection.page.items.item.text.deny", st_collection_page_items_item_string_deny},
+ {"collection.page.items.item.text.max", st_collection_page_items_item_string_max},
+ {"collection.page.items.item.text.min", st_collection_page_items_item_string_min},
+
+ {"collection.page.items.item.textarea.placeholder", st_collection_page_items_item_string_placeholder},
+ {"collection.page.items.item.textarea.default", st_collection_page_items_item_string_default},
+ {"collection.page.items.item.textarea.accept", st_collection_page_items_item_string_accept},
+ {"collection.page.items.item.textarea.deny", st_collection_page_items_item_string_deny},
+ {"collection.page.items.item.textarea.max", st_collection_page_items_item_string_max},
+ {"collection.page.items.item.textarea.min", st_collection_page_items_item_string_min}
+};
+
+/* Object Array */
+New_Object_Handler object_handlers[] =
+{
+ {"collection", ob_collection},
+ {"collection.page", ob_collection_page},
+
+ {"collection.page.items", ob_collection_page_items},
+ {"collection.page.items.item", ob_collection_page_items_item},
+ {"collection.page.items.item.bool", ob_collection_page_items_item_bool},
+ {"collection.page.items.item.int", ob_collection_page_items_item_int},
+ {"collection.page.items.item.float", ob_collection_page_items_item_float},
+ {"collection.page.items.item.date", ob_collection_page_items_item_date},
+ {"collection.page.items.item.text", ob_collection_page_items_item_text},
+ {"collection.page.items.item.textarea", ob_collection_page_items_item_textarea}
+};
+
+int
+object_handler_num(void)
+{
+ return sizeof(object_handlers) / sizeof (New_Object_Handler);
+}
+
+int
+statement_handler_num(void)
+{
+ return sizeof(statement_handlers) / sizeof (New_Object_Handler);
+}
+
+static void
+ob_collection(void)
+{
+ // NULL
+}
+
+static void
+ob_collection_page(void)
+{
+ current_page = mem_alloc(SZ(Elm_Prefs_Page_Node));
+ if (current_page)
+ elm_prefs_file->pages =
+ eina_list_append(elm_prefs_file->pages, current_page);
+}
+
+static void
+st_collection_page_name(void)
+{
+ check_arg_count(1);
+
+ current_page->name = parse_str(0);
+
+ //TODO: check for duplicated name entries.
+}
+
+static void
+st_collection_page_version(void)
+{
+ check_arg_count(1);
+
+ current_page->version = parse_int(0);
+}
+
+static void
+st_collection_page_title(void)
+{
+ check_arg_count(1);
+
+ current_page->title = parse_str(0);
+}
+
+static void
+st_collection_page_subtitle(void)
+{
+ check_arg_count(1);
+
+ current_page->sub_title = parse_str(0);
+}
+
+static void
+st_collection_page_widget(void)
+{
+ check_arg_count(1);
+
+ current_page->widget = parse_str(0);
+}
+
+static void
+st_collection_page_style(void)
+{
+ check_arg_count(1);
+
+ current_page->style = parse_str(0);
+}
+
+static void
+st_collection_page_icon(void)
+{
+ check_arg_count(1);
+
+ current_page->icon = parse_str(0);
+}
+
+static void
+st_collection_page_autosave(void)
+{
+ check_arg_count(1);
+
+ current_page->autosave = parse_bool(0);
+}
+
+static void
+ob_collection_page_items(void)
+{
+ // NULL
+}
+
+static void
+ob_collection_page_items_item(void)
+{
+ current_item = mem_alloc(SZ(Elm_Prefs_Item_Node));
+ if (current_item)
+ {
+ current_item->visible = EINA_TRUE;
+ current_item->persistent = EINA_TRUE;
+ current_item->editable = EINA_TRUE;
+ current_page->items =
+ eina_list_append(current_page->items, current_item);
+ }
+}
+
+static void
+st_collection_page_items_item_name(void)
+{
+ check_arg_count(1);
+
+ current_item->name = parse_str(0);
+}
+
+static void
+st_collection_page_items_item_type(void)
+{
+ check_arg_count(1);
+
+ current_item->type = parse_enum(0,
+ "ACTION", ELM_PREFS_TYPE_ACTION,
+ "BOOL", ELM_PREFS_TYPE_BOOL,
+ "INT", ELM_PREFS_TYPE_INT,
+ "FLOAT", ELM_PREFS_TYPE_FLOAT,
+ "DATE", ELM_PREFS_TYPE_DATE,
+ "LABEL", ELM_PREFS_TYPE_LABEL,
+ "PAGE", ELM_PREFS_TYPE_PAGE,
+ "TEXT", ELM_PREFS_TYPE_TEXT,
+ "TEXTAREA", ELM_PREFS_TYPE_TEXTAREA,
+ "RESET", ELM_PREFS_TYPE_RESET,
+ "SAVE", ELM_PREFS_TYPE_SAVE,
+ "SEPARATOR", ELM_PREFS_TYPE_SEPARATOR,
+ "SWALLOW", ELM_PREFS_TYPE_SWALLOW,
+ NULL);
+
+ switch (current_item->type)
+ {
+ case ELM_PREFS_TYPE_ACTION:
+ case ELM_PREFS_TYPE_LABEL:
+ case ELM_PREFS_TYPE_RESET:
+ case ELM_PREFS_TYPE_SEPARATOR:
+ case ELM_PREFS_TYPE_SWALLOW:
+ current_item->editable = EINA_FALSE;
+ current_item->persistent = EINA_FALSE;
+ break;
+
+ case ELM_PREFS_TYPE_INT:
+ current_item->spec.i.max = INT_MAX;
+ current_item->spec.i.min = INT_MIN;
+ break;
+
+ case ELM_PREFS_TYPE_FLOAT:
+ current_item->spec.f.max = FLT_MAX;
+ current_item->spec.f.min = -FLT_MAX;
+ break;
+
+ case ELM_PREFS_TYPE_DATE:
+ {
+ time_t t = time(NULL);
+ struct tm *lt = localtime(&t);
+
+ current_item->spec.d.def.y = lt->tm_year + 1900;
+ current_item->spec.d.def.m = lt->tm_mon + 1;
+ current_item->spec.d.def.d = lt->tm_mday;
+
+ current_item->spec.d.min.y = 1900;
+ current_item->spec.d.min.m = 1;
+ current_item->spec.d.min.d = 1;
+
+ current_item->spec.d.max.y = 10000 - 1900;
+ current_item->spec.d.max.m = 1;
+ current_item->spec.d.max.d = 1;
+ }
+ break;
+
+ case ELM_PREFS_TYPE_TEXT:
+ case ELM_PREFS_TYPE_TEXTAREA:
+ current_item->spec.s.length.max = INT_MAX;
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void
+st_collection_page_items_item_label(void)
+{
+ check_arg_count(1);
+
+ current_item->label = parse_str(0);
+}
+
+static void
+st_collection_page_items_item_icon(void)
+{
+ check_arg_count(1);
+
+ current_item->icon = parse_str(0);
+}
+
+static void
+st_collection_page_items_item_persistent(void)
+{
+ check_arg_count(1);
+
+ current_item->persistent = parse_bool(0);
+}
+
+static void
+st_collection_page_items_item_editable(void)
+{
+ check_arg_count(1);
+
+ current_item->editable = parse_bool(0);
+}
+
+static void
+st_collection_page_items_item_visible(void)
+{
+ check_arg_count(1);
+
+ current_item->visible = parse_bool(0);
+}
+
+static void
+st_collection_page_items_item_source(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.p.source = parse_str(0);
+}
+
+static void
+st_collection_page_items_item_style(void)
+{
+ check_arg_count(1);
+
+ current_item->style = parse_str(0);
+}
+
+static void
+st_collection_page_items_item_widget(void)
+{
+ check_arg_count(1);
+
+ current_item->widget = parse_str(0);
+}
+
+static void
+ob_collection_page_items_item_bool(void)
+{
+ //TODO: check if current item type match
+}
+
+static void
+st_collection_page_items_item_bool_default(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.b.def = parse_bool(0);
+}
+
+static void
+ob_collection_page_items_item_int(void)
+{
+ //TODO: check if current item type match
+}
+
+static void
+st_collection_page_items_item_int_default(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.i.def = parse_int(0);
+}
+
+static void
+st_collection_page_items_item_int_max(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.i.max = parse_int(0);
+}
+
+static void
+st_collection_page_items_item_int_min(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.i.min = parse_int(0);
+}
+
+static void
+ob_collection_page_items_item_float(void)
+{
+ //TODO: check if current item type match
+}
+
+static void
+st_collection_page_items_item_float_default(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.f.def = parse_float(0);
+}
+
+static void
+st_collection_page_items_item_float_max(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.f.max = parse_float(0);
+}
+
+static void
+st_collection_page_items_item_float_min(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.f.min = parse_float(0);
+}
+
+static void
+ob_collection_page_items_item_date(void)
+{
+ //TODO: check if current item type match
+}
+
+static void
+st_collection_page_items_item_date_default(void)
+{
+ check_min_arg_count(1);
+
+ if (params_min_check(1))
+ {
+ check_arg_count(3);
+
+ current_item->spec.d.def.y = parse_int_range(0, 1900, 10000);
+ current_item->spec.d.def.m = parse_int_range(1, 1, 12);
+ current_item->spec.d.def.d = parse_int_range(2, 1, 31);
+ }
+ else
+ {
+ const char *date = parse_str(0);
+ if (!strcasecmp(date, "today"))
+ {
+ time_t t = time(NULL);
+ struct tm *lt = localtime(&t);
+
+ current_item->spec.d.def.y = lt->tm_year + 1900;
+ current_item->spec.d.def.m = lt->tm_mon + 1;
+ current_item->spec.d.def.d = lt->tm_mday;
+ }
+ free((void *)date);
+ }
+}
+
+static void
+st_collection_page_items_item_date_max(void)
+{
+ check_min_arg_count(1);
+
+ if (params_min_check(1))
+ {
+ check_arg_count(3);
+
+ current_item->spec.d.max.y = parse_int_range(0, 1900, 10000);
+ current_item->spec.d.max.m = parse_int_range(1, 1, 12);
+ current_item->spec.d.max.d = parse_int_range(2, 1, 31);
+ }
+ else
+ {
+ const char *date = parse_str(0);
+ if (!strcasecmp(date, "today"))
+ {
+ time_t t = time(NULL);
+ struct tm *lt = localtime(&t);
+
+ current_item->spec.d.max.y = lt->tm_year + 1900;
+ current_item->spec.d.max.m = lt->tm_mon + 1;
+ current_item->spec.d.max.d = lt->tm_mday;
+ }
+ free((void *)date);
+ }
+}
+
+static void
+st_collection_page_items_item_date_min(void)
+{
+ check_min_arg_count(1);
+
+ if (params_min_check(1))
+ {
+ check_arg_count(3);
+
+ current_item->spec.d.min.y = parse_int_range(0, 1900, 10000);
+ current_item->spec.d.min.m = parse_int_range(1, 1, 12);
+ current_item->spec.d.min.d = parse_int_range(2, 1, 31);
+ }
+ else
+ {
+ const char *date = parse_str(0);
+ if (!strcasecmp(date, "today"))
+ {
+ time_t t = time(NULL);
+ struct tm *lt = localtime(&t);
+
+ current_item->spec.d.min.y = lt->tm_year + 1900;
+ current_item->spec.d.min.m = lt->tm_mon + 1;
+ current_item->spec.d.min.d = lt->tm_mday;
+ }
+ free((void *)date);
+ }
+}
+
+static void
+ob_collection_page_items_item_text(void)
+{
+ //TODO: check if current item type match
+}
+
+static void
+ob_collection_page_items_item_textarea(void)
+{
+ //todo: check if current item type match
+}
+
+static void
+st_collection_page_items_item_string_placeholder(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.s.placeholder = parse_str(0);
+}
+
+static void
+st_collection_page_items_item_string_default(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.s.def = parse_str(0);
+}
+
+static void
+st_collection_page_items_item_string_accept(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.s.accept = parse_str(0);
+
+ check_regex(current_item->spec.s.accept);
+}
+
+static void
+st_collection_page_items_item_string_deny(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.s.deny = parse_str(0);
+
+ check_regex(current_item->spec.s.deny);
+}
+
+static void
+st_collection_page_items_item_string_max(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.s.length.max = parse_int(0);
+}
+
+static void
+st_collection_page_items_item_string_min(void)
+{
+ check_arg_count(1);
+
+ current_item->spec.s.length.min = parse_int(0);
+}
diff --git a/src/bin/elementary/elm_prefs_cc_mem.c b/src/bin/elementary/elm_prefs_cc_mem.c
new file mode 100644
index 0000000000..3e269d3674
--- /dev/null
+++ b/src/bin/elementary/elm_prefs_cc_mem.c
@@ -0,0 +1,35 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <string.h>
+#include <errno.h>
+
+#include "elm_prefs_cc.h"
+
+void *
+mem_alloc(size_t size)
+{
+ void *mem;
+
+ mem = calloc(1, size);
+ if (mem) return mem;
+ ERR("%s:%i memory allocation of %zu bytes failed. %s",
+ file_in, line, size, strerror(errno));
+ exit(-1);
+ return NULL;
+}
+
+char *
+mem_strdup(const char *s)
+{
+ void *str;
+
+ str = strdup(s);
+ if (str) return str;
+ ERR("%s:%i memory allocation of %zu bytes failed. %s. string "
+ "being duplicated: \"%s\"",
+ file_in, line, strlen(s) + 1, strerror(errno), s);
+ exit(-1);
+ return NULL;
+}
diff --git a/src/bin/elementary/elm_prefs_cc_out.c b/src/bin/elementary/elm_prefs_cc_out.c
new file mode 100644
index 0000000000..8913b71712
--- /dev/null
+++ b/src/bin/elementary/elm_prefs_cc_out.c
@@ -0,0 +1,52 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include "elm_prefs_cc.h"
+#include "elm_prefs_edd.x"
+
+Elm_Prefs_File *elm_prefs_file = NULL;
+
+void
+data_init()
+{
+ eet_init();
+ _elm_prefs_descriptors_init();
+}
+
+void
+data_shutdown()
+{
+ _elm_prefs_descriptors_shutdown();
+ eet_shutdown();
+}
+
+void
+data_write()
+{
+ Eina_List *l;
+ Eet_File *ef;
+ Elm_Prefs_Page_Node *page;
+
+ if (!elm_prefs_file || !elm_prefs_file->pages)
+ {
+ ERR("No data to put in \"%s\"", file_out);
+ exit(-1);
+ }
+
+ ef = eet_open(file_out, EET_FILE_MODE_WRITE);
+ if (!ef)
+ {
+ ERR("Unable to open \"%s\" for writing output", file_out);
+ exit(-1);
+ }
+
+ EINA_LIST_FOREACH (elm_prefs_file->pages, l, page)
+ {
+ if (!(eet_data_write
+ (ef, _page_edd, page->name, page, EET_COMPRESSION_DEFAULT)))
+ ERR("Failed to write page %s to file %s", page->name, file_out);
+ }
+
+ eet_close(ef);
+}
diff --git a/src/bin/elementary/elm_prefs_cc_parse.c b/src/bin/elementary/elm_prefs_cc_parse.c
new file mode 100644
index 0000000000..5fda91eed1
--- /dev/null
+++ b/src/bin/elementary/elm_prefs_cc_parse.c
@@ -0,0 +1,1401 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef __cplusplus
+extern "C"
+# endif
+void *alloca(size_t);
+#endif
+
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <math.h>
+#include <regex.h>
+
+#include "elm_prefs_cc.h"
+#include <Ecore.h>
+#include <Ecore_File.h>
+
+#ifdef _WIN32
+# define EPP_EXT ".exe"
+#else
+# define EPP_EXT
+#endif
+
+static void new_object(void);
+static void new_statement(void);
+static char *perform_math(char *input);
+static int isdelim(char c);
+static char *next_token(char *p, char *end, char **new_p, int *delim);
+static const char *stack_id(void);
+static void parse(char *data, off_t size);
+
+/* simple expression parsing protos */
+static int my_atoi(const char *s);
+static char *_alphai(char *s, int *val);
+static char *_betai(char *s, int *val);
+static char *_gammai(char *s, int *val);
+static char *_deltai(char *s, int *val);
+static char *_get_numi(char *s, int *val);
+static int _is_numi(char c);
+static int _is_op1i(char c);
+static int _is_op2i(char c);
+static int _calci(char op, int a, int b);
+
+static double my_atof(const char *s);
+static char *_alphaf(char *s, double *val);
+static char *_betaf(char *s, double *val);
+static char *_gammaf(char *s, double *val);
+static char *_deltaf(char *s, double *val);
+static char *_get_numf(char *s, double *val);
+static int _is_numf(char c);
+static int _is_op1f(char c);
+static int _is_op2f(char c);
+static double _calcf(char op, double a, double b);
+static int strstrip(const char *in, char *out, size_t size);
+
+int line = 0;
+Eina_List *stack = NULL;
+Eina_List *params = NULL;
+
+static char file_buf[4096];
+static int verbatim = 0;
+static int verbatim_line1 = 0;
+static int verbatim_line2 = 0;
+static char *verbatim_str = NULL;
+static Eina_Strbuf *stack_buf = NULL;
+
+static void
+err_show_stack(void)
+{
+ const char *s;
+
+ s = stack_id();
+ if (s)
+ ERR("PARSE STACK:\n%s", s);
+ else
+ ERR("NO PARSE STACK");
+}
+
+static void
+err_show_params(void)
+{
+ Eina_List *l;
+ char *p;
+
+ ERR("PARAMS:");
+ EINA_LIST_FOREACH(params, l, p)
+ {
+ ERR(" %s", p);
+ }
+}
+
+static void
+err_show(void)
+{
+ err_show_stack();
+ err_show_params();
+}
+
+static char *
+_parse_param_get(int n)
+{
+ if (n < (int) eina_list_count(params))
+ return eina_list_nth(params, n);
+ return NULL;
+}
+
+static Eina_Hash *_new_object_hash = NULL;
+static Eina_Hash *_new_statement_hash = NULL;
+
+static void
+fill_object_statement_hashes(void)
+{
+ int i, n;
+
+ if (_new_object_hash) return;
+
+ _new_object_hash = eina_hash_string_superfast_new(NULL);
+ _new_statement_hash = eina_hash_string_superfast_new(NULL);
+
+ n = object_handler_num();
+ for (i = 0; i < n; i++)
+ {
+ eina_hash_direct_add(_new_object_hash, object_handlers[i].type,
+ &(object_handlers[i]));
+ }
+ n = statement_handler_num();
+ for (i = 0; i < n; i++)
+ {
+ eina_hash_direct_add(_new_statement_hash, statement_handlers[i].type,
+ &(statement_handlers[i]));
+ }
+}
+
+static void
+new_object(void)
+{
+ const char *id;
+ New_Object_Handler *oh;
+ New_Statement_Handler *sh;
+
+ fill_object_statement_hashes();
+ id = stack_id();
+ oh = eina_hash_find(_new_object_hash, id);
+ if (oh)
+ {
+ if (oh->func) oh->func();
+ }
+ else
+ {
+ sh = eina_hash_find(_new_statement_hash, id);
+ if (!sh)
+ {
+ ERR("%s:%i unhandled keyword %s",
+ file_in, line - 1,
+ (char *)eina_list_data_get(eina_list_last(stack)));
+ err_show();
+ exit(-1);
+ }
+ }
+}
+
+static void
+new_statement(void)
+{
+ const char *id;
+ New_Statement_Handler *sh;
+
+ fill_object_statement_hashes();
+ id = stack_id();
+ sh = eina_hash_find(_new_statement_hash, id);
+ if (sh)
+ {
+ if (sh->func) sh->func();
+ }
+ else
+ {
+ ERR("%s:%i unhandled keyword %s",
+ file_in, line - 1,
+ (char *)eina_list_data_get(eina_list_last(stack)));
+ err_show();
+ exit(-1);
+ }
+}
+
+static char *
+perform_math(char *input)
+{
+ char buf[256];
+ double res;
+
+ /* FIXME
+ * Always apply floating-point arithmetic.
+ * Does this cause problems for integer parameters? (yes it will)
+ *
+ * What we should do is, loop over the string and figure out whether
+ * there are floating point operands, too and then switch to
+ * floating point math.
+ */
+ res = my_atof(input);
+ snprintf(buf, sizeof (buf), "%lf", res);
+ return strdup(buf);
+}
+
+static int
+isdelim(char c)
+{
+ const char *delims = "{},;:";
+ char *d;
+
+ d = (char *)delims;
+ while (*d)
+ {
+ if (c == *d) return 1;
+ d++;
+ }
+ return 0;
+}
+
+static char *
+next_token(char *p, char *end, char **new_p, int *delim)
+{
+ char *tok_start = NULL, *tok_end = NULL, *tok = NULL, *sa_start = NULL;
+ int in_tok = 0;
+ int in_quote = 0;
+ int in_parens = 0;
+ int in_comment_ss = 0;
+ int in_comment_cpp = 0;
+ int in_comment_sa = 0;
+ int had_quote = 0;
+ int is_escaped = 0;
+
+ *delim = 0;
+ if (p >= end) return NULL;
+ while (p < end)
+ {
+ if (*p == '\n')
+ {
+ in_comment_ss = 0;
+ in_comment_cpp = 0;
+ line++;
+ }
+ if ((!in_comment_ss) && (!in_comment_sa))
+ {
+ if ((!in_quote) && (*p == '/') && (p < (end - 1)) && (*(p + 1) == '/'))
+ in_comment_ss = 1;
+ if ((!in_quote) && (*p == '#'))
+ in_comment_cpp = 1;
+ if ((!in_quote) && (*p == '/') && (p < (end - 1)) && (*(p + 1) == '*'))
+ {
+ in_comment_sa = 1;
+ sa_start = p;
+ }
+ }
+ if ((in_comment_cpp) && (*p == '#'))
+ {
+ char *pp, fl[4096];
+ char *tmpstr = NULL;
+ int l, nm;
+
+ /* handle cpp comments */
+ /* their line format is
+ * #line <line no. of next line> <filename from next line on> [??]
+ */
+
+ pp = p;
+ while ((pp < end) && (*pp != '\n'))
+ {
+ pp++;
+ }
+ l = pp - p;
+ tmpstr = alloca(l + 1);
+ if (!tmpstr)
+ {
+ ERR("%s:%i malloc %i bytes failed",
+ file_in, line - 1, l + 1);
+ exit(-1);
+ }
+ strncpy(tmpstr, p, l);
+ tmpstr[l] = 0;
+ l = sscanf(tmpstr, "%*s %i \"%[^\"]\"", &nm, fl);
+ if (l == 2)
+ {
+ strcpy(file_buf, fl);
+ line = nm;
+ file_in = file_buf;
+ }
+ }
+ else if ((!in_comment_ss) && (!in_comment_sa) && (!in_comment_cpp))
+ {
+ if (!in_tok)
+ {
+ if (!in_quote)
+ {
+ if (!isspace(*p))
+ {
+ if (*p == '"')
+ {
+ in_quote = 1;
+ had_quote = 1;
+ }
+ else if (*p == '(')
+ in_parens++;
+
+ in_tok = 1;
+ tok_start = p;
+ if (isdelim(*p)) *delim = 1;
+ }
+ }
+ }
+ else
+ {
+ if (in_quote)
+ {
+ if ((*p) == '\\')
+ is_escaped = !is_escaped;
+ else if (((*p) == '"') && (!is_escaped))
+ {
+ in_quote = 0;
+ had_quote = 1;
+ }
+ else if (is_escaped)
+ is_escaped = 0;
+ }
+ else if (in_parens)
+ {
+ if (((*p) == ')') && (!is_escaped))
+ in_parens--;
+ }
+ else
+ {
+ if (*p == '"')
+ {
+ in_quote = 1;
+ had_quote = 1;
+ }
+ else if (*p == '(')
+ in_parens++;
+
+ /* check for end-of-token */
+ if (
+ (isspace(*p)) ||
+ ((*delim) && (!isdelim(*p))) ||
+ (isdelim(*p))
+ ) /*the line below this is never used because it skips to
+ * the 'done' label which is after the return call for
+ * in_tok being 0. is this intentional?
+ */
+ {
+ in_tok = 0;
+
+ tok_end = p - 1;
+ if (*p == '\n') line--;
+ goto done;
+ }
+ }
+ }
+ }
+ if (in_comment_sa)
+ {
+ if ((*p == '/') && (*(p - 1) == '*') && ((p - sa_start) > 2))
+ in_comment_sa = 0;
+ }
+ p++;
+ }
+ if (!in_tok) return NULL;
+ tok_end = p - 1;
+
+done:
+ *new_p = p;
+
+ tok = mem_alloc(tok_end - tok_start + 2);
+ if (!tok) return NULL;
+ strncpy(tok, tok_start, tok_end - tok_start + 1);
+ tok[tok_end - tok_start + 1] = 0;
+
+ if (had_quote)
+ {
+ is_escaped = 0;
+ p = tok;
+
+ while (*p)
+ {
+ if ((*p == '\"') && (!is_escaped))
+ {
+ memmove(p, p + 1, strlen(p));
+ }
+ else if ((*p == '\\') && (*(p + 1) == 'n'))
+ {
+ memmove(p, p + 1, strlen(p));
+ *p = '\n';
+ }
+ else if ((*p == '\\') && (*(p + 1) == 't'))
+ {
+ memmove(p, p + 1, strlen(p));
+ *p = '\t';
+ }
+ else if (*p == '\\')
+ {
+ memmove(p, p + 1, strlen(p));
+ if (*p == '\\') p++;
+ else is_escaped = 1;
+ }
+ else
+ {
+ if (is_escaped) is_escaped = 0;
+ p++;
+ }
+ }
+ }
+ else if (*tok == '(')
+ {
+ char *tmp;
+ tmp = tok;
+ tok = perform_math(tok);
+ free(tmp);
+ }
+
+ return tok;
+}
+
+static void
+stack_push(char *token)
+{
+ if (stack) eina_strbuf_append(stack_buf, ".");
+ eina_strbuf_append(stack_buf, token);
+
+ stack = eina_list_append(stack, token);
+}
+
+static void
+stack_pop(void)
+{
+ char *top;
+ int top_length;
+
+ if (!stack)
+ {
+ ERR("parse error %s:%i. } marker without matching { marker",
+ file_in, line - 1);
+
+ err_show();
+ exit(-1);
+ }
+
+ top = eina_list_data_get(eina_list_last(stack));
+ top_length = strlen(top);
+
+ stack = eina_list_remove_list(stack, eina_list_last(stack));
+
+ if (eina_list_count(stack)) top_length++; // remove '.' as well.
+
+ eina_strbuf_remove(stack_buf,
+ eina_strbuf_length_get(stack_buf) - top_length,
+ eina_strbuf_length_get(stack_buf));
+
+ free(top);
+}
+
+static const char *
+stack_id(void)
+{
+ return eina_strbuf_string_get(stack_buf);
+}
+
+static void
+parse(char *data, off_t size)
+{
+ char *p, *end, *token;
+ int delim = 0;
+ int do_params = 0;
+
+ DBG("Parsing input file");
+
+ p = data;
+ end = data + size;
+ line = 1;
+ while ((token = next_token(p, end, &p, &delim)))
+ {
+ /* if we are in param mode, the only delimiter
+ * we'll accept is the semicolon
+ */
+ if (do_params && delim && *token != ';')
+ {
+ ERR("parse error %s:%i. %c marker before ; marker",
+ file_in, line - 1, *token);
+ err_show();
+ exit(-1);
+ }
+ else if (delim)
+ {
+ if (*token == ',' || *token == ':') do_params = 1;
+ else if (*token == '}')
+ {
+ if (do_params)
+ {
+ ERR("Parse error %s:%i. } marker before ; marker",
+ file_in, line - 1);
+ err_show();
+ exit(-1);
+ }
+ else
+ stack_pop();
+ }
+ else if (*token == ';')
+ {
+ if (do_params)
+ {
+ do_params = 0;
+ new_statement();
+ /* clear out params */
+ while (params)
+ {
+ free(eina_list_data_get(params));
+ params = eina_list_remove(params, eina_list_data_get(params));
+ }
+ /* remove top from stack */
+ stack_pop();
+ }
+ }
+ else if (*token == '{')
+ {
+ if (do_params)
+ {
+ ERR("parse error %s:%i. { marker before ; marker",
+ file_in, line - 1);
+ err_show();
+ exit(-1);
+ }
+ }
+ free(token);
+ }
+ else
+ {
+ if (do_params)
+ params = eina_list_append(params, token);
+ else
+ {
+ stack_push(token);
+ new_object();
+ if ((verbatim == 1) && (p < (end - 2)))
+ {
+ int escaped = 0;
+ int inquotes = 0;
+ int insquotes = 0;
+ int squigglie = 1;
+ int l1 = 0, l2 = 0;
+ char *verbatim_1;
+ char *verbatim_2;
+
+ l1 = line;
+ while ((p[0] != '{') && (p < end))
+ {
+ if (*p == '\n') line++;
+ p++;
+ }
+ p++;
+ verbatim_1 = p;
+ verbatim_2 = NULL;
+ for (; p < end; p++)
+ {
+ if (*p == '\n') line++;
+ if (escaped) escaped = 0;
+ if (!escaped)
+ {
+ if (p[0] == '\\') escaped = 1;
+ else if (p[0] == '\"')
+ {
+ if (!insquotes)
+ {
+ if (inquotes) inquotes = 0;
+ else inquotes = 1;
+ }
+ }
+ else if (p[0] == '\'')
+ {
+ if (!inquotes)
+ {
+ if (insquotes) insquotes = 0;
+ else insquotes = 1;
+ }
+ }
+ else if ((!inquotes) && (!insquotes))
+ {
+ if (p[0] == '{') squigglie++;
+ else if (p[0] == '}')
+ squigglie--;
+ if (squigglie == 0)
+ {
+ verbatim_2 = p - 1;
+ l2 = line;
+ break;
+ }
+ }
+ }
+ }
+ if (verbatim_2 > verbatim_1)
+ {
+ int l;
+ char *v;
+
+ l = verbatim_2 - verbatim_1 + 1;
+ v = malloc(l + 1);
+ strncpy(v, verbatim_1, l);
+ v[l] = 0;
+ set_verbatim(v, l1, l2);
+ }
+ else
+ {
+ ERR("Parse error %s:%i. { marker does not have matching } marker",
+ file_in, line - 1);
+ err_show();
+ exit(-1);
+ }
+ new_object();
+ verbatim = 0;
+ }
+ }
+ }
+ }
+
+ DBG("Parsing done");
+}
+
+void
+set_verbatim(char *s, int l1, int l2)
+{
+ verbatim_line1 = l1;
+ verbatim_line2 = l2;
+ verbatim_str = s;
+}
+
+void
+compile(void)
+{
+ int fd;
+ off_t size;
+ char *data;
+
+ fd = open(file_in, O_RDONLY | O_BINARY, S_IRUSR | S_IWUSR);
+ if (fd < 0)
+ {
+ ERR("Cannot open file \"%s\" for input. %s",
+ file_in, strerror(errno));
+ exit(-1);
+ }
+ DBG("Opening \"%s\" for input", file_in);
+
+ size = lseek(fd, 0, SEEK_END);
+ if (size <= 0)
+ {
+ ERR("lseek failed");
+ close(fd);
+ return;
+ }
+ lseek(fd, 0, SEEK_SET);
+ data = malloc(size);
+ if (data && (read(fd, data, size) == size))
+ {
+ stack_buf = eina_strbuf_new();
+ parse(data, size);
+ eina_strbuf_free(stack_buf);
+ stack_buf = NULL;
+ }
+ else
+ {
+ ERR("Cannot read file \"%s\". %s", file_in, strerror(errno));
+ exit(-1);
+ }
+ free(data);
+ close(fd);
+}
+
+char *
+parse_str(int n)
+{
+ char *str;
+ char *s;
+
+ str = eina_list_nth(params, n);
+ if (!str)
+ {
+ ERR("%s:%i no parameter supplied as argument %i",
+ file_in, line - 1, n + 1);
+ err_show();
+ exit(-1);
+ }
+ s = mem_strdup(str);
+ return s;
+}
+
+static int
+_parse_enum(char *str, va_list va)
+{
+ va_list va2;
+ va_copy(va2, va); /* iterator for the error message */
+
+ for (;; )
+ {
+ char *s;
+ int v;
+
+ s = va_arg(va, char *);
+
+ /* End of the list, nothing matched. */
+ if (!s)
+ {
+ ERR("%s:%i token %s not one of:", file_in, line - 1, str);
+ s = va_arg(va2, char *);
+ while (s)
+ {
+ va_arg(va2, int);
+ fprintf(stderr, " %s", s);
+ s = va_arg(va2, char *);
+ if (!s) break;
+ }
+ fprintf(stderr, "\n");
+ va_end(va2);
+ va_end(va);
+ err_show();
+ exit(-1);
+ }
+
+ v = va_arg(va, int);
+ if (!strcmp(s, str))
+ {
+ va_end(va2);
+ va_end(va);
+ return v;
+ }
+ }
+ va_end(va2);
+ va_end(va);
+ return 0;
+}
+
+int
+parse_enum(int n, ...)
+{
+ char *str;
+ int result;
+ va_list va;
+
+ str = eina_list_nth(params, n);
+ if (!str)
+ {
+ ERR("%s:%i no parameter supplied as argument %i",
+ file_in, line - 1, n + 1);
+ err_show();
+ exit(-1);
+ }
+
+ va_start(va, n);
+ result = _parse_enum(str, va);
+ va_end(va);
+
+ return result;
+}
+
+int
+parse_int(int n)
+{
+ char *str;
+ int i;
+
+ str = eina_list_nth(params, n);
+ if (!str)
+ {
+ ERR("%s:%i no parameter supplied as argument %i",
+ file_in, line - 1, n + 1);
+ err_show();
+ exit(-1);
+ }
+ i = my_atoi(str);
+ return i;
+}
+
+int
+parse_int_range(int n, int f, int t)
+{
+ char *str;
+ int i;
+
+ str = eina_list_nth(params, n);
+ if (!str)
+ {
+ ERR("%s:%i no parameter supplied as argument %i",
+ file_in, line - 1, n + 1);
+ err_show();
+ exit(-1);
+ }
+ i = my_atoi(str);
+ if ((i < f) || (i > t))
+ {
+ ERR("%s:%i integer %i out of range of %i to %i inclusive",
+ file_in, line - 1, i, f, t);
+ err_show();
+ exit(-1);
+ }
+ return i;
+}
+
+int
+parse_bool(int n)
+{
+ char *str, buf[4096];
+ int i;
+
+ str = eina_list_nth(params, n);
+ if (!str)
+ {
+ ERR("%s:%i no parameter supplied as argument %i",
+ file_in, line - 1, n + 1);
+ err_show();
+ exit(-1);
+ }
+
+ if (!strstrip(str, buf, sizeof (buf)))
+ {
+ ERR("%s:%i expression is too long",
+ file_in, line - 1);
+ return 0;
+ }
+
+ if (!strcasecmp(buf, "false") || !strcasecmp(buf, "off"))
+ return 0;
+ if (!strcasecmp(buf, "true") || !strcasecmp(buf, "on"))
+ return 1;
+
+ i = my_atoi(str);
+ if ((i < 0) || (i > 1))
+ {
+ ERR("%s:%i integer %i out of range of 0 to 1 inclusive",
+ file_in, line - 1, i);
+ err_show();
+ exit(-1);
+ }
+ return i;
+}
+
+double
+parse_float(int n)
+{
+ char *str;
+ double i;
+
+ str = eina_list_nth(params, n);
+ if (!str)
+ {
+ ERR("%s:%i no parameter supplied as argument %i",
+ file_in, line - 1, n + 1);
+ err_show();
+ exit(-1);
+ }
+ i = my_atof(str);
+ return i;
+}
+
+int
+get_arg_count(void)
+{
+ return eina_list_count(params);
+}
+
+void
+check_arg_count(int required_args)
+{
+ int num_args = eina_list_count(params);
+
+ if (num_args != required_args)
+ {
+ ERR("%s:%i got %i arguments, but expected %i",
+ file_in, line - 1, num_args, required_args);
+ err_show();
+ exit(-1);
+ }
+}
+
+void
+check_min_arg_count(int min_required_args)
+{
+ int num_args = eina_list_count(params);
+
+ if (num_args < min_required_args)
+ {
+ ERR("%s:%i got %i arguments, but expected at least %i",
+ file_in, line - 1, num_args, min_required_args);
+ err_show();
+ exit(-1);
+ }
+}
+
+void
+check_regex(const char *regex)
+{
+ int ret;
+ char errbuf[1024];
+ regex_t preg;
+
+ ret = regcomp(&preg, regex, REG_EXTENDED | REG_NOSUB);
+ if (ret)
+ {
+ regerror(ret, &preg, errbuf, 1024);
+ ERR("%s:%i Invalid regular expression:\n"
+ "%s", file_in, line, errbuf);
+ err_show();
+ exit(-1);
+ }
+
+ regfree(&preg);
+}
+
+/* simple expression parsing stuff */
+
+/*
+ * alpha ::= beta + beta || beta
+ * beta ::= gamma + gamma || gamma
+ * gamma ::= num || delta
+ * delta ::= '(' alpha ')'
+ *
+ */
+
+/* int set of function */
+
+static int
+my_atoi(const char *s)
+{
+ int res = 0;
+ char buf[4096];
+
+ if (!s) return 0;
+ if (!strstrip(s, buf, sizeof(buf)))
+ {
+ ERR("%s:%i expression is too long",
+ file_in, line - 1);
+ return 0;
+ }
+ _alphai(buf, &res);
+ return res;
+}
+
+static char *
+_deltai(char *s, int *val)
+{
+ if (!val) return NULL;
+ if ('(' != s[0])
+ {
+ ERR("%s:%i unexpected character at %s",
+ file_in, line - 1, s);
+ return s;
+ }
+ else
+ {
+ s++;
+ s = _alphai(s, val);
+ s++;
+ return s;
+ }
+ return s;
+}
+
+static char *
+_funci(char *s, int *val)
+{
+ if (!strncmp(s, "floor(", 6))
+ {
+ s += 5;
+ s = _deltai(s, val);
+ }
+ else if (!strncmp(s, "ceil(", 5))
+ {
+ s += 4;
+ s = _deltai(s, val);
+ }
+ else
+ {
+ ERR("%s:%i unexpected character at %s",
+ file_in, line - 1, s);
+ }
+ return s;
+}
+
+static char *
+_gammai(char *s, int *val)
+{
+ if (!val) return NULL;
+ if (_is_numi(s[0]))
+ {
+ s = _get_numi(s, val);
+ return s;
+ }
+ else if ('(' == s[0])
+ {
+ s = _deltai(s, val);
+ return s;
+ }
+ else
+ {
+ s = _funci(s, val);
+// ERR("%s:%i unexpected character at %s",
+// progname, file_in, line - 1, s);
+ }
+ return s;
+}
+
+static char *
+_betai(char *s, int *val)
+{
+ int a1, a2;
+ char op;
+
+ if (!val) return NULL;
+ s = _gammai(s, &a1);
+ while (_is_op1i(s[0]))
+ {
+ op = s[0];
+ s++;
+ s = _gammai(s, &a2);
+ a1 = _calci(op, a1, a2);
+ }
+ (*val) = a1;
+ return s;
+}
+
+static char *
+_alphai(char *s, int *val)
+{
+ int a1, a2;
+ char op;
+
+ if (!val) return NULL;
+ s = _betai(s, &a1);
+ while (_is_op2i(s[0]))
+ {
+ op = s[0];
+ s++;
+ s = _betai(s, &a2);
+ a1 = _calci(op, a1, a2);
+ }
+ (*val) = a1;
+ return s;
+}
+
+static char *
+_get_numi(char *s, int *val)
+{
+ char buf[4096];
+ int pos = 0;
+
+ if (!val) return s;
+ while ((('0' <= s[pos]) && ('9' >= s[pos])) ||
+ ((0 == pos) && ('-' == s[pos])))
+ {
+ buf[pos] = s[pos];
+ pos++;
+ }
+ buf[pos] = '\0';
+ (*val) = atoi(buf);
+ return s + pos;
+}
+
+static int
+_is_numi(char c)
+{
+ if (((c >= '0') && (c <= '9')) || ('-' == c) || ('+' == c))
+ return 1;
+ else
+ return 0;
+}
+
+static int
+_is_op1i(char c)
+{
+ switch (c)
+ {
+ case '*':;
+
+ case '%':;
+
+ case '/': return 1;
+
+ default: break;
+ }
+ return 0;
+}
+
+static int
+_is_op2i(char c)
+{
+ switch (c)
+ {
+ case '+':;
+
+ case '-': return 1;
+
+ default: break;
+ }
+ return 0;
+}
+
+static int
+_calci(char op, int a, int b)
+{
+ switch (op)
+ {
+ case '+':
+ a += b;
+ return a;
+
+ case '-':
+ a -= b;
+ return a;
+
+ case '/':
+ if (0 != b) a /= b;
+ else
+ ERR("%s:%i divide by zero", file_in, line - 1);
+ return a;
+
+ case '*':
+ a *= b;
+ return a;
+
+ case '%':
+ if (0 != b) a = a % b;
+ else
+ ERR("%s:%i modula by zero", file_in, line - 1);
+ return a;
+
+ default:
+ ERR("%s:%i unexpected character '%c'", file_in, line - 1, op);
+ }
+ return a;
+}
+
+/* float set of functoins */
+
+static double
+my_atof(const char *s)
+{
+ double res = 0;
+ char buf[4096];
+
+ if (!s) return 0;
+
+ if (!strstrip(s, buf, sizeof (buf)))
+ {
+ ERR("%s:%i expression is too long", file_in, line - 1);
+ return 0;
+ }
+ _alphaf(buf, &res);
+ return res;
+}
+
+static char *
+_deltaf(char *s, double *val)
+{
+ if (!val) return NULL;
+ if ('(' != s[0])
+ {
+ ERR("%s:%i unexpected character at %s", file_in, line - 1, s);
+ return s;
+ }
+ else
+ {
+ s++;
+ s = _alphaf(s, val);
+ s++;
+ }
+ return s;
+}
+
+static char *
+_funcf(char *s, double *val)
+{
+ if (!strncmp(s, "floor(", 6))
+ {
+ s += 5;
+ s = _deltaf(s, val);
+ *val = floor(*val);
+ }
+ else if (!strncmp(s, "ceil(", 5))
+ {
+ s += 4;
+ s = _deltaf(s, val);
+ *val = ceil(*val);
+ }
+ else
+ {
+ ERR("%s:%i unexpected character at %s", file_in, line - 1, s);
+ }
+ return s;
+}
+
+static char *
+_gammaf(char *s, double *val)
+{
+ if (!val) return NULL;
+
+ if (_is_numf(s[0]))
+ {
+ s = _get_numf(s, val);
+ return s;
+ }
+ else if ('(' == s[0])
+ {
+ s = _deltaf(s, val);
+ return s;
+ }
+ else
+ {
+ s = _funcf(s, val);
+// ERR("%s:%i unexpected character at %s",
+// progname, file_in, line - 1, s);
+ }
+ return s;
+}
+
+static char *
+_betaf(char *s, double *val)
+{
+ double a1 = 0, a2 = 0;
+ char op;
+
+ if (!val) return NULL;
+ s = _gammaf(s, &a1);
+ while (_is_op1f(s[0]))
+ {
+ op = s[0];
+ s++;
+ s = _gammaf(s, &a2);
+ a1 = _calcf(op, a1, a2);
+ }
+ (*val) = a1;
+ return s;
+}
+
+static char *
+_alphaf(char *s, double *val)
+{
+ double a1 = 0, a2 = 0;
+ char op;
+
+ if (!val) return NULL;
+ s = _betaf(s, &a1);
+ while (_is_op2f(s[0]))
+ {
+ op = s[0];
+ s++;
+ s = _betaf(s, &a2);
+ a1 = _calcf(op, a1, a2);
+ }
+ (*val) = a1;
+ return s;
+}
+
+static char *
+_get_numf(char *s, double *val)
+{
+ char buf[4096];
+ int pos = 0;
+
+ if (!val) return s;
+
+ while ((('0' <= s[pos]) && ('9' >= s[pos])) ||
+ ('.' == s[pos]) ||
+ ((0 == pos) && ('-' == s[pos])))
+ {
+ buf[pos] = s[pos];
+ pos++;
+ }
+ buf[pos] = '\0';
+ (*val) = atof(buf);
+ return s + pos;
+}
+
+int
+params_min_check(int n)
+{
+ char *str;
+
+ str = _parse_param_get(n);
+ if (str) return 1;
+ return 0;
+}
+
+static int
+_is_numf(char c)
+{
+ if (((c >= '0') && (c <= '9'))
+ || ('-' == c)
+ || ('.' == c)
+ || ('+' == c))
+ return 1;
+ return 0;
+}
+
+static int
+_is_op1f(char c)
+{
+ switch (c)
+ {
+ case '*':;
+
+ case '%':;
+
+ case '/': return 1;
+
+ default: break;
+ }
+ return 0;
+}
+
+static int
+_is_op2f(char c)
+{
+ switch (c)
+ {
+ case '+':;
+
+ case '-': return 1;
+
+ default: break;
+ }
+ return 0;
+}
+
+static double
+_calcf(char op, double a, double b)
+{
+ switch (op)
+ {
+ case '+':
+ a += b;
+ return a;
+
+ case '-':
+ a -= b;
+ return a;
+
+ case '/':
+ if (b != 0) a /= b;
+ else
+ ERR("%s:%i divide by zero", file_in, line - 1);
+ return a;
+
+ case '*':
+ a *= b;
+ return a;
+
+ case '%':
+ if (0 != b) a = (double)((int)a % (int)b);
+ else
+ ERR("%s:%i modula by zero", file_in, line - 1);
+ return a;
+
+ default:
+ ERR("%s:%i unexpected character '%c'", file_in, line - 1, op);
+ }
+ return a;
+}
+
+static int
+strstrip(const char *in, char *out, size_t size)
+{
+ if ((size - 1) < strlen(in))
+ {
+ ERR("%s:%i expression is too long", file_in, line - 1);
+ return 0;
+ }
+ /* remove spaces and tabs */
+ while (*in)
+ {
+ if ((0x20 != *in) && (0x09 != *in))
+ {
+ *out = *in;
+ out++;
+ }
+ in++;
+ }
+ *out = '\0';
+ return 1;
+}
diff --git a/src/bin/elementary/quicklaunch.c b/src/bin/elementary/quicklaunch.c
new file mode 100644
index 0000000000..6ca0a3c973
--- /dev/null
+++ b/src/bin/elementary/quicklaunch.c
@@ -0,0 +1,347 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#ifdef HAVE_ENVIRON
+# define _GNU_SOURCE 1
+#endif
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/wait.h>
+
+#include <Elementary.h>
+
+#ifdef HAVE_ENVIRON
+extern char **environ;
+#endif
+
+static double restart_time = 0.0;
+
+#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path))
+
+static struct sigaction old_sigint;
+static struct sigaction old_sigterm;
+static struct sigaction old_sigquit;
+static struct sigaction old_sigalrm;
+static struct sigaction old_sigusr1;
+static struct sigaction old_sigusr2;
+static struct sigaction old_sighup;
+static struct sigaction old_sigchld;
+static struct sigaction old_sigsegv;
+static struct sigaction old_sigill;
+static struct sigaction old_sigfpe;
+static struct sigaction old_sigbus;
+static struct sigaction old_sigabrt;
+static int _log_dom = -1;
+
+#define CRI(...) EINA_LOG_DOM_CRIT(_log_dom, __VA_ARGS__)
+#define ERR(...) EINA_LOG_DOM_ERR(_log_dom, __VA_ARGS__)
+#define WRN(...) EINA_LOG_DOM_WARN(_log_dom, __VA_ARGS__)
+#define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__)
+#define DBG(...) EINA_LOG_DOM_DBG(_log_dom, __VA_ARGS__)
+
+static void
+post_fork(void *data EINA_UNUSED)
+{
+ sigaction(SIGINT, &old_sigint, NULL);
+ sigaction(SIGTERM, &old_sigterm, NULL);
+ sigaction(SIGQUIT, &old_sigquit, NULL);
+ sigaction(SIGALRM, &old_sigalrm, NULL);
+ sigaction(SIGUSR1, &old_sigusr1, NULL);
+ sigaction(SIGUSR2, &old_sigusr2, NULL);
+ sigaction(SIGHUP, &old_sighup, NULL);
+ sigaction(SIGCHLD, &old_sigchld, NULL);
+ sigaction(SIGSEGV, &old_sigsegv, NULL);
+ sigaction(SIGILL, &old_sigill, NULL);
+ sigaction(SIGFPE, &old_sigfpe, NULL);
+ sigaction(SIGBUS, &old_sigbus, NULL);
+ sigaction(SIGABRT, &old_sigabrt, NULL);
+ if ((_log_dom > -1) && (_log_dom != EINA_LOG_DOMAIN_GLOBAL))
+ {
+ eina_log_domain_unregister(_log_dom);
+ _log_dom = -1;
+ }
+}
+
+static void
+child_handler(int x EINA_UNUSED, siginfo_t *info EINA_UNUSED, void *data EINA_UNUSED)
+{
+ int status;
+ while (waitpid(-1, &status, WNOHANG) > 0);
+}
+
+static void
+crash_handler(int x EINA_UNUSED, siginfo_t *info EINA_UNUSED, void *data EINA_UNUSED)
+{
+ double t;
+
+ ERR("crash detected. restarting.");
+ t = ecore_time_get();
+ if ((t - restart_time) <= 2.0)
+ {
+ CRI("crash too fast - less than 2 seconds. abort restart");
+ exit(-1);
+ }
+ ecore_app_restart();
+}
+
+static void
+handle_run(int fd, unsigned long bytes)
+{
+ unsigned char *buf = NULL;
+ int i;
+ char **argv = NULL;
+ char **envir = NULL;
+ char *cwd;
+ int argc, envnum;
+ unsigned long off;
+
+ _elm_startup_time = ecore_time_unix_get();
+
+ buf = alloca(bytes);
+ if (read(fd, buf, bytes) != (int)bytes)
+ {
+ CRI("cannot read %i bytes of args and environment data", (int)bytes);
+ close(fd);
+ return;
+ }
+ close(fd);
+
+ argc = ((unsigned long *)(buf))[0];
+ envnum = ((unsigned long *)(buf))[1];
+
+ if (argc <= 0)
+ {
+ CRI("no executable specified");
+ return;
+ }
+
+ argv = alloca(argc * sizeof(char *));
+ if (envnum > 0) envir = alloca(envnum * sizeof(char *));
+ off = ((unsigned long *)(buf))[2 + argc + envnum] - sizeof(unsigned long);
+ cwd = (char *)(buf + off);
+
+ for (i = 0; i < argc; i++)
+ {
+ off = ((unsigned long *)(buf))[2 + i] - sizeof(unsigned long);
+ argv[i] = (char *)(buf + off);
+ }
+
+#ifdef HAVE_ENVIRON
+ if (envir)
+ {
+#ifdef HAVE_CLEARENV
+ clearenv();
+#else
+ environ = NULL;
+#endif
+ for (i = 0; i < envnum; i++)
+ {
+ off = ((unsigned long *)(buf))[2 + argc + i] - sizeof(unsigned long);
+ envir[i] = (char *)(buf + off);
+ putenv(envir[i]);
+ }
+ }
+#endif
+ elm_quicklaunch_prepare(argc, argv, cwd);
+ elm_quicklaunch_fork(argc, argv, cwd, post_fork, NULL);
+ elm_quicklaunch_cleanup();
+}
+
+int
+main(int argc, char **argv)
+{
+ int sock, socket_unix_len;
+ struct stat st;
+ struct sockaddr_un socket_unix;
+ struct linger lin;
+ char buf[PATH_MAX];
+ struct sigaction action;
+ const char *disp;
+ int ret = 0;
+
+ if (!eina_init())
+ {
+ fprintf(stderr, "ERROR: failed to init eina.");
+ exit(-1);
+ }
+ _log_dom = eina_log_domain_register
+ ("elementary_quicklaunch", EINA_COLOR_CYAN);
+ if (_log_dom < 0)
+ {
+ EINA_LOG_ERR("could not register elementary_quicklaunch log domain.");
+ _log_dom = EINA_LOG_DOMAIN_GLOBAL;
+ }
+
+ if (!(disp = getenv("DISPLAY"))) disp = "unknown";
+ snprintf(buf, sizeof(buf), "/tmp/elm-ql-%i", getuid());
+ if (stat(buf, &st) < 0)
+ {
+ ret = mkdir(buf, S_IRUSR | S_IWUSR | S_IXUSR);
+ if (ret < 0)
+ {
+ CRI("cannot create directory '%s'", buf);
+ exit(-1);
+ }
+ }
+ snprintf(buf, sizeof(buf), "/tmp/elm-ql-%i/%s", getuid(), disp);
+ unlink(buf);
+ sock = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sock < 0)
+ {
+ CRI("cannot create socket for socket for '%s': %s",
+ buf, strerror(errno));
+ exit(-1);
+ }
+ if (fcntl(sock, F_SETFD, FD_CLOEXEC) < 0)
+ {
+ CRI("cannot set close on exec socket for '%s' (fd=%d): %s",
+ buf, sock, strerror(errno));
+ exit(-1);
+ }
+ lin.l_onoff = 1;
+ lin.l_linger = 0;
+ if (setsockopt(sock, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 0)
+ {
+ CRI("cannot set linger for socket for '%s' (fd=%d): %s",
+ buf, sock, strerror(errno));
+ exit(-1);
+ }
+ socket_unix.sun_family = AF_UNIX;
+ strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
+ socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
+ if (bind(sock, (struct sockaddr *)&socket_unix, socket_unix_len) < 0)
+ {
+ CRI("cannot bind socket for '%s' (fd=%d): %s",
+ buf, sock, strerror(errno));
+ exit(-1);
+ }
+ if (listen(sock, 4096) < 0)
+ {
+ CRI("listen(sock=%d, 4096): %s", sock, strerror(errno));
+ exit(-1);
+ }
+ elm_quicklaunch_mode_set(EINA_TRUE);
+ elm_quicklaunch_init(argc, argv);
+ restart_time = ecore_time_get();
+
+ memset(&action, 0, sizeof(struct sigaction));
+ action.sa_handler = SIG_DFL;
+ action.sa_sigaction = NULL;
+ action.sa_flags = SA_RESTART | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGINT, &action, &old_sigint);
+
+ action.sa_handler = SIG_DFL;
+ action.sa_sigaction = NULL;
+ action.sa_flags = SA_RESTART | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGTERM, &action, &old_sigterm);
+
+ action.sa_handler = SIG_DFL;
+ action.sa_sigaction = NULL;
+ action.sa_flags = SA_RESTART | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGQUIT, &action, &old_sigquit);
+
+ action.sa_handler = SIG_DFL;
+ action.sa_sigaction = NULL;
+ action.sa_flags = SA_RESTART | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGALRM, &action, &old_sigalrm);
+
+ action.sa_handler = SIG_DFL;
+ action.sa_sigaction = NULL;
+ action.sa_flags = SA_RESTART | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGUSR1, &action, &old_sigusr1);
+
+ action.sa_handler = SIG_DFL;
+ action.sa_sigaction = NULL;
+ action.sa_flags = SA_RESTART | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGUSR2, &action, &old_sigusr2);
+
+ action.sa_handler = SIG_DFL;
+ action.sa_sigaction = NULL;
+ action.sa_flags = SA_RESTART | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGHUP, &action, &old_sighup);
+
+ action.sa_handler = NULL;
+ action.sa_sigaction = child_handler;
+ action.sa_flags = SA_RESTART | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGCHLD, &action, &old_sigchld);
+
+ action.sa_handler = NULL;
+ action.sa_sigaction = crash_handler;
+ action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGSEGV, &action, &old_sigsegv);
+
+ action.sa_handler = NULL;
+ action.sa_sigaction = crash_handler;
+ action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGILL, &action, &old_sigill);
+
+ action.sa_handler = NULL;
+ action.sa_sigaction = crash_handler;
+ action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGFPE, &action, &old_sigfpe);
+
+ action.sa_handler = NULL;
+ action.sa_sigaction = crash_handler;
+ action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGBUS, &action, &old_sigbus);
+
+ action.sa_handler = NULL;
+ action.sa_sigaction = crash_handler;
+ action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGABRT, &action, &old_sigabrt);
+
+ for (;;)
+ {
+ int fd;
+ struct sockaddr_un client;
+ socklen_t len;
+
+ len = sizeof(struct sockaddr_un);
+ fd = accept(sock, (struct sockaddr *)&client, &len);
+ elm_quicklaunch_sub_init(argc, argv);
+ // don't seed since we are doing this AFTER launch request
+ // elm_quicklaunch_seed();
+ if (fd >= 0)
+ {
+ unsigned long bytes;
+ int num;
+
+ num = read(fd, &bytes, sizeof(unsigned long));
+ if (num == sizeof(unsigned long))
+ handle_run(fd, bytes);
+ }
+ while (elm_quicklaunch_sub_shutdown() > 0);
+ }
+ elm_quicklaunch_shutdown();
+
+ if ((_log_dom > -1) && (_log_dom != EINA_LOG_DOMAIN_GLOBAL))
+ {
+ eina_log_domain_unregister(_log_dom);
+ _log_dom = -1;
+ }
+ eina_shutdown();
+
+ return 0;
+}
diff --git a/src/bin/elementary/run.c b/src/bin/elementary/run.c
new file mode 100644
index 0000000000..a3ad3a4cab
--- /dev/null
+++ b/src/bin/elementary/run.c
@@ -0,0 +1,213 @@
+#include "elementary_config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <limits.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#ifdef HAVE_ENVIRON
+# define _GNU_SOURCE 1
+#endif
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#endif
+
+#ifdef HAVE_ENVIRON
+extern char **environ;
+#endif
+
+#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path))
+
+int
+main(int argc, char **argv)
+{
+ int sock, socket_unix_len, i, n;
+ struct sockaddr_un socket_unix;
+ char buf[PATH_MAX];
+ struct stat st;
+ char *exe;
+ int we_are_elementary_run = 0;
+ char *disp;
+ char *cwd;
+
+ int sargc, slen, envnum;
+ unsigned char *sbuf = NULL, *pos;
+ char **sargv = NULL;
+
+ if (!getcwd(buf, sizeof(buf) - 1))
+ {
+ fprintf(stderr, "elementary_quicklaunch: currect working dir too big.\n");
+ exit(-1);
+ }
+ cwd = strdup(buf);
+ if (!(disp = getenv("DISPLAY"))) disp = "unknown";
+ snprintf(buf, sizeof(buf), "/tmp/elm-ql-%i/%s", getuid(), disp);
+ if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
+ {
+ perror("elementary_quicklaunch: socket(AF_UNIX, SOCK_STREAM, 0)");
+ exit(-1);
+ }
+ socket_unix.sun_family = AF_UNIX;
+ strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
+ socket_unix.sun_path[(int)(sizeof(socket_unix.sun_path)/sizeof(socket_unix.sun_path[0])) - 1] = '\0';
+ socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
+ if (connect(sock, (struct sockaddr *)&socket_unix, socket_unix_len) < 0)
+ {
+ perror("elementary_quicklaunch: connect(sock, (struct sockaddr *)&socket_unix, socket_unix_len)");
+ printf("elementary_quicklaunch: cannot connect to socket '%s'\n", buf);
+ exit(1);
+ }
+ exe = argv[0];
+ if (!(((exe[0] == '/')) ||
+ ((exe[0] == '.') && (exe[1] == '/')) ||
+ ((exe[0] == '.') && (exe[1] == '.') && (exe[2] == '/'))))
+ {
+ char *path = getenv("PATH");
+ int exelen = strlen(argv[0]);
+ if (path)
+ {
+ const char *p, *pp;
+
+ p = path;
+ pp = p;
+ exe = NULL;
+ for (;;)
+ {
+ if ((*p == ':') || (!*p))
+ {
+ unsigned int len;
+
+ len = p - pp;
+ if (len < (sizeof(buf) - exelen - 3))
+ {
+ strncpy(buf, pp, len);
+ strcpy(buf + len, "/");
+ strcpy(buf + len + 1, argv[0]);
+ if (!access(buf, R_OK | X_OK))
+ {
+ exe = buf;
+ break;
+ }
+ if (!*p) break;
+ p++;
+ pp = p;
+ }
+ }
+ else
+ {
+ if (!*p) break;
+ p++;
+ }
+ }
+ }
+ }
+ if (exe)
+ {
+ if (!lstat(exe, &st))
+ {
+ if (S_ISLNK(st.st_mode))
+ {
+ char buf2[PATH_MAX];
+
+ ssize_t len = readlink(exe, buf2, sizeof(buf2) - 1);
+ if (len >= 0)
+ {
+ char *p;
+ buf2[len] = 0;
+ p = strrchr(buf2, '/');
+ if (p) p++;
+ else p = buf2;
+ if (!strncasecmp(p, "elementary_run", 14))
+ we_are_elementary_run = 1;
+ }
+ }
+ }
+ }
+ if (we_are_elementary_run)
+ {
+ sargc = argc;
+ sargv = argv;
+ }
+ else
+ {
+ sargc = argc - 1;
+ sargv = &(argv[1]);
+ }
+
+ slen = 0;
+ envnum = 0;
+
+ // header:
+ // UL 'total bytes'
+ // UL 'argnum'
+ // UL 'envnum'
+ slen += sizeof(unsigned long) * 3;
+
+ for (i = 0; i < sargc; i++)
+ {
+ slen += sizeof(unsigned long);
+ slen += strlen(sargv[i]) + 1;
+ }
+
+#ifdef HAVE_ENVIRON
+ // count how much space is needed for environment
+ for (i = 0; environ[i]; i++)
+ {
+ slen += sizeof(unsigned long);
+ slen += strlen(environ[i]) + 1;
+ envnum++;
+ }
+#endif
+
+ // how much space is needed for cwd
+ slen += sizeof(unsigned long);
+ slen += strlen(cwd) + 1;
+
+ // allocate buffer on stack
+ sbuf = alloca(slen);
+
+ // fill in header
+ ((unsigned long *)(sbuf))[0] = slen - sizeof(unsigned long);
+ ((unsigned long *)(sbuf))[1] = sargc;
+ ((unsigned long *)(sbuf))[2] = envnum;
+ // pos pointer after header
+ pos = (unsigned char *)(&((((unsigned long *)(sbuf))[3 + sargc + envnum + 1])));
+ n = 3;
+
+ // fill in args
+ for (i = 0; i < sargc; i++)
+ {
+ ((unsigned long *)(sbuf))[n] = (unsigned long)pos - (unsigned long)sbuf;
+ strcpy((char *)pos, sargv[i]);
+ pos += strlen(sargv[i]) + 1;
+ n++;
+ }
+
+#ifdef HAVE_ENVIRON
+ // fill in environ
+ for (i = 0; environ[i]; i++)
+ {
+ ((unsigned long *)(sbuf))[n] = (unsigned long)pos - (unsigned long)sbuf;
+ strcpy((char *)pos, environ[i]);
+ pos += strlen(environ[i]) + 1;
+ n++;
+ }
+#endif
+
+ // fill in cwd
+ ((unsigned long *)(sbuf))[n] = (unsigned long)pos - (unsigned long)sbuf;
+ n++;
+ strcpy((char *)pos, cwd);
+
+ if (write(sock, sbuf, slen) < 0)
+ printf("elementary_quicklaunch: cannot write to socket '%s'\n", buf);
+ close(sock);
+
+ free(cwd);
+ return 0;
+}
diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c
new file mode 100644
index 0000000000..3bad1c6d2c
--- /dev/null
+++ b/src/bin/elementary/test.c
@@ -0,0 +1,1030 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <string.h>
+#include <Elementary.h>
+#include "test.h"
+#include "test_explode.h"
+
+int _log_domain = -1;
+
+/* all tests prototypes */
+void test_access(void *data, Evas_Object *obj, void *event_info);
+void test_access2(void *data, Evas_Object *obj, void *event_info);
+void test_access3(void *data, Evas_Object *obj, void *event_info);
+void test_bg_plain(void *data, Evas_Object *obj, void *event_info);
+void test_bg_image(void *data, Evas_Object *obj, void *event_info);
+void test_bg_options(void *data, Evas_Object *obj, void *event_info);
+void test_icon(void *data, Evas_Object *obj, void *event_info);
+void test_icon_transparent(void *data, Evas_Object *obj, void *event_info);
+void test_icon_standard(void *data, Evas_Object *obj, void *event_info);
+void test_box_vert(void *data, Evas_Object *obj, void *event_info);
+void test_box_vert2(void *data, Evas_Object *obj, void *event_info);
+void test_box_pack(void *data, Evas_Object *obj, void *event_info);
+void test_box_horiz(void *data, Evas_Object *obj, void *event_info);
+void test_box_homo(void *data, Evas_Object *obj, void *event_info);
+void test_box_transition(void *data, Evas_Object *obj, void *event_info);
+void test_box_align(void *data, Evas_Object *obj, void *event_info);
+void test_button(void *data, Evas_Object *obj, void *event_info);
+void test_cnp(void *data, Evas_Object *obj, void *event_info);
+void test_transit(void *data, Evas_Object *obj, void *event_info);
+void test_transit_blend(void *data, Evas_Object *obj, void *event_info);
+void test_transit_chain(void *data, Evas_Object *obj, void *event_info);
+void test_transit_custom(void *data, Evas_Object *obj, void *event_info);
+void test_transit_fade(void *data, Evas_Object *obj, void *event_info);
+void test_transit_flip(void *data, Evas_Object *obj, void *event_info);
+void test_transit_resizable_flip(void *data, Evas_Object *obj, void *event_info);
+void test_transit_resizing(void *data, Evas_Object *obj, void *event_info);
+void test_transit_zoom(void *data, Evas_Object *obj, void *event_info);
+void test_transit_tween(void *data, Evas_Object *obj, void *event_info);
+void test_transit_bezier(void *data, Evas_Object *obj, void *event_info);
+void test_fileselector_button(void *data, Evas_Object *obj, void *event_info);
+void test_fileselector_entry(void *data, Evas_Object *obj, void *event_info);
+void test_clock(void *data, Evas_Object *obj, void *event_info);
+void test_clock_edit(void *data, Evas_Object *obj, void *event_info);
+void test_clock_edit2(void *data, Evas_Object *obj, void *event_info);
+void test_clock_pause(void *data, Evas_Object *obj, void *event_info);
+void test_combobox(void *data, Evas_Object *obj, void *event_info);
+void test_combobox2(void *data, Evas_Object *obj, void *event_info);
+void test_check(void *data, Evas_Object *obj, void *event_info);
+void test_check_toggle(void *data, Evas_Object *obj, void *event_info);
+void test_radio(void *data, Evas_Object *obj, void *event_info);
+void test_layout(void *data, Evas_Object *obj, void *event_info);
+void test_layout2(void *data, Evas_Object *obj, void *event_info);
+void test_hover(void *data, Evas_Object *obj, void *event_info);
+void test_hover2(void *data, Evas_Object *obj, void *event_info);
+void test_hover3(void *data, Evas_Object *obj, void *event_info);
+void test_entry(void *data, Evas_Object *obj, void *event_info);
+void test_entry_style_user(void *data, Evas_Object *obj, void *event_info);
+void test_entry_style_default(void *data, Evas_Object *obj, void *event_info);
+void test_entry_scrolled(void *data, Evas_Object *obj, void *event_info);
+void test_entry3(void *data, Evas_Object *obj, void *event_info);
+void test_entry4(void *data, Evas_Object *obj, void *event_info);
+void test_entry5(void *data, Evas_Object *obj, void *event_info);
+void test_entry6(void *data, Evas_Object *obj, void *event_info);
+void test_entry7(void *data, Evas_Object *obj, void *event_info);
+void test_entry8(void *data, Evas_Object *obj, void *event_info);
+void test_entry_regex(void *data, Evas_Object *obj, void *event_info);
+void test_entry_notepad(void *data, Evas_Object *obj, void *event_info);
+void test_multibuttonentry(void *data, Evas_Object *obj, void *event_info);
+void test_entry_anchor2(void *data, Evas_Object *obj, void *event_info);
+void test_entry_anchor(void *data, Evas_Object *obj, void *event_info);
+void test_entry_emoticon(void *data, Evas_Object *obj, void *event_info);
+void test_toolbar(void *data, Evas_Object *obj, void *event_info);
+void test_toolbar2(void *data, Evas_Object *obj, void *event_info);
+void test_toolbar3(void *data, Evas_Object *obj, void *event_info);
+void test_toolbar4(void *data, Evas_Object *obj, void *event_info);
+void test_toolbar5(void *data, Evas_Object *obj, void *event_info);
+void test_toolbar6(void *data, Evas_Object *obj, void *event_info);
+void test_toolbar7(void *data, Evas_Object *obj, void *event_info);
+void test_toolbar8(void *data, Evas_Object *obj, void *event_info);
+void test_toolbar_vertical(void *data, Evas_Object *obj, void *event_info);
+void test_toolbar_focus(void *data, Evas_Object *obj, void *event_info);
+void test_hoversel(void *data, Evas_Object *obj, void *event_info);
+void test_hoversel_focus(void *data, Evas_Object *obj, void *event_info);
+void test_list(void *data, Evas_Object *obj, void *event_info);
+void test_list_horizontal(void *data, Evas_Object *obj, void *event_info);
+void test_list2(void *data, Evas_Object *obj, void *event_info);
+void test_list3(void *data, Evas_Object *obj, void *event_info);
+void test_list4(void *data, Evas_Object *obj, void *event_info);
+void test_list5(void *data, Evas_Object *obj, void *event_info);
+void test_list6(void *data, Evas_Object *obj, void *event_info);
+void test_list7(void *data, Evas_Object *obj, void *event_info);
+void test_list_focus(void *data, Evas_Object *obj, void *event_info);
+void test_list_horiz_focus(void *data, Evas_Object *obj, void *event_info);
+void test_list_separator(void *data, Evas_Object *obj, void *event_info);
+void test_list_multi_select(void *data, Evas_Object *obj, void *event_info);
+void test_inwin(void *data, Evas_Object *obj, void *event_info);
+void test_inwin2(void *data, Evas_Object *obj, void *event_info);
+void test_scaling(void *data, Evas_Object *obj, void *event_info);
+void test_scaling2(void *data, Evas_Object *obj, void *event_info);
+void test_slider(void *data, Evas_Object *obj, void *event_info);
+void test_actionslider(void *data, Evas_Object *obj, void *event_info);
+void test_genlist(void *data, Evas_Object *obj, void *event_info);
+void test_genlist2(void *data, Evas_Object *obj, void *event_info);
+void test_genlist3(void *data, Evas_Object *obj, void *event_info);
+void test_genlist4(void *data, Evas_Object *obj, void *event_info);
+void test_genlist5(void *data, Evas_Object *obj, void *event_info);
+void test_genlist6(void *data, Evas_Object *obj, void *event_info);
+void test_genlist7(void *data, Evas_Object *obj, void *event_info);
+void test_genlist8(void *data, Evas_Object *obj, void *event_info);
+void test_genlist9(void *data, Evas_Object *obj, void *event_info);
+void test_genlist10(void *data, Evas_Object *obj, void *event_info);
+void test_genlist_reorder(void *data, Evas_Object *obj, void *event_info);
+void test_genlist12(void *data, Evas_Object *obj, void *event_info);
+void test_genlist13(void *data, Evas_Object *obj, void *event_info);
+void test_genlist14(void *data, Evas_Object *obj, void *event_info);
+void test_genlist15(void *data, Evas_Object *obj, void *event_info);
+void test_genlist16(void *data, Evas_Object *obj, void *event_info);
+void test_genlist17(void *data, Evas_Object *obj, void *event_info);
+void test_genlist18(void *data, Evas_Object *obj, void *event_info);
+void test_genlist19(void *data, Evas_Object *obj, void *event_info);
+void test_genlist20(void *data, Evas_Object *obj, void *event_info);
+void test_genlist_focus(void *data, Evas_Object *obj, void *event_info);
+void test_genlist_item_styles(void *data, Evas_Object *obj, void *event_info);
+void test_genlist_multi_select(void *data, Evas_Object *obj, void *event_info);
+void test_genlist_del(void *data, Evas_Object *obj, void *event_info);
+void test_genlist_filter(void *data, Evas_Object *obj, void *event_info);
+void test_genlist_show_bring(void *data, Evas_Object *obj, void *event_info);
+void test_gesture_layer(void *data, Evas_Object *obj, void *event_info);
+void test_gesture_layer2(void *data, Evas_Object *obj, void *event_info);
+void test_gesture_layer3(void *data, Evas_Object *obj, void *event_info);
+void test_table(void *data, Evas_Object *obj, void *event_info);
+void test_table2(void *data, Evas_Object *obj, void *event_info);
+void test_table3(void *data, Evas_Object *obj, void *event_info);
+void test_table4(void *data, Evas_Object *obj, void *event_info);
+void test_table5(void *data, Evas_Object *obj, void *event_info);
+void test_table6(void *data, Evas_Object *obj, void *event_info);
+void test_table7(void *data, Evas_Object *obj, void *event_info);
+void test_table8(void *data, Evas_Object *obj, void *event_info);
+void test_gengrid(void *data, Evas_Object *obj, void *event_info);
+void test_gengrid2(void *data, Evas_Object *obj, void *event_info);
+void test_gengrid3(void *data, Evas_Object *obj, void *event_info);
+void test_gengrid4(void *data, Evas_Object *obj, void *event_info);
+void test_gengrid5(void *data, Evas_Object *obj, void *event_info);
+void test_gengrid_item_styles(void *data, Evas_Object *obj, void *event_info);
+void test_gengrid_speed(void *data, Evas_Object *obj, void *event_info);
+void test_gengrid_focus(void *data, Evas_Object *obj, void *event_info);
+void test_gengrid_update(void *data, Evas_Object *obj, void *event_info);
+void test_win_state(void *data, Evas_Object *obj, void *event_info);
+void test_win_state2(void *data, Evas_Object *obj, void *event_info);
+void test_progressbar(void *data, Evas_Object *obj, void *event_info);
+void test_progressbar2(void *data, Evas_Object *obj, void *event_info);
+void test_fileselector(void *data, Evas_Object *obj, void *event_info);
+void test_separator(void *data, Evas_Object *obj, void *event_info);
+void test_scroller(void *data, Evas_Object *obj, void *event_info);
+void test_scroller2(void *data, Evas_Object *obj, void *event_info);
+void test_scroller3(void *data, Evas_Object *obj, void *event_info);
+void test_scroller4(void *data, Evas_Object *obj, void *event_info);
+void test_spinner(void *data, Evas_Object *obj, void *event_info);
+void test_index(void *data, Evas_Object *obj, void *event_info);
+void test_index2(void *data, Evas_Object *obj, void *event_info);
+void test_index3(void *data, Evas_Object *obj, void *event_info);
+void test_index_horizontal(void *data, Evas_Object *obj, void *event_info);
+void test_photocam(void *data, Evas_Object *obj, void *event_info);
+void test_photocam_remote(void *data, Evas_Object *obj, void *event_info);
+void test_photo(void *data, Evas_Object *obj, void *event_info);
+void test_prefs(void *data, Evas_Object *obj, void *event_info);
+void test_thumb(void *data, Evas_Object *obj, void *event_info);
+void test_icon_desktops(void *data, Evas_Object *obj, void *event_info);
+void test_icon_animated(void *data, Evas_Object *obj, void *event_info);
+void test_notify(void *data, Evas_Object *obj, void *event_info);
+void test_slideshow(void *data, Evas_Object *obj, void *event_info);
+void test_menu(void *data, Evas_Object *obj, void *event_info);
+void test_menu2(void *data, Evas_Object *obj, void *event_info);
+void test_panel(void *data, Evas_Object *obj, void *event_info);
+void test_panel2(void *data, Evas_Object *obj, void *event_info);
+void test_panes(void *data, Evas_Object *obj, void *event_info);
+void test_calendar(void *data, Evas_Object *obj, void *event_info);
+void test_calendar2(void *data, Evas_Object *obj, void *event_info);
+void test_calendar3(void *data, Evas_Object *obj, void *event_info);
+void test_map(void *data, Evas_Object *obj, void *event_info);
+void test_weather(void *data, Evas_Object *obj, void *event_info);
+void test_flip(void *data, Evas_Object *obj, void *event_info);
+void test_flip2(void *data, Evas_Object *obj, void *event_info);
+void test_flip3(void *data, Evas_Object *obj, void *event_info);
+void test_flip_interactive(void *data, Evas_Object *obj, void *event_info);
+void test_flip_to(void *data, Evas_Object *obj, void *event_info);
+void test_flip_page(void *data, Evas_Object *obj, void *event_info);
+void test_label(void *data, Evas_Object *obj, void *event_info);
+void test_label_slide(void *data, Evas_Object *obj, void *event_info);
+void test_label_wrap(void *data, Evas_Object *obj, void *event_info);
+void test_label_ellipsis(void *data, Evas_Object *obj, void *event_info);
+void test_conformant(void *data, Evas_Object *obj, void *event_info);
+void test_conformant2(void *data, Evas_Object *obj, void *event_info);
+void test_conformant_indicator(void *data, Evas_Object *obj, void *event_info);
+void test_main_menu(void *data, Evas_Object *obj, void *event_info);
+void test_multi(void *data, Evas_Object *obj, void *event_info);
+void test_floating(void *data, Evas_Object *obj, void *event_info);
+void test_launcher(void *data, Evas_Object *obj, void *event_info);
+void test_launcher2(void *data, Evas_Object *obj, void *event_info);
+void test_launcher3(void *data, Evas_Object *obj, void *event_info);
+void test_anim(void *data, Evas_Object *obj, void *event_info);
+void test_tooltip(void *data, Evas_Object *obj, void *event_info);
+void test_tooltip2(void *data, Evas_Object *obj, void *event_info);
+void test_tooltip3(void *data, Evas_Object *obj, void *event_info);
+void test_cursor(void *data, Evas_Object *obj, void *event_info);
+void test_cursor2(void *data, Evas_Object *obj, void *event_info);
+void test_cursor3(void *data, Evas_Object *obj, void *event_info);
+void test_cursor4(void *data, Evas_Object *obj, void *event_info);
+void test_focus(void *data, Evas_Object *obj, void *event_info);
+void test_focus2(void *data, Evas_Object *obj, void *event_info);
+void test_focus_hide_del(void *data, Evas_Object *obj, void *event_info);
+void test_focus_custom_chain(void *data, Evas_Object *obj, void *event_info);
+void test_focus_style(void *data, Evas_Object *obj, void *event_info);
+void test_focus_part(void *data, Evas_Object *obj, void *event_info);
+void test_focus3(void *data, Evas_Object *obj, void *event_info);
+void test_focus_object_style(void *data, Evas_Object *obj, void *event_info);
+void test_focus_object_policy(void *data, Evas_Object *obj, void *event_info);
+void test_flipselector(void *data, Evas_Object *obj, void *event_info);
+void test_diskselector(void *data, Evas_Object *obj, void *event_info);
+void test_colorselector(void *data, Evas_Object *obj, void *event_info);
+void test_ctxpopup(void *data, Evas_Object *obj, void *event_info);
+void test_bubble(void *data, Evas_Object *obj, void *event_info);
+void test_segment_control(void *data, Evas_Object *obj, void *event_info);
+void test_store(void *data, Evas_Object *obj, void *event_info);
+void test_sys_notify(void *data, Evas_Object *obj, void *event_info);
+void test_systray(void *data, Evas_Object *obj, void *event_info);
+void test_win_inline(void *data, Evas_Object *obj, void *event_info);
+void test_win_keygrab(void *data, Evas_Object *obj, void *event_info);
+void test_win_socket(void *data, Evas_Object *obj, void *event_info);
+void test_win_plug(void *data, Evas_Object *obj, void *event_info);
+void test_win_wm_rotation(void *data, Evas_Object *obj, void *event_info);
+void test_grid(void *data, Evas_Object *obj, void *event_info);
+void test_glview_simple(void *data, Evas_Object *obj, void *event_info);
+void test_glview(void *data, Evas_Object *obj, void *event_info);
+void test_glview_manygears(void *data, Evas_Object *obj, void *event_info);
+void test_3d(void *data, Evas_Object *obj, void *event_info);
+void test_naviframe(void *data, Evas_Object *obj, void *event_info);
+void test_naviframe2(void *data, Evas_Object *obj, void *event_info);
+void test_naviframe3(void *data, Evas_Object *obj, void *event_info);
+void test_naviframe_complex(void *data, Evas_Object *obj, void *event_info);
+//void test_factory(void *data, Evas_Object *obj, void *event_info);
+void test_datetime(void *data, Evas_Object *obj, void *event_info);
+void test_popup(void *data, Evas_Object *obj, void *event_info);
+void test_dayselector(void *data, Evas_Object *obj, void *event_info);
+void test_image(void *data, Evas_Object *obj, void *event_info);
+void test_remote_image(void *data, Evas_Object *obj, void *event_info);
+void test_click_image(void *data, Evas_Object *obj, void *event_info);
+void test_external_button(void *data, Evas_Object *obj, void *event_info);
+void test_external_slider(void *data, Evas_Object *obj, void *event_info);
+void test_external_scroller(void *data, Evas_Object *obj, void *event_info);
+void test_external_pbar(void *data, Evas_Object *obj, void *event_info);
+void test_external_video(void *data, Evas_Object *obj, void *event_info);
+void test_config(void *data, Evas_Object *obj, void *event_info);
+void test_video(void *data, Evas_Object *obj, void *event_info);
+void test_eio(void *data, Evas_Object *obj, void *event_info);
+#ifdef HAVE_ELEMENTARY_WEB
+void test_web(void *data, Evas_Object *obj, void *event_info);
+void test_web_ui(void *data, Evas_Object *obj, void *event_info);
+#endif
+void test_dnd_genlist_default_anim(void *data, Evas_Object *obj, void *event_info);
+void test_dnd_genlist_user_anim(void *data, Evas_Object *obj, void *event_info);
+void test_dnd_genlist_gengrid(void *data, Evas_Object *obj, void *event_info);
+void test_dnd_multi_features(void *data, Evas_Object *obj, void *event_info);
+void test_dnd_types(void *data, Evas_Object *obj, void *event_info);
+void test_task_switcher(void *data, Evas_Object *obj, void *event_info);
+void test_application_server_message(void *data, Evas_Object *obj, void *event_info);
+void test_application_server_phone(void *data, Evas_Object *obj, void *event_info);
+void test_win_dialog(void *data, Evas_Object *obj, void *event_info);
+void test_box_disable(void *data, Evas_Object *obj, void *event_info);
+void test_layout_disable(void *data, Evas_Object *obj, void *event_info);
+
+void test_colorclass(void *data, Evas_Object *obj, void *event_info);
+
+Evas_Object *win, *tbx; // TODO: refactoring
+void *tt;
+Eina_List *tests;
+
+struct elm_test
+{
+ const char *icon;
+ const char *category;
+ const char *name;
+ void (*cb)(void *, Evas_Object *, void *);
+};
+
+static int
+_elm_test_sort(const void *pa, const void *pb)
+{
+ const struct elm_test *a = pa, *b = pb;
+ int res = strcasecmp(a->category, b->category);
+ if (res) return res;
+ return strcasecmp(a->name, b->name);
+}
+
+static void
+_elm_test_add(Eina_List **p_list, const char *icon, const char *category, const char *name, void (*cb)(void *, Evas_Object *, void *))
+{
+ struct elm_test *t = malloc(sizeof(struct elm_test));
+ t->icon = icon;
+ t->category = category;
+ t->name = name;
+ t->cb = cb;
+ *p_list = eina_list_sorted_insert(*p_list, _elm_test_sort, t);
+}
+
+void
+my_win_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_exit(); /* exit the program's main loop that runs in elm_run() */
+}
+
+static void
+_ui_tg_changed(void *data, Evas_Object *obj, void *event_info)
+{
+ (void) data; (void) event_info;
+ elm_config_mirrored_set(elm_check_state_get(obj));
+}
+
+static void
+_frame_clicked(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ printf("frame %p is: %s\n", obj, elm_frame_collapse_get(obj) ? "collapsed" : "expanded");
+}
+
+static void
+_menu_create(const char *option_str)
+{
+ struct elm_test *t = NULL;
+ const char *pcat = NULL;
+ Evas_Object *cfr = NULL, *tbx2 = NULL, *bt = NULL, *ic = NULL;
+ char buf[PATH_MAX];
+ Eina_List *l;
+
+ elm_box_clear(tbx);
+ EINA_LIST_FOREACH(tests, l, t)
+ {
+ if (option_str && !strcasestr(t->name, option_str)) continue;
+ if ((!pcat) || (strcmp(pcat, t->category)))
+ {
+ cfr = elm_frame_add(win);
+ // FIXME: add new style of frame for this
+ evas_object_smart_callback_add(cfr, "clicked", _frame_clicked, NULL);
+ elm_frame_autocollapse_set(cfr, EINA_TRUE);
+ elm_object_text_set(cfr, t->category);
+ evas_object_size_hint_weight_set(cfr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(cfr, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(tbx, cfr);
+ evas_object_show(cfr);
+
+ tbx2 = elm_box_add(win);
+ elm_box_layout_set(tbx2, evas_object_box_layout_flow_horizontal, NULL, NULL);
+ evas_object_size_hint_weight_set(tbx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(tbx2, EVAS_HINT_FILL, 0.0);
+ elm_box_align_set(tbx2, 0.0, 0.5);
+ elm_object_content_set(cfr, tbx2);
+ evas_object_show(tbx2);
+ }
+ bt = elm_button_add(win);
+ // FIXME: add new style of button for this like efm in e17
+ elm_object_text_set(bt, t->name);
+ if (t->icon)
+ {
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), t->icon);
+ elm_image_file_set(ic, buf, NULL);
+ elm_object_part_content_set(bt, "icon", ic);
+ evas_object_show(ic);
+ }
+ elm_box_pack_end(tbx2, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", t->cb, win);
+ pcat = t->category;
+ if (t == tt) tt = cfr;
+ }
+}
+
+static void
+_entry_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ const char *str = elm_entry_entry_get(obj);
+ if (!str) return;
+ _menu_create(str);
+}
+
+static char *
+_space_removed_string_get(const char *name)
+{
+ int i = 0, j = 0, len;
+ char *ret;
+
+ len = strlen(name);
+ ret = calloc(len + 1, sizeof(char));
+
+ while (name[i])
+ {
+ if (name[i] != ' ')
+ {
+ ret[j] = name[i];
+ j++;
+ }
+ i++;
+ }
+
+ return ret;
+}
+
+static void
+my_win_main(const char *autorun, Eina_Bool test_win_only)
+{
+ Evas_Object *bg = NULL, *bx0 = NULL, *bx1 = NULL, *lb = NULL;
+ Evas_Object *fr = NULL, *tg = NULL, *sc = NULL, *en = NULL;
+ Eina_List *l = NULL;
+ struct elm_test *t = NULL;
+
+ if (test_win_only) goto add_tests;
+ /* Create an elm window - It returns an evas object. This is a little
+ * special as the object lives in the canvas that is inside the window
+ * so what is returned is really inside the window, but as you manipulate
+ * the evas object returned - the window will respond. elm_win makes sure
+ * of that so you can blindly treat it like any other evas object
+ * pretty much, just as long as you know it has special significance.
+ * The first parameter is a "parent" window - eg for a dialog you want to
+ * have a main window it is related to, here it is NULL meaning there
+ * is no parent. "main" is the name of the window - used by the window
+ * manager for identifying the window uniquely amongst all the windows
+ * within this application (and all instances of the application). The
+ * type is a basic window (the final parameter).
+ * You can call elm_win_util_standard_add() instead. This is a convenient API
+ * for window and bg creation. You don't need to create bg object manually.
+ * You can also set the title of the window at the same time.
+ * ex) win = elm_win_util_standard_add("main", "Elementary Tests"); */
+ win = elm_win_add(NULL, "main", ELM_WIN_BASIC);
+ if (!win) exit(1);
+
+ explode_win_enable(win);
+ /* Set the title of the window - This is in the titlebar. */
+ elm_win_title_set(win, "Elementary Tests");
+
+ /* Set a callback on the window when "delete,request" is emitted as
+ * a callback. When this happens my_win_del() is called and the
+ * data pointer (first param) is passed the final param here (in this
+ * case it is NULL). This is how you can pass specific things to a
+ * callback like objects or data layered on top. */
+ evas_object_smart_callback_add(win, "delete,request", my_win_del, NULL);
+
+ /* Add a background to our window. This just uses the standard theme set
+ * background. Without a background, you could make a window seem
+ * transparent with elm_win_alpha_set(win, EINA_TRUE); For example. if you
+ * have a compositor running this will make the window able to be
+ * semi-transparent and any space not filled by object/widget pixels will
+ * be transparent or translucent based on alpha. If you do not have a
+ * compositor running this should fall back to using shaped windows
+ * (which have a mask). Both these features will be slow and rely on
+ * a lot more resources, so only use it if you need it. */
+ bg = elm_bg_add(win);
+ /* Set weight to 1.0 x 1.0 == expand in both x and y direction. */
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ /* Tell the window that this object is to be resized along with the window.
+ * Also as a result this object will be one of several objects that
+ * controls the minimum/maximum size of the window. */
+ elm_win_resize_object_add(win, bg);
+ /* And show the background. */
+ evas_object_show(bg);
+
+ /* Add a box layout widget to the window. */
+ bx0 = elm_box_add(win);
+ /* Allow base box (bx0) to expand in x and y. */
+ evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ /* Tell the window that the box affects window size and also will be
+ * resized when the window is resized. */
+ elm_win_resize_object_add(win, bx0);
+ evas_object_show(bx0);
+
+ fr = elm_frame_add(win);
+ evas_object_smart_callback_add(fr, "clicked", _frame_clicked, NULL);
+ elm_frame_autocollapse_set(fr, EINA_TRUE);
+ elm_object_text_set(fr, "Information");
+ elm_box_pack_end(bx0, fr);
+ evas_object_show(fr);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "Please select a test from the list below by clicking<br/>"
+ "the test button to show the test window.");
+ elm_object_content_set(fr, lb);
+ evas_object_show(lb);
+
+ /* This label will not be read out */
+ elm_access_object_unregister(lb);
+
+ tg = elm_check_add(win);
+ elm_object_style_set(tg, "toggle");
+ elm_object_text_set(tg, "UI-Mirroring:");
+ elm_check_state_set(tg, elm_config_mirrored_get());
+ evas_object_smart_callback_add(tg, "changed", _ui_tg_changed, NULL);
+ elm_box_pack_end(bx0, tg);
+ evas_object_show(tg);
+
+ bx1 = elm_box_add(win);
+ elm_box_horizontal_set(bx1, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx1, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx1, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(bx0, bx1);
+ evas_object_show(bx1);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, " Search Menu :");
+ evas_object_size_hint_weight_set(lb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx1, lb);
+ evas_object_show(lb);
+
+ en = elm_entry_add(win);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_object_part_text_set(en, "guide", "Type widget name here to search.");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(en, "changed,user", _entry_changed_cb, NULL);
+ elm_box_pack_end(bx1, en);
+ evas_object_show(en);
+ elm_object_focus_set(en, EINA_TRUE);
+
+ sc = elm_scroller_add(win);
+ elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx0, sc);
+ evas_object_show(sc);
+
+ tbx = elm_box_add(win);
+ evas_object_size_hint_weight_set(tbx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(tbx, EVAS_HINT_FILL, 0.0);
+ elm_object_content_set(sc, tbx);
+ evas_object_show(tbx);
+
+add_tests:
+ tests = NULL;
+#define ADD_TEST(icon_, cat_, name_, cb_) _elm_test_add(&tests, icon_, cat_, name_, cb_)
+
+ //------------------------------//
+ ADD_TEST(NULL, "Window / Background", "Bg Plain", test_bg_plain);
+ ADD_TEST(NULL, "Window / Background", "Bg Image", test_bg_image);
+ ADD_TEST(NULL, "Window / Background", "Bg Options", test_bg_options);
+ ADD_TEST(NULL, "Window / Background", "Window States", test_win_state);
+ ADD_TEST(NULL, "Window / Background", "Window States 2", test_win_state2);
+ ADD_TEST(NULL, "Window / Background", "Inwin", test_inwin);
+ ADD_TEST(NULL, "Window / Background", "Inwin 2", test_inwin2);
+ ADD_TEST(NULL, "Window / Background", "Window Inline", test_win_inline);
+ ADD_TEST(NULL, "Window / Background", "Window Socket", test_win_socket);
+ ADD_TEST(NULL, "Window / Background", "Window Plug", test_win_plug);
+ ADD_TEST(NULL, "Window / Background", "Window WM Rotation", test_win_wm_rotation);
+ ADD_TEST(NULL, "Window / Background", "Window Standard/Dialog", test_win_dialog);
+ ADD_TEST(NULL, "Window / Background", "Window Keygrab Set", test_win_keygrab);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Images", "Icon", test_icon);
+ ADD_TEST(NULL, "Images", "Icon Transparent", test_icon_transparent);
+ ADD_TEST(NULL, "Images", "Icon Animation", test_icon_animated);
+ ADD_TEST(NULL, "Images", "Icon Standard", test_icon_standard);
+ ADD_TEST(NULL, "Images", "Photocam", test_photocam);
+ ADD_TEST(NULL, "Images", "Photocam Remote", test_photocam_remote);
+ ADD_TEST(NULL, "Images", "Photo", test_photo);
+ ADD_TEST(NULL, "Images", "Thumb", test_thumb);
+ ADD_TEST(NULL, "Images", "Image", test_image);
+ ADD_TEST(NULL, "Images", "Image Remote", test_remote_image);
+ ADD_TEST(NULL, "Images", "Image Click", test_click_image);
+ ADD_TEST(NULL, "Images", "Slideshow", test_slideshow);
+ ADD_TEST(NULL, "Images", "Video", test_video);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Containers", "Box Vert", test_box_vert);
+ ADD_TEST(NULL, "Containers", "Box Vert 2", test_box_vert2);
+ ADD_TEST(NULL, "Containers", "Box Pack", test_box_pack);
+ ADD_TEST(NULL, "Containers", "Box Horiz", test_box_horiz);
+ ADD_TEST(NULL, "Containers", "Box Homogeneous", test_box_homo);
+ ADD_TEST(NULL, "Containers", "Box Transition", test_box_transition);
+ ADD_TEST(NULL, "Containers", "Box Align", test_box_align);
+ ADD_TEST(NULL, "Containers", "Table", test_table);
+ ADD_TEST(NULL, "Containers", "Table Homogeneous", test_table2);
+ ADD_TEST(NULL, "Containers", "Table 3", test_table3);
+ ADD_TEST(NULL, "Containers", "Table 4", test_table4);
+ ADD_TEST(NULL, "Containers", "Table 5", test_table5);
+ ADD_TEST(NULL, "Containers", "Table 6", test_table6);
+ ADD_TEST(NULL, "Containers", "Table 7", test_table7);
+ ADD_TEST(NULL, "Containers", "Table Padding", test_table8);
+ ADD_TEST(NULL, "Containers", "Layout", test_layout);
+ ADD_TEST(NULL, "Containers", "Layout 2", test_layout2);
+ ADD_TEST(NULL, "Containers", "Grid", test_grid);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Entries", "Entry", test_entry);
+ ADD_TEST(NULL, "Entries", "Entry Style Default", test_entry_style_default);
+ ADD_TEST(NULL, "Entries", "Entry Style User", test_entry_style_user);
+ ADD_TEST(NULL, "Entries", "Entry Scrolled", test_entry_scrolled);
+ ADD_TEST(NULL, "Entries", "Entry 3", test_entry3);
+ ADD_TEST(NULL, "Entries", "Entry 4", test_entry4);
+ ADD_TEST(NULL, "Entries", "Entry 5", test_entry5);
+ ADD_TEST(NULL, "Entries", "Entry 6", test_entry6);
+ ADD_TEST(NULL, "Entries", "Entry 7", test_entry7);
+ ADD_TEST(NULL, "Entries", "Entry 8", test_entry8);
+ ADD_TEST(NULL, "Entries", "Entry Regex", test_entry_regex);
+ ADD_TEST(NULL, "Entries", "Entry Notepad", test_entry_notepad);
+ ADD_TEST(NULL, "Entries", "Multibuttonentry", test_multibuttonentry);
+ ADD_TEST(NULL, "Entries", "Entry Anchor", test_entry_anchor);
+ ADD_TEST(NULL, "Entries", "Entry Anchor2", test_entry_anchor2);
+ ADD_TEST(NULL, "Entries", "Entry Emoticon", test_entry_emoticon);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Buttons", "Button", test_button);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Prefs", "Prefs", test_prefs);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Effects", "Transit", test_transit);
+ ADD_TEST(NULL, "Effects", "Transit Resizing", test_transit_resizing);
+ ADD_TEST(NULL, "Effects", "Transit Flip", test_transit_flip);
+ ADD_TEST(NULL, "Effects", "Transit Zoom", test_transit_zoom);
+ ADD_TEST(NULL, "Effects", "Transit Blend", test_transit_blend);
+ ADD_TEST(NULL, "Effects", "Transit Fade", test_transit_fade);
+ ADD_TEST(NULL, "Effects", "Transit Resizable Flip",
+ test_transit_resizable_flip);
+ ADD_TEST(NULL, "Effects", "Transit Custom", test_transit_custom);
+ ADD_TEST(NULL, "Effects", "Transit Chain", test_transit_chain);
+ ADD_TEST(NULL, "Effects", "Transit Tween", test_transit_tween);
+ ADD_TEST(NULL, "Effects", "Transit Bezier", test_transit_bezier);
+ ADD_TEST(NULL, "Effects", "Flip", test_flip);
+ ADD_TEST(NULL, "Effects", "Flip 2", test_flip2);
+ ADD_TEST(NULL, "Effects", "Flip 3", test_flip3);
+ ADD_TEST(NULL, "Effects", "Flip Interactive", test_flip_interactive);
+ ADD_TEST(NULL, "Effects", "Flip To", test_flip_to);
+ ADD_TEST(NULL, "Effects", "Flip Page", test_flip_page);
+ ADD_TEST(NULL, "Effects", "Animation", test_anim);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Edje External", "ExtButton", test_external_button);
+ ADD_TEST(NULL, "Edje External", "ExtProgressBar", test_external_pbar);
+ ADD_TEST(NULL, "Edje External", "ExtScroller", test_external_scroller);
+ ADD_TEST(NULL, "Edje External", "ExtSlider", test_external_slider);
+ ADD_TEST(NULL, "Edje External", "ExtVideo", test_external_video);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Toolbars", "Toolbar", test_toolbar);
+ ADD_TEST(NULL, "Toolbars", "Toolbar 2", test_toolbar2);
+ ADD_TEST(NULL, "Toolbars", "Toolbar 3", test_toolbar3);
+ ADD_TEST(NULL, "Toolbars", "Toolbar 4", test_toolbar4);
+ ADD_TEST(NULL, "Toolbars", "Toolbar 5", test_toolbar5);
+ ADD_TEST(NULL, "Toolbars", "Toolbar 6", test_toolbar6);
+ ADD_TEST(NULL, "Toolbars", "Toolbar 7", test_toolbar7);
+ ADD_TEST(NULL, "Toolbars", "Toolbar 8", test_toolbar8);
+ ADD_TEST(NULL, "Toolbars", "Toolbar Vertical", test_toolbar_vertical);
+ ADD_TEST(NULL, "Toolbars", "Toolbar Focus", test_toolbar_focus);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Lists - List", "List", test_list);
+ ADD_TEST(NULL, "Lists - List", "List - Horizontal", test_list_horizontal);
+ ADD_TEST(NULL, "Lists - List", "List 2", test_list2);
+ ADD_TEST(NULL, "Lists - List", "List 3", test_list3);
+ ADD_TEST(NULL, "Lists - List", "List 4", test_list4);
+ ADD_TEST(NULL, "Lists - List", "List 5", test_list5);
+ ADD_TEST(NULL, "Lists - List", "List 6", test_list6);
+ ADD_TEST(NULL, "Lists - List", "List 7", test_list7);
+ ADD_TEST(NULL, "Lists - List", "List Focus", test_list_focus);
+ ADD_TEST(NULL, "Lists - List", "List Focus Horizontal", test_list_horiz_focus);
+ ADD_TEST(NULL, "Lists - List", "List Separator", test_list_separator);
+ ADD_TEST(NULL, "Lists - List", "List Multi Select", test_list_multi_select);
+
+ //------------------------------//
+
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist", test_genlist);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist 2", test_genlist2);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist 3", test_genlist3);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist 4", test_genlist4);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist 5", test_genlist5);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist 7", test_genlist7);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Tree", test_genlist6);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Group", test_genlist8);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Group Tree", test_genlist9);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Decorate Item Mode", test_genlist10);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Decorate All Mode", test_genlist15);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Reorder Mode", test_genlist_reorder);
+#ifdef HAVE_EIO
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Eio", test_eio);
+#endif
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Textblock", test_genlist12);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Tree, Insert Sorted", test_genlist13);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Tree, Insert Relative", test_genlist14);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Flip Mode", test_genlist16);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Decorate Modes", test_genlist17);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Tree and Decorate All Mode", test_genlist18);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Full Widget", test_genlist19);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Item Search By Text", test_genlist20);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Focus", test_genlist_focus);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Item Styles", test_genlist_item_styles);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Multi Select", test_genlist_multi_select);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Del", test_genlist_del);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Filter", test_genlist_filter);
+ ADD_TEST(NULL, "Lists - Genlist", "Genlist Show/Bring", test_genlist_show_bring);
+
+ //------------------------------//
+
+ ADD_TEST(NULL, "Lists - Gengrid", "GenGrid", test_gengrid);
+ ADD_TEST(NULL, "Lists - Gengrid", "GenGrid 2", test_gengrid2);
+ ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Group", test_gengrid3);
+ ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Show/Bring_in", test_gengrid4);
+ ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Item Search by Text", test_gengrid5);
+ ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Item Styles", test_gengrid_item_styles);
+ ADD_TEST(NULL, "Lists - Gengrid", "Gengrid Update Speed", test_gengrid_speed);
+ ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Focus", test_gengrid_focus);
+ ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Update", test_gengrid_update);
+
+ //------------------------------//
+ ADD_TEST(NULL, "General", "Scaling", test_scaling);
+ ADD_TEST(NULL, "General", "Scaling 2", test_scaling2);
+
+ //------------------------------//
+ ADD_TEST(NULL, "3D", "Evas Map 3D", test_3d);
+ ADD_TEST(NULL, "3D", "GLViewSimple", test_glview_simple);
+ ADD_TEST(NULL, "3D", "GLView Gears", test_glview);
+ ADD_TEST(NULL, "3D", "GLView Many Gears", test_glview_manygears);
+
+ //------------------------------//
+#ifdef HAVE_ELEMENTARY_WEB
+ ADD_TEST(NULL, "Web", "Web", test_web);
+ ADD_TEST(NULL, "Web", "Web UI", test_web_ui);
+#endif
+
+ //------------------------------//
+ ADD_TEST(NULL, "Input", "Gesture Layer", test_gesture_layer);
+ ADD_TEST(NULL, "Input", "Gesture Layer 2", test_gesture_layer2);
+ ADD_TEST(NULL, "Input", "Gesture Layer 3", test_gesture_layer3);
+ ADD_TEST(NULL, "Input", "Multi Touch", test_multi);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Selectors", "Index", test_index);
+ ADD_TEST(NULL, "Selectors", "Index 2", test_index2);
+ ADD_TEST(NULL, "Selectors", "Index 3", test_index3);
+ ADD_TEST(NULL, "Selectors", "Index Horizontal", test_index_horizontal);
+ ADD_TEST(NULL, "Selectors", "FileSelector", test_fileselector);
+ ADD_TEST(NULL, "Selectors", "FileSelector Entry", test_fileselector_entry);
+ ADD_TEST(NULL, "Selectors", "FileSelector Button", test_fileselector_button);
+ ADD_TEST(NULL, "Selectors", "Actionslider", test_actionslider);
+ ADD_TEST(NULL, "Selectors", "Menu", test_menu);
+ ADD_TEST(NULL, "Selectors", "Menu 2", test_menu2);
+ ADD_TEST(NULL, "Selectors", "DiskSelector", test_diskselector);
+ ADD_TEST(NULL, "Selectors", "ColorSelector", test_colorselector);
+ ADD_TEST(NULL, "Selectors", "Color Classes", test_colorclass);
+ ADD_TEST(NULL, "Selectors", "SegmentControl", test_segment_control);
+ ADD_TEST(NULL, "Selectors", "Hoversel", test_hoversel);
+ ADD_TEST(NULL, "Selectors", "Hoversel Focus", test_hoversel_focus);
+ ADD_TEST(NULL, "Selectors", "Radio", test_radio);
+ ADD_TEST(NULL, "Selectors", "FlipSelector", test_flipselector);
+ ADD_TEST(NULL, "Selectors", "DaySelector", test_dayselector);
+ ADD_TEST(NULL, "Selectors", "Main menu", test_main_menu);
+ ADD_TEST(NULL, "Selectors", "Combobox", test_combobox);
+ ADD_TEST(NULL, "Selectors", "Combobox Multiple Selection", test_combobox2);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Cursors", "Cursor", test_cursor);
+ ADD_TEST(NULL, "Cursors", "Cursor 2", test_cursor2);
+ ADD_TEST(NULL, "Cursors", "Cursor 3", test_cursor3);
+ ADD_TEST(NULL, "Cursors", "Cursor Layout", test_cursor4);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Scroller", "Scroller", test_scroller);
+ ADD_TEST(NULL, "Scroller", "Scroller 2", test_scroller2);
+ ADD_TEST(NULL, "Scroller", "Scroller 3", test_scroller3);
+ ADD_TEST(NULL, "Scroller", "Page Scroller", test_scroller4);
+
+ //------------------------------//
+ // FIXME: add frame test
+ ADD_TEST(NULL, "Boundaries", "Bubble", test_bubble);
+ ADD_TEST(NULL, "Boundaries", "Separator", test_separator);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Range Values", "Spinner", test_spinner);
+ ADD_TEST(NULL, "Range Values", "Slider", test_slider);
+ ADD_TEST(NULL, "Range Values", "Progressbar", test_progressbar);
+ ADD_TEST(NULL, "Range Values", "Progressbar 2", test_progressbar2);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Booleans", "Check", test_check);
+ ADD_TEST(NULL, "Booleans", "Check Toggle", test_check_toggle);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Popups", "Ctxpopup", test_ctxpopup);
+ ADD_TEST(NULL, "Popups", "Hover", test_hover);
+ ADD_TEST(NULL, "Popups", "Hover 2", test_hover2);
+ ADD_TEST(NULL, "Popups", "Hover 3", test_hover3);
+ ADD_TEST(NULL, "Popups", "Notify", test_notify);
+ ADD_TEST(NULL, "Popups", "Tooltip", test_tooltip);
+ ADD_TEST(NULL, "Popups", "Tooltip 2", test_tooltip2);
+ ADD_TEST(NULL, "Popups", "Tooltip 3", test_tooltip3);
+ ADD_TEST(NULL, "Popups", "Popup", test_popup);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Times & Dates", "Calendar", test_calendar);
+ ADD_TEST(NULL, "Times & Dates", "Calendar 2", test_calendar2);
+ ADD_TEST(NULL, "Times & Dates", "Calendar 3", test_calendar3);
+ ADD_TEST(NULL, "Times & Dates", "Clock", test_clock);
+ ADD_TEST(NULL, "Times & Dates", "Clock Edit", test_clock_edit);
+ ADD_TEST(NULL, "Times & Dates", "Clock Edit 2", test_clock_edit2);
+ ADD_TEST(NULL, "Times & Dates", "Clock Pause", test_clock_pause);
+ ADD_TEST(NULL, "Times & Dates", "Datetime", test_datetime);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Text", "Label", test_label);
+ ADD_TEST(NULL, "Text", "Label Slide", test_label_slide);
+ ADD_TEST(NULL, "Text", "Label Wrap", test_label_wrap);
+ ADD_TEST(NULL, "Text", "Label Ellipsis", test_label_ellipsis);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Stored Surface Buffer", "Launcher", test_launcher);
+ ADD_TEST(NULL, "Stored Surface Buffer", "Launcher 2", test_launcher2);
+ ADD_TEST(NULL, "Stored Surface Buffer", "Launcher 3", test_launcher3);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Focus", "Focus", test_focus);
+ ADD_TEST(NULL, "Focus", "Focus 2", test_focus2);
+ ADD_TEST(NULL, "Focus", "Focus Hide/Del", test_focus_hide_del);
+ ADD_TEST(NULL, "Focus", "Focus Custom Chain", test_focus_custom_chain);
+ ADD_TEST(NULL, "Focus", "Focus Style", test_focus_style);
+ ADD_TEST(NULL, "Focus", "Focus On Part", test_focus_part);
+ ADD_TEST(NULL, "Focus", "Focus 3", test_focus3);
+ ADD_TEST(NULL, "Focus", "Focus Object Style", test_focus_object_style);
+ ADD_TEST(NULL, "Focus", "Focus Object Policy", test_focus_object_policy);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Naviframe", "Naviframe", test_naviframe);
+ ADD_TEST(NULL, "Naviframe", "Naviframe 2", test_naviframe2);
+ ADD_TEST(NULL, "Naviframe", "Naviframe 3", test_naviframe3);
+ ADD_TEST(NULL, "Naviframe", "Naviframe: Complex", test_naviframe_complex);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Geographic", "Map", test_map);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Dividers", "Panel", test_panel);
+ ADD_TEST(NULL, "Dividers", "Panel Scrollable", test_panel2);
+ ADD_TEST(NULL, "Dividers", "Panes", test_panes);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Standardization", "Conformant", test_conformant);
+ ADD_TEST(NULL, "Standardization", "Conformant 2", test_conformant2);
+ ADD_TEST(NULL, "Standardization", "Conformant indicator", test_conformant_indicator);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Helpers", "Store", test_store);
+// ADD_TEST(NULL, "Helpers", "Factory", test_factory);
+
+ //------------------------------//
+ ADD_TEST(NULL, "System", "Notification", test_sys_notify);
+ ADD_TEST(NULL, "System", "Systray Item", test_systray);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Drag & Drop", "Genlist DnD Dflt Anim", test_dnd_genlist_default_anim);
+ ADD_TEST(NULL, "Drag & Drop", "Genlist DnD User Anim", test_dnd_genlist_user_anim);
+ ADD_TEST(NULL, "Drag & Drop", "Genlist-Gengrid DnD", test_dnd_genlist_gengrid);
+ ADD_TEST(NULL, "Drag & Drop", "Features DnD", test_dnd_multi_features);
+ ADD_TEST(NULL, "Drag & Drop", "Types DnD", test_dnd_types);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Miscellaneous", "Copy And Paste", test_cnp);
+ ADD_TEST(NULL, "Miscellaneous", "Weather", test_weather);
+ ADD_TEST(NULL, "Miscellaneous", "Icon Desktops", test_icon_desktops);
+ ADD_TEST(NULL, "Miscellaneous", "Floating Objects", test_floating);
+ ADD_TEST(NULL, "Miscellaneous", "Configuration", test_config);
+ ADD_TEST(NULL, "Miscellaneous", "Accessibility", test_access);
+ ADD_TEST(NULL, "Miscellaneous", "Accessibility2", test_access2);
+ ADD_TEST(NULL, "Miscellaneous", "Accessibility3", test_access3);
+
+ //------------------------------//
+ ADD_TEST(NULL, "Application client/server", "Task switcher", test_task_switcher);
+ ADD_TEST(NULL, "Application client/server", "Phone", test_application_server_phone);
+ ADD_TEST(NULL, "Application client/server", "Message", test_application_server_message);
+
+ ADD_TEST(NULL, "Widgets Disable/Enable", "Box", test_box_disable);
+ ADD_TEST(NULL, "Widgets Disable/Enable", "Layout", test_layout_disable);
+
+#undef ADD_TEST
+
+ if (autorun)
+ {
+ char *tmp = _space_removed_string_get(autorun);
+ EINA_LIST_FOREACH(tests, l, t)
+ {
+ char *name;
+
+ if (!t->name || !t->cb) continue;
+
+ name = _space_removed_string_get(t->name);
+ if (!strcasecmp(name, tmp))
+ {
+ t->cb(NULL, NULL, NULL);
+ free(name);
+ break;
+ }
+ free(name);
+ }
+ free(tmp);
+
+ if (!l)
+ ERR("'%s' is not valid test case name\n", autorun);
+ }
+ tt = t;
+
+ if (test_win_only)
+ {
+ EINA_LIST_FREE(tests, t)
+ free(t);
+
+ if (!l)
+ elm_exit();
+
+ return;
+ }
+
+ if (tests)
+ _menu_create(NULL);
+
+ /* bring in autorun frame */
+ if (autorun)
+ {
+ Evas_Coord x, y;
+ evas_object_geometry_get(tt, &x, &y, NULL, NULL);
+ elm_scroller_region_bring_in(sc, x, y, 0, 0);
+ }
+
+ /* set an initial window size */
+ evas_object_resize(win, 480, 480);
+ evas_object_show(win);
+}
+
+static char *
+colorclass_tl_cb(char *str)
+{
+ /* FIXME: translate? */
+ return str;
+}
+
+static Eina_List *
+colorclass_list_cb(void)
+{
+ Eina_List *l, *ret = NULL;
+ Eina_Iterator *it;
+ Eina_File *f;
+
+ it = edje_file_iterator_new();
+ if (!it) return NULL;
+ EINA_ITERATOR_FOREACH(it, f)
+ {
+ l = elm_color_class_util_edje_file_list(f);
+ if (l)
+ ret = eina_list_merge(ret, l);
+ }
+ eina_iterator_free(it);
+ return ret;
+}
+
+/* this is your elementary main function - it MUST be called IMMEDIATELY
+ * after elm_init() and MUST be passed argc and argv, and MUST be called
+ * elm_main and not be static - must be a visible symbol with EAPI_MAIN infront */
+EAPI_MAIN int
+elm_main(int argc, char **argv)
+{
+ Eina_Bool test_win_only = EINA_FALSE;
+ char *autorun = NULL;
+ struct elm_test *t = NULL;
+
+ _log_domain = eina_log_domain_register("elementary_test", NULL);
+
+ elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+
+ /* tell elm about our app so it can figure out where to get files */
+ elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR);
+ elm_app_compile_lib_dir_set(PACKAGE_LIB_DIR);
+ elm_app_compile_data_dir_set(PACKAGE_DATA_DIR);
+ elm_app_info_set(elm_main, "elementary", "images/logo.png");
+
+ /* if called with a single argument try to autorun a test with
+ * the same name as the given param
+ * ex: elementary_test "Box Vert 2" */
+ if (argc == 2)
+ {
+ if (!strcmp(argv[1], "--help"))
+ {
+ printf("Usages:\n"
+ "$ elementary_test\n"
+ "$ elementary_test --test-win-only [TEST_NAME]\n"
+ "$ elementary_test -to [TEST_NAME]\n\n"
+ "Examples:\n"
+ "$ elementary_test -to Button\n\n");
+ goto end;
+ }
+ autorun = argv[1];
+ }
+ else if (argc == 3)
+ {
+ /* Just a workaround to make the shot module more
+ * useful with elementary test. */
+ if ((!strcmp(argv[1], "--test-win-only")) ||
+ (!strcmp(argv[1], "-to")))
+ {
+ test_win_only = EINA_TRUE;
+ autorun = argv[2];
+ }
+ }
+
+ elm_color_class_translate_cb_set(colorclass_tl_cb);
+ elm_color_class_list_cb_set(colorclass_list_cb);
+ /* put here any init specific to this app like parsing args etc. */
+ my_win_main(autorun, test_win_only); /* create main window */
+ elm_run(); /* and run the program now and handle all events etc. */
+ /* if the mainloop that elm_run() runs exist - we exit the app */
+
+ EINA_LIST_FREE(tests, t)
+ free(t);
+
+end:
+ eina_log_domain_unregister(_log_domain);
+
+ /* exit code */
+ return 0;
+}
+/* all elementary apps should use this. but it should be placed right after
+ * elm_main() */
+ELM_MAIN()
diff --git a/src/bin/elementary/test.h b/src/bin/elementary/test.h
new file mode 100644
index 0000000000..a5e78bb56a
--- /dev/null
+++ b/src/bin/elementary/test.h
@@ -0,0 +1,12 @@
+#ifndef _TEST_H
+#define _TEST_H
+
+extern int _log_domain;
+
+#define CRI(...) EINA_LOG_DOM_CRIT(_log_domain, _VA_ARGS__)
+#define ERR(...) EINA_LOG_DOM_ERR(_log_domain, __VA_ARGS__)
+#define WRN(...) EINA_LOG_DOM_WARN(_log_domain, __VA_ARGS__)
+#define INF(...) EINA_LOG_DOM_INFO(_log_domain, __VA_ARGS__)
+#define DBG(...) EINA_LOG_DOM_DBG(_log_domain, __VA_ARGS__)
+
+#endif
diff --git a/src/bin/elementary/test_3d.c b/src/bin/elementary/test_3d.c
new file mode 100644
index 0000000000..66292727b9
--- /dev/null
+++ b/src/bin/elementary/test_3d.c
@@ -0,0 +1,333 @@
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct _Point
+{
+ Evas_Coord x, y, z, u, v;
+} Point;
+
+typedef struct _Side
+{
+ Evas_Object *o;
+ Point pt[4];
+} Side;
+
+typedef struct _Cube
+{
+ Side side[6];
+} Cube;
+
+static Cube *cube;
+static double rotx = 0.0, roty = 0.0, rotz = 0.0;
+static double cxo = 0.0, cyo = 0.0, focv = 256.0, z0v = 0.0;
+#define POINT(n, p, xx, yy, zz, uu, vv) \
+ c->side[n].pt[p].x = xx; \
+ c->side[n].pt[p].y = yy; \
+ c->side[n].pt[p].z = zz; \
+ c->side[n].pt[p].u = uu; \
+ c->side[n].pt[p].v = vv
+
+static Cube *
+_cube_new(Evas *evas, Evas_Coord w, Evas_Coord h, Evas_Coord d)
+{
+ Cube *c;
+ int i;
+
+ w -= (w / 2);
+ h -= (h / 2);
+ d -= (d / 2);
+ c = calloc(1, sizeof(Cube));
+ for (i = 0; i < 6; i++)
+ {
+ Evas_Object *o;
+ char buf[PATH_MAX];
+ o = evas_object_image_filled_add(evas);
+ c->side[i].o = o;
+ snprintf(buf, sizeof(buf), "%s/images/%s",
+ elm_app_data_dir_get(), "twofish.jpg");
+ evas_object_image_file_set(o, buf, NULL);
+ evas_object_resize(o, 256, 256);
+ evas_object_pass_events_set(o, EINA_TRUE);
+ evas_object_color_set(o, 235, 235, 235, 235);
+ evas_object_show(o);
+ }
+ POINT(0, 0, -w, -h, -d, 0, 0);
+ POINT(0, 1, w, -h, -d, 256, 0);
+ POINT(0, 2, w, h, -d, 256, 256);
+ POINT(0, 3, -w, h, -d, 0, 256);
+
+ POINT(1, 0, w, -h, -d, 0, 0);
+ POINT(1, 1, w, -h, d, 256, 0);
+ POINT(1, 2, w, h, d, 256, 256);
+ POINT(1, 3, w, h, -d, 0, 256);
+
+ POINT(2, 0, w, -h, d, 0, 0);
+ POINT(2, 1, -w, -h, d, 256, 0);
+ POINT(2, 2, -w, h, d, 256, 256);
+ POINT(2, 3, w, h, d, 0, 256);
+
+ POINT(3, 0, -w, -h, d, 0, 0);
+ POINT(3, 1, -w, -h, -d, 256, 0);
+ POINT(3, 2, -w, h, -d, 256, 256);
+ POINT(3, 3, -w, h, d, 0, 256);
+
+ POINT(4, 0, -w, -h, d, 0, 0);
+ POINT(4, 1, w, -h, d, 256, 0);
+ POINT(4, 2, w, -h, -d, 256, 256);
+ POINT(4, 3, -w, -h, -d, 0, 256);
+
+ POINT(5, 0, -w, h, -d, 0, 0);
+ POINT(5, 1, w, h, -d, 256, 0);
+ POINT(5, 2, w, h, d, 256, 256);
+ POINT(5, 3, -w, h, d, 0, 256);
+
+ return c;
+}
+
+static void
+_cube_pos(Cube *c,
+ Evas_Coord x, Evas_Coord y, Evas_Coord z,
+ double dx, double dy, double dz,
+ Evas_Coord cx, Evas_Coord cy, Evas_Coord z0, Evas_Coord foc)
+{
+ Evas_Map *m;
+ int i, j, order[6], sorted;
+ Evas_Coord mz[6];
+
+ m = evas_map_new(4);
+
+ for (i = 0; i < 6; i++)
+ {
+ Evas_Coord tz[4];
+
+ for (j = 0; j < 4; j++)
+ {
+ evas_map_point_coord_set(m, j,
+ c->side[i].pt[j].x + x,
+ c->side[i].pt[j].y + y,
+ c->side[i].pt[j].z + z);
+ evas_map_point_image_uv_set(m, j,
+ c->side[i].pt[j].u,
+ c->side[i].pt[j].v);
+ evas_map_point_color_set(m, j, 255, 255, 255, 255);
+ }
+ evas_map_util_3d_rotate(m, dx, dy, dz, x, y, z);
+ evas_map_util_3d_lighting(m, -1000, -1000, -1000,
+ 255, 255, 255,
+ 20, 20, 20);
+ evas_map_util_3d_perspective(m, cx, cy, z0, foc);
+ if (evas_map_util_clockwise_get(m))
+ {
+ evas_object_map_enable_set(c->side[i].o, EINA_TRUE);
+ evas_object_map_set(c->side[i].o, m);
+ evas_object_show(c->side[i].o);
+ }
+ else
+ evas_object_hide(c->side[i].o);
+
+ order[i] = i;
+ for (j = 0; j < 4; j++)
+ evas_map_point_coord_get(m, j, NULL, NULL, &(tz[j]));
+ mz[i] = (tz[0] + tz[1] + tz[2] + tz[3]) / 4;
+ }
+ do
+ {
+ sorted = 1;
+ for (i = 0; i < 5; i++)
+ {
+ if (mz[order[i]] > mz[order[i + 1]])
+ {
+ j = order[i];
+ order[i] = order[i + 1];
+ order[i + 1] = j;
+ sorted = 0;
+ }
+ }
+ }
+ while (!sorted);
+
+ evas_object_raise(c->side[order[0]].o);
+ for (i = 1; i < 6; i++)
+ evas_object_stack_below(c->side[order[i]].o, c->side[order[i - 1]].o);
+ evas_map_free(m);
+}
+
+static void
+_cube_update(Evas_Object *win, Cube *c)
+{
+ Evas_Coord w, h;
+
+ evas_object_geometry_get(win, NULL, NULL, &w, &h);
+ _cube_pos(c,
+ (w / 2), (h / 2), 512,
+ rotx, roty, rotz,
+ (w / 2) + cxo, (h / 2) + cyo, z0v, focv);
+}
+
+void
+_ch_rot_x(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ rotx = elm_slider_value_get(obj);
+ _cube_update(win, cube);
+}
+
+void
+_ch_rot_y(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ roty = elm_slider_value_get(obj);
+ _cube_update(win, cube);
+}
+
+void
+_ch_rot_z(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ rotz = elm_slider_value_get(obj);
+ _cube_update(win, cube);
+}
+
+void
+_ch_cx(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ cxo = elm_slider_value_get(obj);
+ _cube_update(win, cube);
+}
+
+void
+_ch_cy(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ cyo = elm_slider_value_get(obj);
+ _cube_update(win, cube);
+}
+
+void
+_ch_foc(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ focv = elm_slider_value_get(obj);
+ _cube_update(win, cube);
+}
+
+void
+_ch_z0(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ z0v = elm_slider_value_get(obj);
+ _cube_update(win, cube);
+}
+
+void
+test_3d(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *sl;
+
+ win = elm_win_util_standard_add("evas-map-3d", "Evas Map 3D");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ cube = _cube_new(evas_object_evas_get(win), 240, 240, 240);
+
+ bx = elm_box_add(win);
+ evas_object_layer_set(bx, 10);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "Rot X");
+ elm_slider_unit_format_set(sl, "%1.0f units");
+ elm_slider_indicator_format_set(sl, "%1.0f units");
+ elm_slider_span_size_set(sl, 360);
+ elm_slider_min_max_set(sl, 0, 360);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sl);
+ evas_object_smart_callback_add(sl, "changed", _ch_rot_x, win);
+ evas_object_show(sl);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "Rot Y");
+ elm_slider_unit_format_set(sl, "%1.0f units");
+ elm_slider_indicator_format_set(sl, "%1.0f units");
+ elm_slider_span_size_set(sl, 360);
+ elm_slider_min_max_set(sl, 0, 360);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sl);
+ evas_object_smart_callback_add(sl, "changed", _ch_rot_y, win);
+ evas_object_show(sl);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "Rot Z");
+ elm_slider_unit_format_set(sl, "%1.0f units");
+ elm_slider_indicator_format_set(sl, "%1.0f units");
+ elm_slider_span_size_set(sl, 360);
+ elm_slider_min_max_set(sl, 0, 360);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sl);
+ evas_object_smart_callback_add(sl, "changed", _ch_rot_z, win);
+ evas_object_show(sl);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "PX Off");
+ elm_slider_unit_format_set(sl, "%1.0f units");
+ elm_slider_indicator_format_set(sl, "%1.0f units");
+ elm_slider_span_size_set(sl, 360);
+ elm_slider_min_max_set(sl, -320, 320);
+ elm_slider_value_set(sl, cxo);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sl);
+ evas_object_smart_callback_add(sl, "changed", _ch_cx, win);
+ evas_object_show(sl);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "PY Off");
+ elm_slider_unit_format_set(sl, "%1.0f units");
+ elm_slider_indicator_format_set(sl, "%1.0f units");
+ elm_slider_span_size_set(sl, 360);
+ elm_slider_min_max_set(sl, -320, 320);
+ elm_slider_value_set(sl, cyo);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sl);
+ evas_object_smart_callback_add(sl, "changed", _ch_cy, win);
+ evas_object_show(sl);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "Foc");
+ elm_slider_unit_format_set(sl, "%1.0f units");
+ elm_slider_indicator_format_set(sl, "%1.0f units");
+ elm_slider_span_size_set(sl, 360);
+ elm_slider_min_max_set(sl, 1, 2000);
+ elm_slider_value_set(sl, focv);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sl);
+ evas_object_smart_callback_add(sl, "changed", _ch_foc, win);
+ evas_object_show(sl);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "Z0");
+ elm_slider_unit_format_set(sl, "%1.0f units");
+ elm_slider_indicator_format_set(sl, "%1.0f units");
+ elm_slider_span_size_set(sl, 360);
+ elm_slider_min_max_set(sl, -2000, 2000);
+ elm_slider_value_set(sl, z0v);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sl);
+ evas_object_smart_callback_add(sl, "changed", _ch_z0, win);
+ evas_object_show(sl);
+
+ evas_object_resize(win, 480, 480);
+ _cube_update(win, cube);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_access.c b/src/bin/elementary/test_access.c
new file mode 100644
index 0000000000..80b8ea36e6
--- /dev/null
+++ b/src/bin/elementary/test_access.c
@@ -0,0 +1,398 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_cleanup_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_config_access_set(EINA_FALSE);
+}
+
+typedef struct _Item_Data
+{
+ Elm_Object_Item *item;
+ int index;
+} Item_Data;
+
+static Elm_Genlist_Item_Class *itc1, *itc2;
+char *gl_access_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ Item_Data *id = data;
+ snprintf(buf, sizeof(buf), "Item # %d", id->index);
+ return strdup(buf);
+}
+
+Evas_Object *gl_access_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
+{
+ char buf[PATH_MAX];
+ Evas_Object *bt;
+
+ if (!strcmp(part, "elm.swallow.end"))
+ {
+ bt = elm_button_add(obj);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_layout_text_set(bt, NULL, "OK");
+ }
+ else
+ {
+ bt = elm_icon_add(obj);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(bt, buf, NULL);
+ evas_object_size_hint_aspect_set(bt, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ }
+
+ return bt;
+}
+
+static void
+gl_del(void *data, Evas_Object *obj EINA_UNUSED)
+{
+ free(data);
+}
+
+static Elm_Gengrid_Item_Class *gic;
+
+Evas_Object *
+grid_access_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ char buf[PATH_MAX];
+ Evas_Object *ic;
+ const Item_Data *id = data;
+
+ if (!strcmp(part, "elm.swallow.icon"))
+ {
+ ic = elm_icon_add(obj);
+ elm_object_scale_set(ic, 0.5);
+ snprintf(buf, sizeof(buf), "%s/images/icon_%02i.png", elm_app_data_dir_get(), (id->index % 4));
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ evas_object_show(ic);
+ return ic;
+ }
+ return NULL;
+}
+
+Evas_Object *gl_access_content_full_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
+{
+ int i;
+ Evas_Object *grid;
+
+ if (strcmp(part, "elm.swallow.content")) return NULL;
+
+ grid = elm_gengrid_add(obj);
+ elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(100), ELM_SCALE_SIZE(100));
+ elm_gengrid_horizontal_set(grid, EINA_FALSE);
+ elm_gengrid_reorder_mode_set(grid, EINA_TRUE);
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ gic = elm_gengrid_item_class_new();
+ gic->item_style = "default";
+ gic->func.text_get = NULL;
+ gic->func.content_get = grid_access_content_get;
+ gic->func.state_get = NULL;
+ gic->func.del = gl_del;
+
+ for (i = 0; i < 4; i++)
+ {
+ Item_Data *id = calloc(1, sizeof(Item_Data));
+ id->index = i;
+
+ elm_gengrid_item_append(grid, gic, id, NULL, NULL);
+ }
+ elm_gengrid_item_class_free(gic);
+
+ evas_object_size_hint_min_set(grid,
+ ELM_SCALE_SIZE(300), ELM_SCALE_SIZE(150));
+ return grid;
+}
+
+static void _realized(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei)
+{
+ Evas_Object *content, *bt;
+ Eina_List *items;
+ items = NULL;
+
+ if (!ei) return;
+ Elm_Object_Item *item = ei;
+
+ const Elm_Genlist_Item_Class *itc = elm_genlist_item_item_class_get(item);
+
+ if (!strcmp(itc->item_style, "full"))
+ {
+ /* unregister item itself */
+ elm_object_item_access_unregister(item);
+
+ /* convey highlight to its content */
+ content = elm_object_item_part_content_get(item, "elm.swallow.content");
+ if (!content) return;
+
+ items = eina_list_append(items, content);
+ }
+ else
+ {
+ bt = elm_object_item_part_content_get(item, "elm.swallow.end");
+ if (!bt) return;
+
+ items = eina_list_append(items, bt);
+ }
+
+ elm_object_item_access_order_set(item, items);
+}
+
+void
+test_access(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ int i;
+ Evas_Object *win, *bx, *gl;
+
+ win = elm_win_util_standard_add("access", "Access");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, NULL);
+
+ elm_config_access_set(EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_homogeneous_set(bx, EINA_TRUE);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(gl);
+
+ evas_object_smart_callback_add(gl, "realized", _realized, NULL);
+
+ itc1 = elm_genlist_item_class_new();
+ itc1->item_style = "default";
+ itc1->func.text_get = gl_access_text_get;
+ itc1->func.content_get = gl_access_content_get;
+ itc1->func.state_get = NULL;
+ itc1->func.del = gl_del;
+
+ itc2 = elm_genlist_item_class_new();
+ itc2->item_style = "full";
+ itc2->func.text_get = NULL;
+ itc2->func.content_get = gl_access_content_full_get;
+ itc2->func.state_get = NULL;
+ itc2->func.del = gl_del;
+
+ for (i = 1; i < 10; i++)
+ {
+ Item_Data *id = calloc(1, sizeof(Item_Data));
+ id->index = i;
+
+ if (i % 4)
+ {
+ elm_genlist_item_append(
+ gl,
+ itc1,
+ id,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ NULL/* func */,
+ NULL/* func data */
+ );
+ }
+ else
+ {
+ elm_genlist_item_append(
+ gl,
+ itc2,
+ id,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ NULL/* func */,
+ NULL/* func data */
+ );
+ }
+ }
+
+ elm_genlist_item_class_free(itc1);
+ elm_genlist_item_class_free(itc2);
+ evas_object_resize(win, 500, 400);
+ evas_object_show(win);
+}
+
+void
+test_access2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ int i, j, k;
+ char buf[PATH_MAX];
+ Evas_Object *win, *bx, *sc, *ly, *ly2, *ic;
+ Evas_Object *ao, *to;
+
+ win = elm_win_util_standard_add("access", "Access");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, NULL);
+
+ elm_config_access_set(EINA_TRUE);
+
+ sc = elm_scroller_add(win);
+ elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE);
+ elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, sc);
+ evas_object_show(sc);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_homogeneous_set(bx, EINA_TRUE);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ elm_object_content_set(sc, bx);
+ evas_object_show(bx);
+
+ for (k = 0 ; k < 3; k++)
+ {
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "access_page");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(ly);
+
+ for (j = 0; j < 3; j++)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ ly2 = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly2, buf, "access_icon");
+ evas_object_size_hint_weight_set(ly2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ic = elm_icon_add(win);
+ elm_object_scale_set(ic, 0.5);
+ snprintf(buf, sizeof(buf), "%s/images/icon_%02i.png", elm_app_data_dir_get(), (i + (k * 3)));
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ elm_object_part_content_set(ly2, "slot", ic);
+ evas_object_show(ic);
+
+ snprintf(buf, sizeof(buf), "slot.%i.%i", i, j);
+ elm_object_part_content_set(ly, buf, ly2);
+ evas_object_show(ly2);
+
+ /* access */
+ to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly2), "access");
+ ao = elm_access_object_register(to, ly2);
+ elm_object_focus_custom_chain_append(ly2, ao, NULL);
+ }
+ }
+
+ elm_box_pack_end(bx, ly);
+ }
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
+
+static Eina_Bool
+_key_down_cb(void *data, int type EINA_UNUSED, void *ei)
+{
+ Elm_Access_Action_Info *a;
+ Ecore_Event_Key *ev = ei;
+
+ a = calloc(1, sizeof(Elm_Access_Action_Info));
+ if (!a) return ECORE_CALLBACK_PASS_ON;
+
+ if (ev && ev->key)
+ {
+ if (!strcmp(ev->key, "F1"))
+ {
+ a->highlight_cycle = EINA_TRUE;
+ elm_access_action(data, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, a);
+ }
+ }
+ free(a);
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static char *
+_access_info_cb(void *data, Evas_Object *obj EINA_UNUSED)
+{
+ if (data) return strdup(data);
+ return NULL;
+}
+
+void
+test_access3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ Evas_Object *win, *box, *lbl, *ly, *btn;
+ Evas_Object *red_ao, *green_ao, *blue_ao, *black_ao, *to;
+
+ win = elm_win_util_standard_add("access", "Access");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, NULL);
+
+ elm_config_access_set(EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ lbl = elm_label_add(box);
+ elm_object_text_set(lbl,
+ "Move a mouse pointer to any object and press F1 to "
+ "move access highlight to the next object.");
+ evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, lbl);
+ evas_object_show(lbl);
+
+ ly = elm_layout_add(box);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "access_color_page");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, ly);
+ evas_object_show(ly);
+
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "action");
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(btn);
+
+ elm_object_part_content_set(ly, "center", btn);
+
+ to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly), "red");
+ red_ao = elm_access_object_register(to, ly);
+ elm_access_info_cb_set(red_ao, ELM_ACCESS_INFO, _access_info_cb, "red");
+ elm_access_highlight_next_set(btn, ELM_HIGHLIGHT_DIR_NEXT, red_ao);
+
+ to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly), "green");
+ green_ao = elm_access_object_register(to, ly);
+ elm_access_info_cb_set(green_ao, ELM_ACCESS_INFO, _access_info_cb, "green");
+ elm_access_highlight_next_set(red_ao, ELM_HIGHLIGHT_DIR_NEXT, green_ao);
+
+ to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly), "blue");
+ blue_ao = elm_access_object_register(to, ly);
+ elm_access_info_cb_set(blue_ao, ELM_ACCESS_INFO, _access_info_cb, "blue");
+ elm_access_highlight_next_set(green_ao, ELM_HIGHLIGHT_DIR_NEXT, blue_ao);
+
+ to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly), "black");
+ black_ao = elm_access_object_register(to, ly);
+ elm_access_info_cb_set(black_ao, ELM_ACCESS_INFO, _access_info_cb, "black");
+ elm_access_highlight_next_set(blue_ao, ELM_HIGHLIGHT_DIR_NEXT, black_ao);
+
+ ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, win);
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_actionslider.c b/src/bin/elementary/test_actionslider.c
new file mode 100644
index 0000000000..62b99e67bd
--- /dev/null
+++ b/src/bin/elementary/test_actionslider.c
@@ -0,0 +1,209 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void _pos_selected_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Elm_Actionslider_Pos ipos, mpos, epos;
+
+ printf("Selection: %s\n", (char *)event_info);
+ printf("Label selected: %s\n", elm_actionslider_selected_label_get(obj));
+
+ ipos = elm_actionslider_indicator_pos_get(obj);
+
+ switch (ipos)
+ {
+ case ELM_ACTIONSLIDER_NONE:
+ printf("actionslider indicator pos: none!\n");
+ break;
+ case ELM_ACTIONSLIDER_LEFT:
+ printf("actionslider indicator pos: left!\n");
+ break;
+ case ELM_ACTIONSLIDER_CENTER:
+ printf("actionslider indicator pos: center!\n");
+ break;
+ case ELM_ACTIONSLIDER_RIGHT:
+ printf("actionslider indicator pos: right!\n");
+ break;
+ case ELM_ACTIONSLIDER_ALL:
+ printf("actionslider indicator pos: all!\n");
+ break;
+ }
+
+ mpos = elm_actionslider_magnet_pos_get(obj);
+
+ switch (mpos)
+ {
+ case ELM_ACTIONSLIDER_NONE:
+ printf("actionslider magnet pos: none!\n");
+ break;
+ case ELM_ACTIONSLIDER_LEFT:
+ printf("actionslider magnet pos: left!\n");
+ break;
+ case ELM_ACTIONSLIDER_CENTER:
+ printf("actionslider magnet pos: center!\n");
+ break;
+ case ELM_ACTIONSLIDER_RIGHT:
+ printf("actionslider magnet pos: right!\n");
+ break;
+ case ELM_ACTIONSLIDER_ALL:
+ printf("actionslider magnet pos: all!\n");
+ break;
+ }
+
+ epos = elm_actionslider_enabled_pos_get(obj);
+
+ if (epos)
+ {
+ printf("actionslider enabled pos: ");
+ if (epos & ELM_ACTIONSLIDER_LEFT)
+ printf("left ");
+ if (epos & ELM_ACTIONSLIDER_CENTER)
+ printf("center ");
+ if (epos & ELM_ACTIONSLIDER_RIGHT)
+ printf("right ");
+ printf("\n");
+ }
+}
+
+static void
+_position_change_magnetic_cb(void *data EINA_UNUSED, Evas_Object * obj, void *event_info)
+{
+ if (!strcmp((char *)event_info, "left"))
+ elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_LEFT);
+ else if (!strcmp((char *)event_info, "right"))
+ elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_RIGHT);
+}
+
+static void
+_magnet_enable_disable_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ if (!strcmp((char *)event_info, "left"))
+ elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_CENTER);
+ else if (!strcmp((char *)event_info, "right"))
+ elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_NONE);
+}
+
+void
+test_actionslider(void *data EINA_UNUSED, Evas_Object * obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *as;
+
+ win = elm_win_util_standard_add("actionslider", "Actionslider");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ as = elm_actionslider_add(win);
+ evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0);
+ elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_RIGHT);
+ elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_RIGHT);
+ elm_object_part_text_set(as, "left", "Snooze");
+ elm_object_part_text_set(as, "center", NULL);
+ elm_object_part_text_set(as, "right", "Stop");
+ elm_actionslider_enabled_pos_set(as, ELM_ACTIONSLIDER_LEFT |
+ ELM_ACTIONSLIDER_RIGHT);
+ evas_object_smart_callback_add(as, "pos_changed",
+ _position_change_magnetic_cb, NULL);
+ evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL);
+ evas_object_show(as);
+ elm_box_pack_end(bx, as);
+
+ as = elm_actionslider_add(win);
+ evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0);
+ elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_CENTER);
+ elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_CENTER);
+ elm_object_part_text_set(as, "left", "Snooze");
+ elm_object_part_text_set(as, "center", NULL);
+ elm_object_part_text_set(as, "right", "Stop");
+ elm_actionslider_enabled_pos_set(as, ELM_ACTIONSLIDER_LEFT |
+ ELM_ACTIONSLIDER_RIGHT);
+ evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL);
+ evas_object_show(as);
+ elm_box_pack_end(bx, as);
+
+ as = elm_actionslider_add(win);
+ elm_object_style_set(as, "bar");
+ evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0);
+ elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT);
+ elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_CENTER|
+ ELM_ACTIONSLIDER_RIGHT);
+ elm_actionslider_enabled_pos_set(as, ELM_ACTIONSLIDER_CENTER |
+ ELM_ACTIONSLIDER_RIGHT);
+ elm_object_part_text_set(as, "left", NULL);
+ elm_object_part_text_set(as, "center", "Accept");
+ elm_object_part_text_set(as, "right", "Reject");
+ evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL);
+ evas_object_show(as);
+ elm_box_pack_end(bx, as);
+
+ as = elm_actionslider_add(win);
+ elm_object_style_set(as, "bar");
+ evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0);
+ elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT);
+ elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_LEFT);
+ elm_object_part_text_set(as, "left", NULL);
+ elm_object_part_text_set(as, "center", "Accept");
+ elm_object_part_text_set(as, "right", "Reject");
+ elm_object_text_set(as, "Go");
+ evas_object_smart_callback_add(as, "pos_changed",
+ _position_change_magnetic_cb, NULL);
+ evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL);
+ evas_object_show(as);
+ elm_box_pack_end(bx, as);
+
+ as = elm_actionslider_add(win);
+ elm_object_style_set(as, "bar");
+ elm_object_disabled_set(as, EINA_TRUE);
+ evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0);
+ elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT);
+ elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_LEFT);
+ elm_object_part_text_set(as, "left", NULL);
+ elm_object_part_text_set(as, "center", "Accept");
+ elm_object_part_text_set(as, "right", "Reject");
+ elm_object_text_set(as, "Go");
+ evas_object_smart_callback_add(as, "pos_changed",
+ _position_change_magnetic_cb, NULL);
+ evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL);
+ evas_object_show(as);
+ elm_box_pack_end(bx, as);
+
+ as = elm_actionslider_add(win);
+ evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0);
+ elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT);
+ elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_ALL);
+ elm_object_part_text_set(as, "left", "Left");
+ elm_object_part_text_set(as, "center", "Center");
+ elm_object_part_text_set(as, "right", "Right");
+ elm_object_text_set(as, "Go");
+ evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL);
+ evas_object_show(as);
+ elm_box_pack_end(bx, as);
+
+ as = elm_actionslider_add(win);
+ evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0);
+ elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_CENTER);
+ elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_CENTER);
+ elm_object_part_text_set(as, "left", "Enable");
+ elm_object_part_text_set(as, "center", "Magnet");
+ elm_object_part_text_set(as, "right", "Disable");
+ evas_object_smart_callback_add(as, "pos_changed",
+ _magnet_enable_disable_cb, NULL);
+ evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL);
+ evas_object_show(as);
+ elm_box_pack_end(bx, as);
+
+ evas_object_resize(win, 320, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_anim.c b/src/bin/elementary/test_anim.c
new file mode 100644
index 0000000000..24125bcffa
--- /dev/null
+++ b/src/bin/elementary/test_anim.c
@@ -0,0 +1,97 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static const char *names[] =
+{
+ "bub1", "sh1",
+ "bub2", "sh2",
+ "bub3", "sh3",
+};
+
+static Eina_Bool
+_anim_tick(void *data EINA_UNUSED, const Eo_Event *event)
+{
+ Evas_Object *bub, *sh;
+ Evas_Coord x, y, w, h, vw, vh;
+ double t, xx, yy, zz, r, fac;
+ double lx, ly;
+ unsigned int i;
+
+ evas_output_viewport_get(evas_object_evas_get(event->obj), 0, 0, &vw, &vh);
+ r = 48;
+ t = ecore_loop_time_get();
+ fac = 2.0 / (double)((sizeof(names) / sizeof(char *) / 2));
+ evas_pointer_canvas_xy_get(evas_object_evas_get(event->obj), &x, &y);
+ lx = x;
+ ly = y;
+
+ for (i = 0; i < (sizeof(names) / sizeof(char *) / 2); i++)
+ {
+ bub = evas_object_data_get(event->obj, names[i * 2]);
+ sh = evas_object_data_get(event->obj, names[(i * 2) + 1]);
+ zz = (((2 + sin(t * 6 + (M_PI * (i * fac)))) / 3) * 64) * 2;
+ xx = (cos(t * 4 + (M_PI * (i * fac))) * r) * 2;
+ yy = (sin(t * 6 + (M_PI * (i * fac))) * r) * 2;
+
+ w = zz;
+ h = zz;
+ x = (vw / 2) + xx - (w / 2);
+ y = (vh / 2) + yy - (h / 2);
+
+ evas_object_move(bub, x, y);
+ evas_object_resize(bub, w, h);
+
+ x = x - ((lx - (x + (w / 2))) / 4);
+ y = y - ((ly - (y + (h / 2))) / 4);
+
+ evas_object_move(sh, x, y);
+ evas_object_resize(sh, w, h);
+ }
+ return ECORE_CALLBACK_RENEW;
+}
+
+void
+test_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *bub, *sh;
+ char buf[PATH_MAX];
+ unsigned int i;
+
+ win = elm_win_add(NULL, "animation", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Animation");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ snprintf(buf, sizeof(buf), "%s/images/bubble_sh.png", elm_app_data_dir_get());
+ for (i = 0; i < (sizeof(names) / sizeof(char *) / 2); i++)
+ {
+ sh = evas_object_image_filled_add(evas_object_evas_get(win));
+ evas_object_image_file_set(sh, buf, NULL);
+ evas_object_resize(sh, 64, 64);
+ evas_object_show(sh);
+ evas_object_data_set(win, names[(i * 2) + 1], sh);
+ }
+
+ snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
+ for (i = 0; i < (sizeof(names) / sizeof(char *) / 2); i++)
+ {
+ bub = evas_object_image_filled_add(evas_object_evas_get(win));
+ evas_object_image_file_set(bub, buf, NULL);
+ evas_object_resize(bub, 64, 64);
+ evas_object_show(bub);
+ evas_object_data_set(win, names[(i * 2)], bub);
+ }
+
+ evas_object_resize(win, 480, 800);
+ evas_object_show(win);
+
+ eo_event_callback_add(win, EFL_ANIMATOR_EVENT_ANIMATOR_TICK, _anim_tick, NULL);
+}
diff --git a/src/bin/elementary/test_application_server.c b/src/bin/elementary/test_application_server.c
new file mode 100644
index 0000000000..d05d74e3ea
--- /dev/null
+++ b/src/bin/elementary/test_application_server.c
@@ -0,0 +1,206 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct {
+ Evas_Object *win, *label;
+ Eina_Stringshare *view_name;
+} App_View_Context;
+
+static Elm_App_Server *phone_server = NULL, *msg_server = NULL;
+
+static void _text_update(App_View_Context *ctx, const char *state)
+{
+ char buffer[1024];
+
+ if (!ctx->label)
+ return;
+ snprintf(buffer, sizeof(buffer), "%s - state=%s", ctx->view_name, state);
+ elm_object_text_set(ctx->label, buffer);
+}
+
+static void
+_window_create(App_View_Context *ctx)
+{
+ ctx->win = elm_win_util_standard_add("app_view", ctx->view_name);
+
+ ctx->label = elm_label_add(ctx->win);
+ evas_object_size_hint_weight_set(ctx->label, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_data_set(ctx->win, "label", ctx->label);
+
+ _text_update(ctx, "alive");
+
+ elm_win_resize_object_add(ctx->win, ctx->label);
+ evas_object_show(ctx->label);
+
+ evas_object_resize(ctx->win, 400, 300);
+ evas_object_show(ctx->win);
+}
+
+static Eina_Bool
+_close_cb(void *data, const Eo_Event *event)
+{
+ App_View_Context *ctx = data;
+ if (ctx->win)
+ evas_object_del(ctx->win);
+ eo_del(event->obj);
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_pause_cb(void *data, const Eo_Event *event EINA_UNUSED)
+{
+ App_View_Context *ctx = data;
+ _text_update(ctx, "paused");
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_resume_cb(void *data, const Eo_Event *event)
+{
+ App_View_Context *ctx = data;
+
+ //shallow state
+ if (!ctx->win)
+ {
+ _window_create(ctx);
+ elm_app_server_view_window_set(event->obj, ctx->win);
+ }
+
+ _text_update(ctx, "alive");
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_view_del_cb(void *data, const Eo_Event *event)
+{
+ App_View_Context *ctx = data;
+
+ if (ctx->win)
+ evas_object_del(ctx->win);
+ elm_app_server_view_window_set(event->obj, NULL);
+ eina_stringshare_del(ctx->view_name);
+ free(ctx);
+ return EINA_TRUE;
+}
+
+static Elm_App_Server_View *
+_create_view_cb(Elm_App_Server *app_server, const Eina_Value *args EINA_UNUSED, Eina_Stringshare **error_name, Eina_Stringshare **error_message EINA_UNUSED)
+{
+ Elm_App_Server_View *view;
+ const char *id = NULL, *pkg = NULL;
+ App_View_Context *ctx;
+
+ ctx = calloc(1, sizeof(App_View_Context));
+ if (!ctx)
+ {
+ *error_name = eina_stringshare_add("No memory available");
+ return NULL;
+ }
+
+ view = eo_add(ELM_APP_SERVER_VIEW_CLASS, app_server, elm_app_server_view_id_set(eo_self, NULL));
+
+ id = elm_app_server_view_id_get(view);
+ pkg = elm_app_server_package_get(app_server);
+ ctx->view_name = eina_stringshare_printf("%s %s", pkg, id);
+
+ _window_create(ctx);
+
+ elm_app_server_view_title_set(view, ctx->view_name);
+ elm_app_server_view_new_events_set(view, 5);
+ elm_app_server_view_window_set(view, ctx->win);
+ elm_app_server_view_resume(view);
+ eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_CLOSED, _close_cb, ctx);
+ eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_PAUSED, _pause_cb, ctx);
+ eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_RESUMED, _resume_cb, ctx);
+ eo_event_callback_add(view, EO_BASE_EVENT_DEL, _view_del_cb, ctx);
+
+ return view;
+}
+
+static Eina_Bool
+_terminate_cb(void *data EINA_UNUSED, const Eo_Event *event)
+{
+ const char *title = NULL;
+
+ printf("terminate cb\n");
+ elm_app_server_save(event->obj);
+ title = elm_app_server_title_get(event->obj);
+
+ printf("Closing: %s\n", title);
+ eo_unref(event->obj);
+ return EINA_TRUE;
+}
+
+Elm_App_Server *
+test_application_server_common(const char *pkg)
+{
+ Eina_Iterator *views_iter = NULL;
+ Elm_App_Server_View *view;
+ Elm_App_Server *server;
+
+ server = eo_add(ELM_APP_SERVER_CLASS, NULL, elm_app_server_constructor(eo_self, pkg, _create_view_cb));
+ elm_app_server_title_set(server, pkg);
+ views_iter = elm_app_server_views_get(server);
+ eo_event_callback_add(server, ELM_APP_SERVER_EVENT_TERMINATE, _terminate_cb, NULL);
+
+ //views create in shallow state
+ EINA_ITERATOR_FOREACH(views_iter, view)
+ {
+ App_View_Context *ctx;
+ const char *id = NULL;
+
+ ctx = calloc(1, sizeof(App_View_Context));
+
+ id = elm_app_server_view_id_get(view);
+ ctx->view_name = eina_stringshare_printf("%s %s", pkg, id);
+
+ eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_CLOSED, _close_cb, ctx);
+ eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_PAUSED, _pause_cb, ctx);
+ eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_RESUMED, _resume_cb, ctx);
+ eo_event_callback_add(view, EO_BASE_EVENT_DEL, _view_del_cb, ctx);
+ }
+ eina_iterator_free(views_iter);
+
+ return server;
+}
+
+static Eina_Bool
+_server_del_cb(void *data, const Eo_Event *event EINA_UNUSED)
+{
+ Elm_App_Server **server = data;
+ *server = NULL;
+ return EINA_TRUE;
+}
+
+void
+test_application_server_phone(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ if (phone_server)
+ {
+ printf("Phone already running\n");
+ return;
+ }
+ printf("Starting phone\n");
+ phone_server = test_application_server_common("org.enlightenment.phone");
+ eo_event_callback_add(phone_server, EO_BASE_EVENT_DEL, _server_del_cb, &phone_server);
+}
+
+void
+test_application_server_message(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ if (msg_server)
+ {
+ printf("Message already running\n");
+ return;
+ }
+ printf("Starting message\n");
+ msg_server = test_application_server_common( "org.enlightenment.message");
+ eo_event_callback_add(msg_server, EO_BASE_EVENT_DEL, _server_del_cb, &msg_server);
+}
diff --git a/src/bin/elementary/test_bg.c b/src/bin/elementary/test_bg.c
new file mode 100644
index 0000000000..995ae12971
--- /dev/null
+++ b/src/bin/elementary/test_bg.c
@@ -0,0 +1,270 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_cb_size_radio_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
+{
+ Evas_Object *o_bg = data;
+ int size;
+ size = elm_radio_value_get((Evas_Object *)obj);
+ elm_bg_load_size_set(o_bg, size, size);
+}
+
+static void
+_cb_radio_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
+{
+ Evas_Object *o_bg = data;
+
+ elm_bg_option_set(o_bg, elm_radio_value_get((Evas_Object *)obj));
+}
+
+static void
+_cb_overlay_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
+{
+ Evas_Object *o_bg = data;
+
+ if (elm_check_state_get(obj))
+ {
+ Evas_Object *parent, *over;
+ char buff[PATH_MAX];
+
+ snprintf(buff, sizeof(buff), "%s/objects/test.edj", elm_app_data_dir_get());
+ parent = elm_object_parent_widget_get(o_bg);
+ over = edje_object_add(evas_object_evas_get(parent));
+ edje_object_file_set(over, buff, "bg_overlay");
+ elm_object_part_content_set(o_bg, "overlay", over);
+ }
+ else
+ elm_object_part_content_set(o_bg, "overlay", NULL);
+}
+
+static void
+_cb_color_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
+{
+ Evas_Object *o_bg = data;
+ double val = 0.0;
+
+ val = elm_spinner_value_get(obj);
+ if (val == 1.0)
+ elm_bg_color_set(o_bg, 255, 255, 255);
+ else if (val == 2.0)
+ elm_bg_color_set(o_bg, 255, 0, 0);
+ else if (val == 3.0)
+ elm_bg_color_set(o_bg, 0, 0, 255);
+ else if (val == 4.0)
+ elm_bg_color_set(o_bg, 0, 255, 0);
+}
+
+void
+test_bg_plain(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg;
+
+ win = elm_win_add(NULL, "bg-plain", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Bg Plain");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ /* allow bg to expand in x & y */
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ /* set size hints. a minimum size for the bg. this should propagate back
+ * to the window thus limiting its size based off the bg as the bg is one
+ * of the window's resize objects. */
+ evas_object_size_hint_min_set(bg, 160, 160);
+ /* and set a maximum size. not needed very often. normally used together
+ * with evas_object_size_hint_min_set() at the same size to make a
+ * window not resizable */
+ evas_object_size_hint_max_set(bg, 640, 640);
+ /* and now just resize the window to a size you want. normally widgets
+ * will determine the initial size though */
+ evas_object_resize(win, 320, 320);
+ /* and show the window */
+ evas_object_show(win);
+}
+
+void
+test_bg_image(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg;
+ Evas_Object *box, *hbox, *o_bg;
+ Evas_Object *rd, *rdg;
+ char buf[PATH_MAX];
+
+ win = elm_win_add(NULL, "bg-image", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Bg Image");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ o_bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(o_bg, buf, NULL);
+ evas_object_size_hint_weight_set(o_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(o_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, o_bg);
+
+ hbox = elm_box_add(win);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, 50);
+ elm_object_text_set(rd, "50 x 50");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, o_bg);
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ rdg = rd;
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, 100);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "100 x 100");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, o_bg);
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, 200);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "200 x 200");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, o_bg);
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+
+ elm_radio_value_set(rdg, 200);
+
+ elm_box_pack_end(box, hbox);
+ evas_object_show(hbox);
+
+ evas_object_show(o_bg);
+ evas_object_size_hint_min_set(bg, 160, 160);
+ evas_object_size_hint_max_set(bg, 640, 640);
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+void
+test_bg_options(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg;
+ Evas_Object *box, *hbox, *o_bg;
+ Evas_Object *rd, *rdg;
+ char buf[PATH_MAX];
+
+ win = elm_win_add(NULL, "bg-options", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Bg Options");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ o_bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(o_bg, buf, NULL);
+ evas_object_size_hint_weight_set(o_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(o_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, o_bg);
+ evas_object_show(o_bg);
+
+ hbox = elm_box_add(win);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, ELM_BG_OPTION_CENTER);
+ elm_object_text_set(rd, "Center");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg);
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ rdg = rd;
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, ELM_BG_OPTION_SCALE);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "Scale");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg);
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, ELM_BG_OPTION_STRETCH);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "Stretch");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg);
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, ELM_BG_OPTION_TILE);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "Tile");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg);
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+
+ elm_radio_value_set(rdg, ELM_BG_OPTION_SCALE);
+
+ rd = elm_check_add(win);
+ elm_object_text_set(rd, "Show Overlay");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_overlay_changed, o_bg);
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+
+ /* color choices ... this is ghetto, but we don't have a 'colorpicker'
+ * widget yet :( */
+ rd = elm_spinner_add(win);
+ elm_object_tooltip_text_set(rd, "The background's part being affected<br/>"
+ "here may be seen only if you enlarge<br/>"
+ "the window and mark the 'Center' radio.");
+ elm_object_style_set(rd, "vertical");
+ elm_spinner_min_max_set(rd, 1, 4);
+ elm_spinner_label_format_set(rd, "%.0f");
+ elm_spinner_editable_set(rd, EINA_FALSE);
+ elm_spinner_special_value_add(rd, 1, "White");
+ elm_spinner_special_value_add(rd, 2, "Red");
+ elm_spinner_special_value_add(rd, 3, "Blue");
+ elm_spinner_special_value_add(rd, 4, "Green");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_color_changed, o_bg);
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+
+ elm_box_pack_end(box, hbox);
+ evas_object_show(hbox);
+
+ evas_object_size_hint_min_set(bg, 160, 160);
+ evas_object_size_hint_max_set(bg, 640, 640);
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_box.c b/src/bin/elementary/test_box.c
new file mode 100644
index 0000000000..6da21d63c4
--- /dev/null
+++ b/src/bin/elementary/test_box.c
@@ -0,0 +1,882 @@
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define ICON_MAX 24
+
+typedef enum
+{
+ BOX_PACK_POSITION_START,
+ BOX_PACK_POSITION_BEFORE,
+ BOX_PACK_POSITION_AFTER,
+ BOX_PACK_POSITION_END
+} Box_Pack_Position;
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ void *box; /* Use this to get box content */
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ BOX_PACK_START,
+ BOX_PACK_BEFORE,
+ BOX_PACK_AFTER,
+ BOX_PADDING_SET,
+ BOX_ALIGN_SET,
+ BOX_HOMOGENEOUS_SET,
+ BOX_UNPACK_ALL,
+ BOX_CLEAR,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+ const Eina_List *items = elm_box_children_get(api->box);
+ if (!eina_list_count(items))
+ return;
+
+ /* use elm_box_children_get() to get list of children */
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case BOX_PACK_START: /* Move last item to beginning */
+ elm_box_unpack(api->box, eina_list_data_get(eina_list_last(items)));
+ elm_box_pack_start(api->box, eina_list_data_get(eina_list_last(items)));
+ break;
+
+ case BOX_PACK_BEFORE:
+ if (eina_list_count(items) > 1)
+ { /* Put last item before the one preceding it */
+ elm_box_unpack(api->box, eina_list_data_get(eina_list_last(items)));
+ elm_box_pack_before(api->box,
+ eina_list_data_get(eina_list_last(items)),
+ eina_list_nth(items, eina_list_count(items)-2));
+ }
+ break;
+
+ case BOX_PACK_AFTER:
+ if (eina_list_count(items) > 1)
+ { /* Put item before last to last */
+ elm_box_unpack(api->box, eina_list_nth(items,
+ eina_list_count(items)-2));
+ elm_box_pack_after(api->box,
+ eina_list_nth(items, eina_list_count(items)-2),
+ eina_list_data_get(eina_list_last(items)));
+ }
+ break;
+
+ case BOX_PADDING_SET:
+ elm_box_padding_set(api->box, 30, 15);
+ break;
+
+ case BOX_ALIGN_SET:
+ elm_box_align_set(api->box, 0.25, 0.75);
+ break;
+
+ case BOX_HOMOGENEOUS_SET:
+ elm_box_homogeneous_set(api->box, EINA_TRUE);
+ break;
+
+ case BOX_UNPACK_ALL:
+ {
+ Eina_List *l;
+ Evas_Object *data;
+ elm_box_unpack_all(api->box);
+ EINA_LIST_REVERSE_FOREACH(items, l, data)
+ elm_box_pack_end(api->box, data);
+ }
+ break;
+
+ case BOX_CLEAR:
+ elm_box_clear(api->box);
+ break;
+
+ case API_STATE_LAST:
+
+ break;
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_box_vert(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *ic, *bxx, *bt;
+ char buf[PATH_MAX];
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("box-vert", "Box Vert");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bx = elm_box_add(win);
+ api->box = bx;
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, bx);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/icon_01.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/icon_02.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.0, 0.5);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/icon_03.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, EVAS_HINT_EXPAND, 0.5);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ evas_object_show(win);
+}
+
+static void
+_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_box_unpack(data, obj);
+ evas_object_move(obj, 0, 0);
+ evas_object_color_set(obj, 128, 64, 0, 128);
+ evas_object_del(obj);
+}
+
+void
+test_box_vert2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt;
+
+ win = elm_win_util_standard_add("box-vert2", "Box Vert 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ elm_box_padding_set(bx, 10, 10);
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_smart_callback_add(bt, "clicked", _del_cb, bx);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_smart_callback_add(bt, "clicked", _del_cb, bx);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 3");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_smart_callback_add(bt, "clicked", _del_cb, bx);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 4");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_smart_callback_add(bt, "clicked", _del_cb, bx);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 5");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_smart_callback_add(bt, "clicked", _del_cb, bx);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
+
+void
+test_box_horiz(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *ic, *bxx, *bt;
+ char buf[PATH_MAX];
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("box-horiz", "Box Horiz");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bx = elm_box_add(win);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->box = bx;
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, bx);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/icon_01.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/icon_02.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.0);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/icon_03.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.0, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ evas_object_show(win);
+}
+
+static Eina_Bool radio_index[ICON_MAX];
+
+static int
+_index_get(void)
+{
+ int i;
+ for (i = 0; i < ICON_MAX; i++)
+ {
+ if (!radio_index[i])
+ {
+ radio_index[i] = EINA_TRUE;
+ return i;
+ }
+
+ }
+ return -1;
+}
+
+static void
+_index_remove(int i)
+{
+ if (i >= ICON_MAX) return;
+ radio_index[i] = EINA_FALSE;
+}
+
+static void
+_index_clear()
+{
+ int i;
+ for (i = 0; i < ICON_MAX; i++)
+ radio_index[i] = EINA_FALSE;
+}
+
+static Evas_Object *
+_radio_new(Evas_Object *obj)
+{
+ Evas_Object *ic, *rd;
+ int idx;
+ char buf[PATH_MAX];
+ Evas_Object *rdg;
+
+ idx = _index_get();
+ if (idx == -1) return NULL;
+
+ ic = elm_icon_add(obj);
+ snprintf(buf, sizeof(buf), "%s/images/icon_%02d.png",
+ elm_app_data_dir_get(), idx);
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ rd = elm_radio_add(obj);
+ elm_radio_state_value_set(rd, idx);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5);
+ elm_object_part_content_set(rd, "icon", ic);
+
+ rdg = evas_object_data_get(obj, "radio-group");
+ if (rdg) elm_radio_group_add(rd, rdg);
+
+ evas_object_show(rd);
+ evas_object_show(ic);
+
+ return rd;
+}
+
+static void
+_pack_start_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *rd;
+ if (!data) return;
+
+ rd = _radio_new(data);
+ if (!rd) return;
+ elm_box_pack_start(data, rd);
+}
+
+static void
+_pack_before_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *rd, *selected_rd, *rdg;
+ if (!data) return;
+
+ rdg = evas_object_data_get(data, "radio-group");
+ if (!rdg) return;
+
+ selected_rd = elm_radio_selected_object_get(rdg);
+ if (!selected_rd || (selected_rd == rdg)) return;
+
+ rd = _radio_new(data);
+ if (!rd) return;
+ elm_box_pack_before(data, rd, selected_rd);
+}
+
+static void
+_pack_after_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *rd, *selected_rd, *rdg;
+ if (!data) return;
+
+ rdg = evas_object_data_get(data, "radio-group");
+ if (!rdg) return;
+
+ selected_rd = elm_radio_selected_object_get(rdg);
+ if (!selected_rd || (selected_rd == rdg)) return;
+
+ rd = _radio_new(data);
+ if (!rd) return;
+ elm_box_pack_after(data, rd, selected_rd);
+}
+
+static void
+_pack_end_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *rd;
+ if (!data) return;
+
+ rd = _radio_new(data);
+ if (!rd) return;
+ elm_box_pack_end(data, rd);
+}
+
+static void
+_unpack_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *rdg, *selected_rd;
+ if (!data) return;
+
+ rdg = evas_object_data_get(data, "radio-group");
+ if (!rdg) return;
+
+ selected_rd = elm_radio_selected_object_get(rdg);
+ if (selected_rd == rdg) return;
+
+ _index_remove(elm_radio_value_get(selected_rd));
+ elm_box_unpack(data, selected_rd);
+ evas_object_del(selected_rd);
+ elm_radio_value_set(rdg, -1);
+}
+
+static void
+_unpack_all_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *radio, *rdg;
+ Eina_List *rl, *l;
+ if (!data) return;
+
+ rdg = evas_object_data_get(data, "radio-group");
+ if (!rdg) return;
+
+ _index_clear();
+ rl = elm_box_children_get(data);
+ EINA_LIST_FOREACH(rl, l, radio)
+ {
+ if (radio != rdg)
+ evas_object_del(radio);
+ }
+ elm_box_unpack_all(data);
+ elm_radio_value_set(rdg, -1);
+}
+
+void
+test_box_pack(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *sc, *bt;
+ Evas_Object *box, *lbox, *rbox;
+ Evas_Object *rd, *rdg = NULL;
+ int i;
+
+ win = elm_win_util_standard_add("box-pack", "Box Pack");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ // left side
+ lbox = elm_box_add(win);
+ evas_object_size_hint_weight_set(lbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ sc = elm_scroller_add(win);
+ elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ rdg = elm_radio_add(win); /* a radio for easy group handling */
+ elm_radio_state_value_set(rdg, -1);
+ evas_object_data_set(lbox, "radio-group", rdg);
+
+ for (i = 0; i < 3; i++)
+ {
+ rd = _radio_new(lbox);
+ elm_box_pack_end(lbox, rd);
+ }
+
+ elm_object_content_set(sc, lbox);
+ evas_object_show(lbox);
+ elm_box_pack_end(box, sc);
+ evas_object_show(sc);
+
+ // right side
+ rbox = elm_box_add(win);
+ evas_object_size_hint_weight_set(rbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(rbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(rbox);
+ elm_box_pack_end(box, rbox);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pack Start");
+ evas_object_show(bt);
+ elm_box_pack_end(rbox, bt);
+ evas_object_smart_callback_add(bt, "clicked", _pack_start_btn_cb, lbox);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pack Before");
+ evas_object_show(bt);
+ elm_box_pack_end(rbox, bt);
+ evas_object_smart_callback_add(bt, "clicked", _pack_before_btn_cb, lbox);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pack After");
+ evas_object_show(bt);
+ elm_box_pack_end(rbox, bt);
+ evas_object_smart_callback_add(bt, "clicked", _pack_after_btn_cb, lbox);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pack End");
+ evas_object_show(bt);
+ elm_box_pack_end(rbox, bt);
+ evas_object_smart_callback_add(bt, "clicked", _pack_end_btn_cb, lbox);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Unpack");
+ evas_object_show(bt);
+ elm_box_pack_end(rbox, bt);
+ evas_object_smart_callback_add(bt, "clicked", _unpack_btn_cb, lbox);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Unpack All");
+ evas_object_show(bt);
+ elm_box_pack_end(rbox, bt);
+ evas_object_smart_callback_add(bt, "clicked", _unpack_all_btn_cb, lbox);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+static void
+_cb_check_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
+{
+ Eina_Bool homo;
+ Evas_Object *box = data;
+
+ homo = elm_check_state_get(obj);
+ elm_box_homogeneous_set(box, homo);
+}
+
+void
+test_box_homo(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win;
+ Evas_Object *box, *o_bg;
+ Evas_Object *rd;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("box-homogeneous", "Box Homogeneous");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ o_bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/twofish.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(o_bg, buf, NULL);
+ evas_object_size_hint_weight_set(o_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(o_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, o_bg);
+
+ rd = elm_check_add(win);
+ elm_object_text_set(rd, "Homogeneous");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_check_changed, box);
+ elm_box_pack_end(box, rd);
+ evas_object_show(rd);
+ evas_object_show(o_bg);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+typedef struct
+{
+ Eina_List *transitions;
+ Evas_Object *box;
+ Evas_Object_Box_Layout last_layout;
+} Transitions_Data;
+
+static void
+_test_box_transition_change(void *data)
+{
+ Transitions_Data *tdata = data;
+ Elm_Box_Transition *layout_data;
+ Evas_Object_Box_Layout next_layout;
+
+ if (!data) return;
+ next_layout = eina_list_data_get(tdata->transitions);
+ layout_data = elm_box_transition_new(2.0, tdata->last_layout,
+ NULL, NULL, next_layout, NULL, NULL,
+ _test_box_transition_change, tdata);
+ elm_box_layout_set(tdata->box, elm_box_layout_transition, layout_data, elm_box_transition_free);
+ tdata->last_layout = next_layout;
+
+ tdata->transitions = eina_list_demote_list(tdata->transitions, tdata->transitions);
+}
+
+static void
+_win_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Transitions_Data *tdata = data;
+ if (!data) return;
+ free(tdata);
+}
+
+void
+test_box_transition(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt;
+ Transitions_Data *tdata;
+
+ win = elm_win_util_standard_add("box-transition", "Box Transition");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _del_cb, bx);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _del_cb, bx);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 3");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _del_cb, bx);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ tdata = calloc(1, sizeof(Transitions_Data));
+ tdata->box = bx;
+ tdata->last_layout = evas_object_box_layout_horizontal;
+ tdata->transitions = eina_list_append(tdata->transitions,
+ evas_object_box_layout_vertical);
+ tdata->transitions = eina_list_append(tdata->transitions,
+ evas_object_box_layout_horizontal);
+ tdata->transitions = eina_list_append(tdata->transitions,
+ evas_object_box_layout_stack);
+ tdata->transitions = eina_list_append(tdata->transitions,
+ evas_object_box_layout_homogeneous_vertical);
+ tdata->transitions = eina_list_append(tdata->transitions,
+ evas_object_box_layout_homogeneous_horizontal);
+ tdata->transitions = eina_list_append(tdata->transitions,
+ evas_object_box_layout_flow_vertical);
+ tdata->transitions = eina_list_append(tdata->transitions,
+ evas_object_box_layout_flow_horizontal);
+ tdata->transitions = eina_list_append(tdata->transitions,
+ evas_object_box_layout_stack);
+
+ evas_object_smart_callback_add(win, "delete,request", _win_del, tdata);
+ elm_box_layout_set(bx, evas_object_box_layout_horizontal, NULL, NULL);
+ _test_box_transition_change(tdata);
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
+
+typedef struct _Box_Align_Data Box_Align_Data;
+struct _Box_Align_Data
+{
+ Evas_Object *hor_box; // target box horizontal
+ Evas_Object *vert_box; // target box vertical
+ double hor; // horizontal slider
+ double vert; // vertical slider
+};
+
+static void
+_box_align_win_del_cb(void *data, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+static void
+_hor_slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Box_Align_Data *bdata = data;
+
+ bdata->hor = elm_slider_value_get(obj);
+ printf("box align: %0.2f %0.2f\n", bdata->hor, bdata->vert);
+ elm_box_align_set(bdata->hor_box, bdata->hor, bdata->vert);
+ elm_box_align_set(bdata->vert_box, bdata->hor, bdata->vert);
+}
+
+static void
+_vert_slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Box_Align_Data *bdata = data;
+
+ bdata->vert = elm_slider_value_get(obj);
+ printf("box align: %0.2f %0.2f\n", bdata->hor, bdata->vert);
+ elm_box_align_set(bdata->hor_box, bdata->hor, bdata->vert);
+ elm_box_align_set(bdata->vert_box, bdata->hor, bdata->vert);
+}
+
+void
+_description_add(Evas_Object *bx_out, Box_Align_Data *bdata)
+{
+ Evas_Object *fr, *bx, *lb, *sl, *tb;
+
+ // description
+ fr = elm_frame_add(bx_out);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_out, fr);
+ elm_object_text_set(fr, "Description");
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ lb = elm_label_add(fr);
+ elm_object_text_set(lb, "This test shows how elm_box_align_set() works.");
+ evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ tb = elm_table_add(bx);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ lb = elm_label_add(tb);
+ elm_object_text_set(lb, " Horizontal ");
+ elm_table_pack(tb, lb, 0, 0, 1, 1);
+ evas_object_show(lb);
+
+ lb = elm_label_add(tb);
+ elm_object_text_set(lb, " Vertical ");
+ elm_table_pack(tb, lb, 0, 1, 1, 1);
+ evas_object_show(lb);
+
+ sl = elm_slider_add(fr);
+ elm_slider_unit_format_set(sl, "%1.2f");
+ elm_slider_min_max_set(sl, 0.0, 1.0);
+ elm_slider_value_set(sl, 0.5);
+ bdata->hor = 0.5;
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, sl, 1, 0, 1, 1);
+ evas_object_show(sl);
+ evas_object_smart_callback_add(sl, "changed", _hor_slider_changed_cb, bdata);
+
+ sl = elm_slider_add(fr);
+ elm_slider_unit_format_set(sl, "%1.2f");
+ elm_slider_min_max_set(sl, 0.0, 1.0);
+ elm_slider_value_set(sl, 0.5);
+ bdata->vert = 0.5;
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, sl, 1, 1, 1, 1);
+ evas_object_show(sl);
+ evas_object_smart_callback_add(sl, "changed", _vert_slider_changed_cb, bdata);
+}
+
+void
+_align_box_add(Evas_Object *bx_out, Box_Align_Data *bdata)
+{
+ Evas_Object *bx, *sp, *bt;
+
+ // test box - vertical
+ bdata->vert_box = bx = elm_box_add(bx_out);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_out, bx);
+ elm_box_align_set(bx, 0.5, 0.5);
+ evas_object_show(bx);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ // separator
+ sp = elm_separator_add(bx_out);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ elm_box_pack_end(bx_out, sp);
+ evas_object_show(sp);
+
+ // test box - horizontal
+ bdata->hor_box = bx = elm_box_add(bx_out);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_out, bx);
+ elm_box_align_set(bx, 0.5, 0.5);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+}
+void
+test_box_align(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx_out;
+ Box_Align_Data *bdata= (Box_Align_Data *)calloc(1, sizeof(Box_Align_Data));
+
+ win = elm_win_util_standard_add("box-align", "Box Align");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
+ _box_align_win_del_cb, bdata);
+
+ bx_out = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx_out);
+ evas_object_show(bx_out);
+
+ _description_add(bx_out, bdata);
+ _align_box_add(bx_out, bdata);
+
+ evas_object_resize(win, 300, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_bubble.c b/src/bin/elementary/test_bubble.c
new file mode 100644
index 0000000000..497ab2f78d
--- /dev/null
+++ b/src/bin/elementary/test_bubble.c
@@ -0,0 +1,176 @@
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#include "test_explode.h"
+
+static void
+_print_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("bubble clicked\n");
+}
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ Evas_Object *win; /* Parent Window of widgets */
+ void *box; /* Use this to get box content */
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ BUBBLE_SET_CORNER_1,
+ BUBBLE_SET_CORNER_2,
+ BUBBLE_SET_ICON_CONTENT,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+ const Eina_List *items = elm_box_children_get(api->box);
+ if (!eina_list_count(items))
+ return;
+
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case BUBBLE_SET_CORNER_1:
+ elm_bubble_pos_set(eina_list_nth(items, 0), ELM_BUBBLE_POS_BOTTOM_LEFT);
+ elm_object_text_set(elm_object_content_get(eina_list_nth(items, 0)),
+ "Corner: base (bottom-left) - with icon");
+ elm_bubble_pos_set(eina_list_nth(items, 1), ELM_BUBBLE_POS_TOP_RIGHT);
+ elm_object_text_set(elm_object_content_get(eina_list_nth(items, 1)),
+ "Corner: base (top-right) - no icon");
+ break;
+
+ case BUBBLE_SET_CORNER_2:
+ elm_bubble_pos_set(eina_list_nth(items, 0), ELM_BUBBLE_POS_TOP_RIGHT);
+ elm_object_text_set(elm_object_content_get(eina_list_nth(items, 0)),
+ "Corner: base (top-right) - with icon");
+ elm_bubble_pos_set(eina_list_nth(items, 1), ELM_BUBBLE_POS_BOTTOM_LEFT);
+ elm_object_text_set(elm_object_content_get(eina_list_nth(items, 1)),
+ "Corner: base (bottom-left) - no icon");
+ break;
+
+ case BUBBLE_SET_ICON_CONTENT:
+ {
+ char buf[PATH_MAX];
+ Evas_Object *ct, *ic = elm_icon_add(api->win);
+
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_object_content_set(eina_list_nth(items, 0), ic);
+ ct = elm_label_add(api->win);
+ elm_object_text_set(ct, "Using icon as top-bubble content");
+ elm_object_content_set(eina_list_nth(items, 1), ct);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ evas_object_show(ic);
+ }
+ break;
+
+ case API_STATE_LAST:
+
+ break;
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_bubble(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *ic, *bb, *ct, *bxx, *bt;
+ char buf[PATH_MAX];
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("bubble", "Bubble");
+ explode_win_enable(win);
+ api->win = win;
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->box = bx;
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, bx);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 1");
+ elm_object_part_text_set(bb, "info", "Corner: bottom_right");
+ elm_object_part_content_set(bb, "icon", ic);
+ elm_bubble_pos_set(bb, ELM_BUBBLE_POS_BOTTOM_RIGHT);
+ evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ct = elm_label_add(win);
+ elm_object_text_set(ct,
+ "\"The future of the art: R or G or B?\", by Rusty");
+ elm_object_content_set(bb, ct);
+
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 2");
+ elm_object_part_text_set(bb, "info", "10:32 4/11/2008");
+ evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ct = elm_label_add(win);
+ elm_object_text_set(ct, "Corner: base (top-left) - no icon");
+ elm_object_content_set(bb, ct);
+
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_button.c b/src/bin/elementary/test_button.c
new file mode 100644
index 0000000000..b7e4288d7c
--- /dev/null
+++ b/src/bin/elementary/test_button.c
@@ -0,0 +1,205 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_bt_repeated(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ static int count;
+ char buf[16];
+
+ snprintf(buf, sizeof(buf), "count=%d", count++);
+ if (count >= 10000)
+ count = 0;
+ elm_object_text_set(obj, buf);
+}
+
+static void
+_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ int param = (int)(uintptr_t)(data);
+
+ printf("clicked event on Button:%d\n", param);
+}
+
+#define NUM_LABEL 4
+const char *btn_label[NUM_LABEL] =
+{
+ "Label Only", "Label Only Test", "Label Only Test 2", "Short"
+};
+
+static void
+_bt_clicked_label_change_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ static int i = 1;
+ elm_object_text_set(obj, btn_label[i]);
+ i++;
+ if (i >= NUM_LABEL) i = 0;
+}
+
+static void
+_bt_unpressed(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ int param = (int)(uintptr_t)(data);
+
+ printf("unpressed event on Button:%d\n", param);
+}
+
+void
+test_button(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *scr, *bx, *ic, *bt;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("buttons", "Buttons");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ scr = elm_scroller_add(win);
+ elm_scroller_bounce_set(scr, EINA_FALSE, EINA_TRUE);
+ elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
+ evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, scr);
+ evas_object_show(scr);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(scr, bx);
+ evas_object_show(bx);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Icon sized to button");
+ elm_object_part_content_set(bt, "icon", ic);
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)1);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)1);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ ic = elm_icon_add(bx);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Icon no scale");
+ elm_object_part_content_set(bt, "icon", ic);
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)2);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)2);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Disabled Button");
+ elm_object_part_content_set(bt, "icon", ic);
+ elm_object_disabled_set(bt, EINA_TRUE);
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)3);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)3);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ bt = elm_button_add(win);
+ elm_object_part_content_set(bt, "icon", ic);
+ elm_object_disabled_set(bt, EINA_TRUE);
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)4);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)4);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Label Only");
+ evas_object_smart_callback_add(bt, "clicked",
+ _bt_clicked_label_change_cb, NULL);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)5);
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "repeated", _bt_repeated, NULL);
+ elm_button_autorepeat_set(bt, EINA_TRUE);
+ elm_button_autorepeat_initial_timeout_set(bt, 2.0);
+ elm_button_autorepeat_gap_timeout_set(bt, 0.5);
+ evas_object_show(bt);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ bt = elm_button_add(win);
+ elm_object_part_content_set(bt, "icon", ic);
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)6);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)6);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_style_set(bt, "anchor");
+ elm_object_text_set(bt, "Anchor style");
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)7);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)7);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ bt = elm_button_add(win);
+ elm_object_style_set(bt, "anchor");
+ elm_object_text_set(bt, "Icon sized to button");
+ elm_object_part_content_set(bt, "icon", ic);
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)8);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)8);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ ic = elm_icon_add(bx);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ bt = elm_button_add(win);
+ elm_object_style_set(bt, "anchor");
+ elm_object_text_set(bt, "Icon no scale");
+ elm_object_part_content_set(bt, "icon", ic);
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)9);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)9);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ bt = elm_button_add(win);
+ elm_object_style_set(bt, "anchor");
+ elm_object_part_content_set(bt, "icon", ic);
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)10);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)10);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ bt = elm_button_add(win);
+ elm_object_access_info_set(bt, "This is some custom text describing this widget");
+ elm_object_style_set(bt, "anchor");
+ elm_object_text_set(bt, "Disabled");
+ elm_object_part_content_set(bt, "icon", ic);
+ elm_object_disabled_set(bt, EINA_TRUE);
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)11);
+ evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)11);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_calendar.c b/src/bin/elementary/test_calendar.c
new file mode 100644
index 0000000000..6f3eb5685d
--- /dev/null
+++ b/src/bin/elementary/test_calendar.c
@@ -0,0 +1,375 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ void *box; /* box used in set_api_state */
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ STATE_MARK_MONTHLY,
+ STATE_MARK_WEEKLY,
+ STATE_SUNDAY_HIGHLIGHT,
+ STATE_SELECT_DATE_DISABLED_WITH_MARKS,
+ STATE_SELECT_DATE_DISABLED_NO_MARKS,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+#define SEC_PER_DAY 24 * 60 * 60
+#define SEC_PER_YEAR 365 * SEC_PER_DAY
+
+static void
+set_api_state(api_data *api)
+{
+ const Eina_List *items = elm_box_children_get(api->box);
+ static Elm_Calendar_Mark *m = NULL;
+ if (!eina_list_count(items))
+ return;
+
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case STATE_MARK_MONTHLY:
+ {
+ Evas_Object *cal = eina_list_nth(items, 0);
+ time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 9); /* Set date to DEC 31, 2010 */
+ elm_calendar_min_max_year_set(cal, 2010, 2011);
+ m = elm_calendar_mark_add(cal, "checked", gmtime(&the_time), ELM_CALENDAR_MONTHLY);
+ elm_calendar_selected_time_set(cal, gmtime(&the_time));
+ }
+ break;
+ case STATE_MARK_WEEKLY:
+ {
+ Evas_Object *cal = eina_list_nth(items, 0);
+ time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 4); /* Set date to DEC 26, 2010 */
+ elm_calendar_mark_del(m);
+ m = elm_calendar_mark_add(cal, "checked", gmtime(&the_time), ELM_CALENDAR_WEEKLY);
+ elm_calendar_selected_time_set(cal, gmtime(&the_time));
+ }
+ break;
+ case STATE_SUNDAY_HIGHLIGHT:
+ {
+ Evas_Object *cal = eina_list_nth(items, 0);
+ time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 3); /* Set date to DEC 25, 2010 */
+ /* elm_calendar_mark_del(m); */
+ m = elm_calendar_mark_add(cal, "holiday", gmtime(&the_time), ELM_CALENDAR_WEEKLY);
+ elm_calendar_selected_time_set(cal, gmtime(&the_time));
+ }
+ break;
+ case STATE_SELECT_DATE_DISABLED_WITH_MARKS:
+ {
+ Evas_Object *cal = eina_list_nth(items, 0);
+ time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 10); /* Set date to JAN 01, 2011 */
+ elm_calendar_select_mode_set(cal, ELM_CALENDAR_SELECT_MODE_NONE);
+ elm_calendar_selected_time_set(cal, gmtime(&the_time));
+ }
+ break;
+ case STATE_SELECT_DATE_DISABLED_NO_MARKS:
+ {
+ Evas_Object *cal = eina_list_nth(items, 0);
+ time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 40); /* Set date to FEB 01, 2011 */
+ elm_calendar_marks_clear(cal);
+ elm_calendar_select_mode_set(cal, ELM_CALENDAR_SELECT_MODE_NONE);
+ elm_calendar_selected_time_set(cal, gmtime(&the_time));
+ }
+ break;
+ case API_STATE_LAST:
+ break;
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+/* A simple test, just displaying calendar in it's default state */
+void
+test_calendar(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *cal, *bx, *bxx, *bt;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("calendar", "Calendar");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->box = bx;
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, bx);
+
+ cal = elm_calendar_add(win);
+ elm_calendar_first_day_of_week_set(cal, ELM_DAY_MONDAY);
+ evas_object_size_hint_weight_set(cal, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, cal);
+
+ time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 9); /* Set date to DEC 31, 2010 */
+ elm_calendar_selected_time_set(cal, gmtime(&the_time));
+ elm_calendar_min_max_year_set(cal, 2010, 2012);
+
+ evas_object_show(cal);
+
+ evas_object_show(win);
+}
+
+void
+_print_cal_info(Evas_Object *cal, Evas_Object *en)
+{
+ char info[1024];
+ double interval;
+ int year_min, year_max;
+ Eina_Bool sel_enabled;
+ const char **wds;
+ struct tm stm;
+
+ if (!elm_calendar_selected_time_get(cal, &stm))
+ return;
+
+ interval = elm_calendar_interval_get(cal);
+ elm_calendar_min_max_year_get(cal, &year_min, &year_max);
+ sel_enabled = !!(elm_calendar_select_mode_get(cal) != ELM_CALENDAR_SELECT_MODE_NONE);
+ wds = elm_calendar_weekdays_names_get(cal);
+
+ snprintf(info, sizeof(info),
+ " Day: %i, Mon: %i, Year %i, WeekDay: %i<br/>"
+ " Interval: %0.2f, Year_Min: %i, Year_Max %i, Sel Enabled : %i<br/>"
+ " Weekdays: %s, %s, %s, %s, %s, %s, %s<br/>",
+ stm.tm_mday, stm.tm_mon, stm.tm_year + 1900, stm.tm_wday,
+ interval, year_min, year_max, sel_enabled,
+ wds[0], wds[1], wds[2], wds[3], wds[4], wds[5], wds[6]);
+
+ elm_object_text_set(en, info);
+}
+
+void
+_print_cal_shown_info(Evas_Object *cal, Evas_Object *en)
+{
+ char info[1024];
+ struct tm stm;
+
+ elm_calendar_displayed_time_get(cal, &stm);
+ snprintf(info, sizeof(info),
+ " Mon: %i, Year %i",
+ stm.tm_mon, stm.tm_year + 1900);
+
+ elm_object_text_set(en, info);
+}
+
+void
+_print_cal_shown_info_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ _print_cal_shown_info(obj, data);
+}
+
+static void
+_print_cal_info_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ _print_cal_info(obj, data);
+}
+
+static char *
+_format_month_year(struct tm *stm)
+{
+ char buf[32];
+ if (!strftime(buf, sizeof(buf), "%b %y", stm)) return NULL;
+ return strdup(buf);
+}
+
+static Evas_Object *
+_calendar_create(Evas_Object *parent)
+{
+ Evas_Object *cal;
+ Elm_Calendar_Mark *mark;
+ struct tm selected_time;
+ time_t current_time;
+ const char *weekdays[] =
+ {
+ "Sunday", "Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday"
+ };
+
+ cal = elm_calendar_add(parent);
+ elm_calendar_weekdays_names_set(cal, weekdays); // FIXME: this causes smart cal recalc loop error
+ elm_calendar_first_day_of_week_set(cal, ELM_DAY_SATURDAY);
+ elm_calendar_interval_set(cal, 0.4);
+ elm_calendar_format_function_set(cal, _format_month_year);
+ elm_calendar_min_max_year_set(cal, 2010, 2020);
+
+ current_time = time(NULL) + 4 * SEC_PER_DAY;
+ localtime_r(&current_time, &selected_time);
+ elm_calendar_mark_add(cal, "holiday", &selected_time, ELM_CALENDAR_ANNUALLY);
+
+ current_time = time(NULL) + 1 * SEC_PER_DAY;
+ localtime_r(&current_time, &selected_time);
+ elm_calendar_mark_add(cal, "checked", &selected_time, ELM_CALENDAR_UNIQUE);
+
+ current_time = time(NULL) - 363 * SEC_PER_DAY;
+ localtime_r(&current_time, &selected_time);
+ elm_calendar_mark_add(cal, "checked", &selected_time, ELM_CALENDAR_MONTHLY);
+
+ current_time = time(NULL) - 5 * SEC_PER_DAY;
+ localtime_r(&current_time, &selected_time);
+ mark = elm_calendar_mark_add(cal, "holiday", &selected_time,
+ ELM_CALENDAR_WEEKLY);
+
+ current_time = time(NULL) + 1 * SEC_PER_DAY;
+ localtime_r(&current_time, &selected_time);
+ elm_calendar_mark_add(cal, "holiday", &selected_time, ELM_CALENDAR_WEEKLY);
+
+ elm_calendar_mark_del(mark);
+ elm_calendar_marks_draw(cal);
+
+ return cal;
+}
+
+/* A test intended to cover all the calendar api and much use cases as
+ possible */
+void
+test_calendar2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bxh, *cal, *cal2, *cal3, *en;
+ struct tm selected_time;
+ time_t current_time;
+
+ win = elm_win_util_standard_add("calendar2", "Calendar 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bxh = elm_box_add(win);
+ elm_box_horizontal_set(bxh, EINA_TRUE);
+ evas_object_size_hint_weight_set(bxh, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bxh, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(bxh);
+ elm_box_pack_end(bx, bxh);
+
+ // calendar 1
+ cal = _calendar_create(win);
+ evas_object_size_hint_weight_set(cal, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(cal, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(cal);
+ elm_box_pack_end(bx, cal);
+
+ en = elm_entry_add(win);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+ elm_entry_editable_set(en, EINA_FALSE);
+
+ _print_cal_info(cal, en);
+ evas_object_smart_callback_add(cal, "changed", _print_cal_info_cb, en);
+
+ // calendar 2
+ cal2 = elm_calendar_add(win);
+ evas_object_size_hint_weight_set(cal2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(cal2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_calendar_select_mode_set(cal2, ELM_CALENDAR_SELECT_MODE_NONE);
+ evas_object_show(cal2);
+ elm_box_pack_end(bxh, cal2);
+
+ // calendar 3
+ cal3 = elm_calendar_add(win);
+ evas_object_size_hint_weight_set(cal3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(cal3, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ current_time = time(NULL) + 34 * SEC_PER_DAY;
+ localtime_r(&current_time, &selected_time);
+ elm_calendar_selected_time_set(cal3, &selected_time);
+ current_time = time(NULL) + 1 * SEC_PER_DAY;
+ localtime_r(&current_time, &selected_time);
+ elm_calendar_mark_add(cal3, "checked", &selected_time, ELM_CALENDAR_UNIQUE);
+ elm_calendar_marks_clear(cal3);
+ current_time = time(NULL);
+ localtime_r(&current_time, &selected_time);
+ elm_calendar_mark_add(cal3, "checked", &selected_time, ELM_CALENDAR_DAILY);
+ elm_calendar_mark_add(cal3, "holiday", &selected_time, ELM_CALENDAR_DAILY);
+ elm_calendar_marks_draw(cal3);
+ evas_object_show(cal3);
+ elm_box_pack_end(bxh, cal3);
+ elm_calendar_min_max_year_set(cal3, -1, -1);
+
+ evas_object_show(win);
+}
+
+void
+test_calendar3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *cal, *en, *bx;
+ struct tm selected_time;
+ time_t current_time;
+
+ win = elm_win_util_standard_add("calendar", "Calendar");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ en = elm_entry_add(win);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ elm_entry_editable_set(en, EINA_FALSE);
+ cal = elm_calendar_add(win);
+ elm_object_style_set(cal, "double_spinners");
+ elm_calendar_first_day_of_week_set(cal, ELM_DAY_THURSDAY);
+ elm_calendar_select_mode_set(cal, ELM_CALENDAR_SELECT_MODE_ONDEMAND);
+ elm_calendar_selectable_set(cal,
+ (ELM_CALENDAR_SELECTABLE_YEAR
+ | ELM_CALENDAR_SELECTABLE_MONTH));
+ current_time = time(NULL) + 34 * SEC_PER_DAY;
+ localtime_r(&current_time, &selected_time);
+ evas_object_size_hint_weight_set(cal, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, cal);
+
+ evas_object_show(cal);
+ elm_calendar_selected_time_set(cal, &selected_time);
+ _print_cal_shown_info(cal, en);
+ evas_object_smart_callback_add(cal, "display,changed", _print_cal_shown_info_cb, en);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_check.c b/src/bin/elementary/test_check.c
new file mode 100644
index 0000000000..1ee3935cc0
--- /dev/null
+++ b/src/bin/elementary/test_check.c
@@ -0,0 +1,190 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static Eina_Bool eb;
+
+static void
+changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ck2 = data;
+ printf("ck %p to %i\n", obj, elm_check_state_get(obj));
+ elm_check_state_set(ck2, elm_check_state_get(obj));
+ printf("ck2 %p is now %i\n", ck2, elm_check_state_get(ck2));
+}
+
+static void
+state_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("State Pointer Value: %d\n", eb);
+}
+
+void
+test_check(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *ic, *ck, *ck0;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("check", "Check");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Icon sized to check");
+ elm_object_part_content_set(ck, "icon", ic);
+ elm_check_state_set(ck, EINA_TRUE);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+ evas_object_show(ic);
+
+ ck0 = ck;
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Icon not resizable");
+ elm_object_part_content_set(ck, "icon", ic);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+ evas_object_show(ic);
+
+ evas_object_smart_callback_add(ck, "changed", changed_cb, ck0);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Label Only");
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Use State Pointer");
+ elm_check_state_pointer_set(ck, &eb);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Print State Pointer Value");
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+ evas_object_smart_callback_add(ck, "changed", state_changed_cb, NULL);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Disabled check");
+ elm_object_part_content_set(ck, "icon", ic);
+ elm_check_state_set(ck, EINA_TRUE);
+ elm_box_pack_end(bx, ck);
+ elm_object_disabled_set(ck, EINA_TRUE);
+ evas_object_show(ck);
+ evas_object_show(ic);
+
+ ck = elm_check_add(win);
+ elm_box_pack_end(bx, ck);
+ elm_object_disabled_set(ck, EINA_TRUE);
+ evas_object_show(ck);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ ck = elm_check_add(win);
+ elm_object_part_content_set(ck, "icon", ic);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+ evas_object_show(ic);
+
+ evas_object_show(win);
+}
+
+void
+test_check_toggle(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *ic, *tg;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("check-toggle", "Check Toggle");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ tg = elm_check_add(win);
+ elm_object_style_set(tg, "toggle");
+ elm_object_text_set(tg, "Icon sized to toggle");
+ elm_object_part_content_set(tg, "icon", ic);
+ elm_check_state_set(tg, EINA_TRUE);
+ elm_object_part_text_set(tg, "on", "Yes");
+ elm_object_part_text_set(tg, "off", "No");
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+
+ tg = elm_check_add(win);
+ elm_object_style_set(tg, "toggle");
+ elm_object_text_set(tg, "Icon no scale");
+ elm_object_part_content_set(tg, "icon", ic);
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+
+ tg = elm_check_add(win);
+ elm_object_style_set(tg, "toggle");
+ elm_object_text_set(tg, "Disabled toggle");
+ elm_object_part_content_set(tg, "icon", ic);
+ elm_object_disabled_set(tg, EINA_TRUE);
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+ evas_object_show(ic);
+
+ tg = elm_check_add(win);
+ elm_object_style_set(tg, "toggle");
+ elm_object_text_set(tg, "Label Only");
+ elm_object_part_text_set(tg, "on", "Big long fun times label");
+ elm_object_part_text_set(tg, "off", "Small long happy fun label");
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+
+ tg = elm_check_add(win);
+ elm_object_style_set(tg, "toggle");
+ elm_object_part_content_set(tg, "icon", ic);
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+ evas_object_show(ic);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_clock.c b/src/bin/elementary/test_clock.c
new file mode 100644
index 0000000000..fdb096faa0
--- /dev/null
+++ b/src/bin/elementary/test_clock.c
@@ -0,0 +1,363 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#include "test.h"
+#endif
+#include <Elementary.h>
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ Evas_Object *box; /* Used in set_api_state */
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ CLOCK_HIDE_SEC,
+ CLOCK_SHOW_AM_PM,
+ CLOCK_SHOW_SEC,
+ CLOCK_EDIT_MIN,
+ CLOCK_EDIT_HOUR,
+ CLOCK_EDIT_ALL,
+ CLOCK_HIDE_AM_PM,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static const char* api_state_description[] = {
+ "Hide Sec",
+ "Show AM/PM",
+ "Show Sec",
+ "Edit Min",
+ "Edit Hour",
+ "Edit All",
+ "Hide AM/PM",
+ NULL
+};
+
+static void
+set_api_state(api_data *api)
+{
+ const Eina_List *items = elm_box_children_get(api->box);
+ Evas_Object *ck = eina_list_nth(items, 0);
+ if (!eina_list_count(items))
+ return;
+
+ /* use elm_box_children_get() to get list of children */
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case CLOCK_HIDE_SEC:
+ elm_clock_show_seconds_set(ck, EINA_FALSE);
+ break;
+
+ case CLOCK_SHOW_AM_PM:
+ elm_clock_show_am_pm_set(ck, EINA_TRUE);
+ break;
+
+ case CLOCK_SHOW_SEC:
+ elm_clock_show_seconds_set(ck, EINA_TRUE);
+ break;
+
+ case CLOCK_EDIT_MIN:
+ elm_clock_edit_set(ck, EINA_TRUE);
+ elm_clock_edit_mode_set(ck, ELM_CLOCK_EDIT_MIN_DECIMAL | ELM_CLOCK_EDIT_MIN_UNIT);
+ break;
+
+ case CLOCK_EDIT_HOUR:
+ elm_clock_edit_set(ck, EINA_TRUE);
+ elm_clock_edit_mode_set(ck, ELM_CLOCK_EDIT_HOUR_DECIMAL | ELM_CLOCK_EDIT_HOUR_UNIT);
+ break;
+
+ case CLOCK_EDIT_ALL:
+ elm_clock_edit_set(ck, EINA_TRUE);
+ elm_clock_edit_mode_set(ck, ELM_CLOCK_EDIT_ALL);
+ break;
+
+ case CLOCK_HIDE_AM_PM:
+ elm_clock_show_am_pm_set(ck, EINA_FALSE);
+ break;
+
+ case API_STATE_LAST:
+
+ break;
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%s>\n", api_state_description[a->state]);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_clock(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *ck, *bt, *bxx;
+ unsigned int digedit;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("clock", "Clock");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bx = elm_box_add(bxx);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->box = bx;
+ evas_object_show(bx);
+
+ bt = elm_button_add(bxx);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, EINA_TRUE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, bx);
+
+ ck = elm_clock_add(bx);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_clock_add(bx);
+ elm_clock_show_am_pm_set(ck, EINA_TRUE);
+ elm_box_pack_end(bx, ck);
+ elm_clock_time_set(ck, 17, 25, 0);
+ evas_object_show(ck);
+
+ ck = elm_clock_add(bx);
+ elm_clock_show_seconds_set(ck, EINA_TRUE);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_clock_add(bx);
+ elm_clock_show_seconds_set(ck, EINA_TRUE);
+ elm_clock_show_am_pm_set(ck, EINA_TRUE);
+ elm_box_pack_end(bx, ck);
+ elm_clock_time_set(ck, 11, 59, 57);
+ evas_object_show(ck);
+
+ ck = elm_clock_add(bx);
+ elm_clock_show_seconds_set(ck, EINA_TRUE);
+ elm_clock_show_am_pm_set(ck, EINA_FALSE);
+ elm_clock_time_set(ck, 23, 59, 57);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_clock_add(bx);
+ elm_clock_edit_set(ck, EINA_TRUE);
+ elm_clock_show_seconds_set(ck, EINA_TRUE);
+ elm_clock_show_am_pm_set(ck, EINA_TRUE);
+ elm_clock_time_set(ck, 10, 11, 12);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_clock_add(bx);
+ elm_clock_show_seconds_set(ck, EINA_TRUE);
+ elm_clock_edit_set(ck, EINA_TRUE);
+ digedit = ELM_CLOCK_EDIT_HOUR_UNIT | ELM_CLOCK_EDIT_MIN_UNIT | ELM_CLOCK_EDIT_SEC_UNIT;
+ elm_clock_edit_mode_set(ck, digedit);
+ elm_box_pack_end(bx, ck);
+ elm_clock_time_set(ck, 0, 0, 0);
+ evas_object_show(ck);
+
+ evas_object_show(win);
+}
+
+static void
+_edit_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ck = data;
+
+ if (!elm_clock_edit_get(ck))
+ {
+ elm_object_text_set(obj, "Done");
+ elm_clock_edit_set(ck, EINA_TRUE);
+ return;
+ }
+ elm_object_text_set(obj, "Edit");
+ elm_clock_edit_set(ck, EINA_FALSE);
+}
+
+static void
+_hmode_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ck = data;
+
+ if (!elm_clock_show_am_pm_get(ck))
+ {
+ elm_object_text_set(obj, "24h");
+ elm_clock_show_am_pm_set(ck, EINA_TRUE);
+ return;
+ }
+ elm_object_text_set(obj, "12h");
+ elm_clock_show_am_pm_set(ck, EINA_FALSE);
+}
+
+static void
+_pause_resume_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ck = data;
+
+ if (!elm_clock_pause_get(ck))
+ {
+ elm_object_text_set(obj, "Resume");
+ elm_clock_pause_set(ck, EINA_TRUE);
+ return;
+ }
+ elm_object_text_set(obj, "Pause");
+ elm_clock_pause_set(ck, EINA_FALSE);
+}
+
+void
+test_clock_edit(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *hbx, *ck, *bt, *bxx;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("clock-edit", "Clock Edit");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bx = elm_box_add(bxx);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->box = bx;
+ evas_object_show(bx);
+
+ bt = elm_button_add(bxx);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, bx);
+
+ ck = elm_clock_add(bx);
+ elm_clock_time_set(ck, 0, 15, 3);
+ elm_clock_edit_mode_set(ck, ELM_CLOCK_EDIT_DEFAULT);
+ elm_clock_show_seconds_set(ck, EINA_TRUE);
+ elm_clock_show_am_pm_set(ck, EINA_TRUE);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ hbx = elm_box_add(bx);
+ evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_horizontal_set(hbx, EINA_TRUE);
+ elm_box_pack_end(bx, hbx);
+ evas_object_show(hbx);
+
+ bt = elm_button_add(hbx);
+ elm_object_text_set(bt, "Edit");
+ evas_object_smart_callback_add(bt, "clicked", _edit_bt_clicked, ck);
+ elm_box_pack_end(hbx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(hbx);
+ elm_object_text_set(bt, "24h");
+ evas_object_smart_callback_add(bt, "clicked", _hmode_bt_clicked, ck);
+ elm_box_pack_end(hbx, bt);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
+
+void
+test_clock_edit2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *ck, *lb;
+
+ win = elm_win_util_standard_add("clock-edit2", "Clock Edit 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "Check time updates for a user mouse button hold."
+ );
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ ck = elm_clock_add(win);
+ elm_clock_show_seconds_set(ck, 1);
+ elm_clock_edit_set(ck, EINA_TRUE);
+ elm_clock_first_interval_set(ck, 0.4);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_clock_add(win);
+ elm_clock_show_seconds_set(ck, 1);
+ elm_clock_edit_set(ck, EINA_TRUE);
+ elm_clock_first_interval_set(ck, 1.2);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_clock_add(win);
+ elm_clock_show_seconds_set(ck, 1);
+ elm_clock_edit_set(ck, EINA_TRUE);
+ elm_clock_first_interval_set(ck, 2.0);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ evas_object_show(win);
+}
+
+void
+test_clock_pause(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *ck, *bt;
+
+ win = elm_win_util_standard_add("clock4", "Clock4");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ ck = elm_clock_add(win);
+ elm_clock_show_seconds_set(ck, EINA_TRUE);
+ elm_clock_time_set(ck, 0, 0, 0);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pause");
+ evas_object_smart_callback_add(bt, "clicked", _pause_resume_bt_clicked, ck);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_cnp.c b/src/bin/elementary/test_cnp.c
new file mode 100644
index 0000000000..35de89e93d
--- /dev/null
+++ b/src/bin/elementary/test_cnp.c
@@ -0,0 +1,135 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static Evas_Object *glb;
+
+static void
+_bt_copy_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ const char *txt = elm_object_text_get(en);
+
+ elm_object_text_set(glb, txt);
+ elm_cnp_selection_set(elm_object_parent_widget_get(en), ELM_SEL_TYPE_CLIPBOARD,
+ ELM_SEL_FORMAT_TEXT, txt, strlen(txt));
+}
+
+static Eina_Bool
+_selection(void *data, Evas_Object *obj EINA_UNUSED, Elm_Selection_Data *ev)
+{
+ Evas_Object *en = data;
+ const char *fmt = NULL;
+
+ switch (ev->format)
+ {
+ case ELM_SEL_FORMAT_TARGETS: fmt = "TARGETS"; break;
+ case ELM_SEL_FORMAT_NONE: fmt = "NONE"; break;
+ case ELM_SEL_FORMAT_TEXT: fmt = "TEXT"; break;
+ case ELM_SEL_FORMAT_MARKUP: fmt = "MARKUP"; break;
+ case ELM_SEL_FORMAT_IMAGE: fmt = "IMAGE"; break;
+ case ELM_SEL_FORMAT_VCARD: fmt = "VCARD"; break;
+ case ELM_SEL_FORMAT_HTML: fmt = "HTML"; break;
+ }
+ fprintf(stderr, "got selection type '%s': length %zu\n", fmt, ev->len);
+
+ if (ev->format == ELM_SEL_FORMAT_TEXT)
+ {
+ char *stripstr;
+
+ stripstr = malloc(ev->len + 1);
+ strncpy(stripstr, (char *)ev->data, ev->len);
+ stripstr[ev->len] = '\0';
+ elm_entry_entry_insert(en, stripstr);
+ free(stripstr);
+ }
+
+ return EINA_TRUE;
+}
+
+static void
+_bt_paste_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+
+ elm_cnp_selection_get(en, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT,
+ _selection, en);
+}
+
+static void
+_bt_clear_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+
+ elm_object_text_set(glb, "");
+ elm_object_cnp_selection_clear(elm_object_parent_widget_get(en), ELM_SEL_TYPE_CLIPBOARD);
+}
+
+void
+test_cnp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gd, *bt, *en, *lb;
+
+ win = elm_win_util_standard_add("copypaste", "CopyPaste");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ gd = elm_grid_add(win);
+ elm_grid_size_set(gd, 100, 100);
+ evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, gd);
+ evas_object_show(gd);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_line_wrap_set(en, ELM_WRAP_CHAR);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en, "Elementary provides ");
+ elm_grid_pack(gd, en, 10, 10, 60, 30);
+ evas_object_show(en);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Copy from left entry");
+ evas_object_smart_callback_add(bt, "clicked", _bt_copy_clicked, en);
+ elm_grid_pack(gd, bt, 70, 10, 22, 30);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Clear clipboard");
+ evas_object_smart_callback_add(bt, "clicked", _bt_clear_clicked, en);
+ elm_grid_pack(gd, bt, 70, 70, 22, 20);
+ evas_object_show(bt);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_line_wrap_set(en, ELM_WRAP_CHAR);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en, "rich copying and pasting functionality,");
+ elm_grid_pack(gd, en, 10, 40, 60, 30);
+ evas_object_show(en);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Paste to left entry");
+ evas_object_smart_callback_add(bt, "clicked", _bt_paste_clicked, en);
+ elm_grid_pack(gd, bt, 70, 40, 22, 30);
+ evas_object_show(bt);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "<b>Clipboard:</b>");
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_grid_pack(gd, lb, 10, 70, 60, 10);
+ evas_object_show(lb);
+
+ glb = elm_label_add(win);
+ elm_object_text_set(glb, "");
+ evas_object_size_hint_weight_set(glb, 0.0, 0.0);
+ evas_object_size_hint_align_set(glb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_grid_pack(gd, glb, 10, 80, 60, 10);
+ evas_object_show(glb);
+
+ evas_object_resize(win, 480, 200);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_colorclass.c b/src/bin/elementary/test_colorclass.c
new file mode 100644
index 0000000000..8764065891
--- /dev/null
+++ b/src/bin/elementary/test_colorclass.c
@@ -0,0 +1,24 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+
+void
+test_colorclass(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *cc;
+
+ win = elm_win_util_standard_add("colorclass", "Color Classes");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ cc = elm_color_class_editor_add(win);
+ elm_win_resize_object_add(win, cc);
+ evas_object_size_hint_weight_set(cc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(cc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(cc);
+
+ evas_object_show(win);
+ evas_object_size_hint_min_set(win, 400, 280);
+ evas_object_resize(win, 400, 280);
+}
diff --git a/src/bin/elementary/test_colorselector.c b/src/bin/elementary/test_colorselector.c
new file mode 100644
index 0000000000..d1a6febebd
--- /dev/null
+++ b/src/bin/elementary/test_colorselector.c
@@ -0,0 +1,212 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_colorselector_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *re = data;
+ int r, g, b, a;
+
+ elm_colorselector_color_get(obj, &r, &g, &b, &a);
+ printf("Changed Color [r=%d g=%d b=%d a=%d]\n", r, g, b, a);
+ evas_color_argb_premul(a, &r, &g, &b);
+ evas_object_color_set(re, r, g, b, a);
+}
+
+static void
+_color_item_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ int r = 0, g = 0, b = 0 ,a = 0;
+ Elm_Object_Item *color_it = event_info;
+
+ elm_colorselector_palette_item_color_get(color_it, &r, &g, &b, &a);
+ printf("Selected Color Palette [r=%d g=%d b=%d a=%d]\n", r, g, b, a);
+}
+
+static void
+_color_item_longpressed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ int r = 0,g = 0,b = 0 ,a = 0;
+ Elm_Object_Item *color_it = event_info;
+
+ elm_colorselector_palette_item_color_get(color_it, &r, &g, &b, &a);
+ printf("Longpressed color item : %p, color = %d-%d-%d-%d\n",
+ color_it, r, g, b, a);
+}
+
+static void
+_palette_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *cs = data;
+ elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_PALETTE);
+}
+
+static void
+_components_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *cs = data;
+ elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_COMPONENTS);
+}
+
+static void
+_both_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *cs = data;
+ elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_BOTH);
+}
+
+static void
+_picker_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *cs = data;
+ elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_PICKER);
+}
+
+static void
+_all_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *cs = data;
+ elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_ALL);
+}
+
+void
+test_colorselector(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *cs, *fr, *re, *bt;
+ const Eina_List *item_list, *last_item_list;
+ Elm_Object_Item *color_item;
+ int r, g, b, a;
+ Elm_Object_Item *item;
+
+ win = elm_win_util_standard_add("colorselector", "ColorSelector");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fr = elm_frame_add(bx);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Color View");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ re = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_min_set(re, 1, ELM_SCALE_SIZE(100));
+ evas_object_show(re);
+ elm_object_content_set(fr, re);
+
+ fr = elm_frame_add(bx);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Color Selector");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ cs = elm_colorselector_add(fr);
+ item = elm_colorselector_palette_color_add(cs, 0, 0, 0, 255);
+ elm_colorselector_palette_item_selected_set(item, EINA_TRUE);
+
+ elm_colorselector_palette_color_add(cs, 255, 255, 255, 255);
+ elm_colorselector_palette_color_add(cs, 255, 0, 0, 255);
+ elm_colorselector_palette_color_add(cs, 0, 255, 0, 255);
+ elm_colorselector_palette_color_add(cs, 0, 0, 255, 255);
+ elm_colorselector_palette_color_add(cs, 255, 255, 0, 255);
+ elm_colorselector_palette_color_add(cs, 0, 255, 255, 255);
+ elm_colorselector_palette_color_add(cs, 255, 0, 255, 255);
+ elm_colorselector_palette_color_add(cs, 192, 192, 192, 255);
+ elm_colorselector_palette_color_add(cs, 128, 128, 128, 255);
+ elm_colorselector_palette_color_add(cs, 128, 0, 0, 255);
+ elm_colorselector_palette_color_add(cs, 128, 128, 0, 255);
+ elm_colorselector_palette_color_add(cs, 0, 128, 0, 255);
+ elm_colorselector_palette_color_add(cs, 128, 0, 128, 255);
+ elm_colorselector_palette_color_add(cs, 0, 128, 128, 255);
+ elm_colorselector_palette_color_add(cs, 0, 100, 128, 255);
+
+ item_list = elm_colorselector_palette_items_get(cs);
+ last_item_list = eina_list_last(item_list);
+ color_item = eina_list_data_get(last_item_list);
+ elm_colorselector_palette_item_color_set(color_item, 0, 0, 128, 255);
+
+ a = 180;
+ r = 255;
+ g = 160;
+ b = 132;
+
+ elm_colorselector_color_set(cs, r, g, b, a);
+ evas_object_size_hint_weight_set(cs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(cs, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(fr, cs);
+ evas_object_show(cs);
+ evas_object_smart_callback_add(cs, "changed", _colorselector_changed_cb, re);
+ evas_object_smart_callback_add(cs, "color,item,selected",
+ _color_item_selected_cb, re);
+ evas_object_smart_callback_add(cs, "color,item,longpressed",
+ _color_item_longpressed_cb, re);
+
+ elm_colorselector_color_get(cs, &r, &g, &b, &a);
+ /* Fix Alpha pre multiplication by edje */
+ r = (r * a) / 255;
+ g = (g * a) / 255;
+ b = (b * a) / 255;
+ evas_object_color_set(re, r, g, b, a);
+
+ bx2 = elm_box_add(bx);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(bx2);
+ elm_box_pack_end(bx, bx2);
+
+ bt = elm_button_add(bx2);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _palette_cb, cs);
+ elm_object_text_set(bt, "Palette");
+ evas_object_show(bt);
+ elm_box_pack_end(bx2, bt);
+
+ bt = elm_button_add(bx2);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _components_cb, cs);
+ elm_object_text_set(bt, "Components");
+ evas_object_show(bt);
+ elm_box_pack_end(bx2, bt);
+
+ bt = elm_button_add(bx2);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _both_cb, cs);
+ elm_object_text_set(bt, "Both");
+ evas_object_show(bt);
+ elm_box_pack_end(bx2, bt);
+
+ bt = elm_button_add(bx2);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _picker_cb, cs);
+ elm_object_text_set(bt, "Picker");
+ evas_object_show(bt);
+ elm_box_pack_end(bx2, bt);
+
+ bt = elm_button_add(bx2);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _all_cb, cs);
+ elm_object_text_set(bt, "All");
+ evas_object_show(bt);
+ elm_box_pack_end(bx2, bt);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_combobox.c b/src/bin/elementary/test_combobox.c
new file mode 100644
index 0000000000..baa6962cc3
--- /dev/null
+++ b/src/bin/elementary/test_combobox.c
@@ -0,0 +1,278 @@
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_combobox_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Hover button is clicked and 'clicked' callback is called.\n");
+}
+
+static void
+_combobox_item_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ const char *txt = elm_object_item_text_get(event_info);
+ printf("'item,selected' callback is called. (selected item : %s)\n", txt);
+}
+
+static void
+_combobox_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("'dismissed' callback is called.\n");
+}
+
+static void
+_combobox_expanded_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("'expanded' callback is called.\n");
+}
+
+static void
+_combobox_item_pressed_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info)
+{
+ const char *txt = elm_object_item_text_get(event_info);
+ printf("'item,pressed' callback is called. (selected item : %s)\n", txt);
+ elm_object_text_set(obj, txt);
+ elm_combobox_hover_end(obj);
+ elm_entry_cursor_end_set(obj);
+}
+
+static char *
+gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
+ return strdup(buf);
+}
+
+static char *
+gl2_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "%s", (char*)data);
+ return strdup(buf);
+}
+
+static Evas_Object *gl_content_get(void *data EINA_UNUSED, Evas_Object *obj,
+ const char *part)
+{
+ char buf[PATH_MAX];
+ Evas_Object *ic = elm_icon_add(obj);
+ if (!strcmp(part, "elm.swallow.end"))
+ snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
+ else
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return ic;
+}
+
+static Eina_Bool gl_state_get(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ const char *part EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+gl_filter_get(void *data, Evas_Object *obj EINA_UNUSED, void *key)
+{
+ char buf[256];
+ // if the key is empty/NULL, return true for item
+ if (!strlen((char *)key)) return EINA_TRUE;
+ snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
+ if (strcasestr(buf, (char *)key))
+ return EINA_TRUE;
+ // Default case should return false (item fails filter hence will be hidden)
+ return EINA_FALSE;
+}
+
+static void
+_gl_filter_restart_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_genlist_filter_set(obj, (void *)elm_object_text_get(obj));
+}
+
+static void
+_gl2_filter_restart_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_genlist_filter_set(obj, (void *)elm_object_text_get(elm_multibuttonentry_entry_get(obj)));
+}
+
+static Eina_Bool
+gl2_filter_get(void *data, Evas_Object *obj EINA_UNUSED, void *key)
+{
+ char buf[256];
+ // if the key is empty/NULL, return true for item
+ if (!strlen((char *)key)) return EINA_TRUE;
+ snprintf(buf, sizeof(buf), "%s", (char*)data);
+ if (!strncmp(buf, (char *)key, strlen((char*)key)))
+ return EINA_TRUE;
+ // Default case should return false (item fails filter hence will be hidden)
+ return EINA_FALSE;
+}
+
+static void
+_gl_filter_finished_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Filter finished\n");
+}
+
+void
+test_combobox(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *combobox;
+ Elm_Genlist_Item_Class *itc;
+ win = elm_win_util_standard_add("combobox", "Combobox");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ itc = elm_genlist_item_class_new();
+ itc->item_style = "default";
+ itc->func.text_get = gl_text_get;
+ itc->func.content_get = gl_content_get;
+ itc->func.state_get = gl_state_get;
+ itc->func.filter_get = gl_filter_get;
+ itc->func.del = NULL;
+
+ combobox = elm_combobox_add(win);
+ evas_object_size_hint_weight_set(combobox, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(combobox, EVAS_HINT_FILL, 0);
+ elm_object_part_text_set(combobox, "guide", "A long list");
+ for (int i = 0; i < 1000; i++)
+ elm_genlist_item_append(combobox, itc, (void *)(uintptr_t)i,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL,
+ (void*)(uintptr_t)(i * 10));
+ evas_object_smart_callback_add(combobox, "clicked",
+ _combobox_clicked_cb, NULL);
+ evas_object_smart_callback_add(combobox, "dismissed",
+ _combobox_dismissed_cb, NULL);
+ evas_object_smart_callback_add(combobox, "expanded",
+ _combobox_expanded_cb, NULL);
+ evas_object_smart_callback_add(combobox, "item,selected",
+ _combobox_item_selected_cb, NULL);
+ evas_object_smart_callback_add(combobox, "item,pressed",
+ _combobox_item_pressed_cb, NULL);
+ evas_object_smart_callback_add(combobox, "filter,done",
+ _gl_filter_finished_cb, NULL);
+ evas_object_smart_callback_add(combobox, "changed",
+ _gl_filter_restart_cb, NULL);
+ elm_box_pack_end(bx, combobox);
+ evas_object_show(combobox);
+
+ combobox = elm_combobox_add(win);
+ evas_object_size_hint_weight_set(combobox, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(combobox, EVAS_HINT_FILL, 0);
+ elm_object_text_set(combobox, "Disabled Combobox");
+ for (int i = 0; i < 1000; i++)
+ elm_genlist_item_append(combobox, itc, (void *)(uintptr_t)i,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL,
+ (void*)(uintptr_t)(i * 10));
+ evas_object_smart_callback_add(combobox, "clicked",
+ _combobox_clicked_cb, NULL);
+ evas_object_smart_callback_add(combobox, "item,selected",
+ _combobox_item_selected_cb, NULL);
+ evas_object_smart_callback_add(combobox, "item,pressed",
+ _combobox_item_pressed_cb, NULL);
+ evas_object_smart_callback_add(combobox, "dismissed",
+ _combobox_dismissed_cb, NULL);
+ evas_object_smart_callback_add(combobox, "expanded",
+ _combobox_expanded_cb, NULL);
+ evas_object_smart_callback_add(combobox, "filter,done",
+ _gl_filter_finished_cb, NULL);
+ elm_object_disabled_set(combobox, EINA_TRUE);
+ elm_box_pack_end(bx, combobox);
+ evas_object_show(combobox);
+
+ evas_object_resize(win, 320, 500);
+ evas_object_show(win);
+}
+
+static void
+_combobox2_item_pressed_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info)
+{
+ const char *txt = elm_object_item_text_get(event_info);
+ printf("'item,pressed' callback is called. (selected item : %s)\n", txt);
+ if (elm_combobox_multiple_selection_get(obj))
+ elm_multibuttonentry_item_append(obj, txt, NULL, NULL);
+ else
+ elm_object_text_set(obj, txt);
+ elm_combobox_hover_end(obj);
+}
+// Combobox with multiple selection
+void
+test_combobox2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *combobox, *ly;
+ Elm_Genlist_Item_Class *itc;
+ char buf[128];
+ char* email_address[300] = {"augue.ut.lacus@Suspendisse.com","egestas.Aliquam.nec@Vivamusmolestiedapibus.edu","urna.et@purusNullam.co.uk","elit@Sedid.net","cursus@malesuadafringillaest.net","Lorem@Cras.org","risus@sedhendrerita.co.uk","auctor.nunc.nulla@utsemNulla.com","nunc.nulla@nonenim.org","egestas@egetipsum.co.uk","sed.tortor@tempusmauris.edu","rutrum@gravida.org","nunc@acsemut.com","lobortis.quam@eratvolutpatNulla.net","fames@ullamcorperDuisat.co.uk","pede.et.risus@necurna.edu","semper.cursus.Integer@justo.com","sem.molestie@orciPhasellusdapibus.com","quam.a@tinciduntvehicula.co.uk","ullamcorper.Duis@odioEtiam.com","enim.Sed.nulla@Etiamligulatortor.net","molestie.pharetra.nibh@velfaucibus.com","morbi@neceuismodin.com","egestas.hendrerit.neque@nequetellus.com","Etiam.gravida.molestie@purusDuis.org","metus.vitae@risus.net","tincidunt.tempus.risus@nonummyFusce.co.uk","Curabitur.ut.odio@in.com","rutrum@utnisi.ca","iaculis.nec@ultriciesdignissimlacus.ca","consectetuer.ipsum.nunc@Cumsociisnatoque.ca","non.arcu.Vivamus@ornare.com","arcu.Vestibulum@interdumligula.edu","sem.magna@urnasuscipit.ca","eu.euismod@urnaconvalliserat.net","Maecenas.mi.felis@mattisInteger.ca","magna.Suspendisse@Donecdignissimmagna.ca","cursus.Integer.mollis@fringillaeuismodenim.ca","tellus.eu@molestie.co.uk","metus.In@egestas.co.uk","Cum@nisl.com","Phasellus@atarcu.net","nec.quam.Curabitur@tortorInteger.org","condimentum.Donec@egetodioAliquam.edu","orci.luctus@magnatellus.co.uk","adipiscing@noncursusnon.co.uk","Sed.eget.lacus@Nullam.edu","felis.ullamcorper@ornare.co.uk","Nunc.quis.arcu@Proineget.edu","in@lobortis.co.uk","leo.Vivamus.nibh@seddui.com","eu.tellus.Phasellus@natoque.ca","ultrices.iaculis@Aliquam.net","purus.ac@feugiatLorem.net","tincidunt.neque@ut.net","odio.sagittis.semper@nibhdolornonummy.org","Sed@eunequepellentesque.com","elementum@sempererat.co.uk","Curae.Donec.tincidunt@neque.net","rhoncus@erat.edu","mauris.elit@Donec.ca","metus.vitae.velit@ad.edu","scelerisque.scelerisque@etmalesuadafames.net","velit.in@convallis.co.uk","ridiculus@laoreetlectusquis.org","tincidunt.orci.quis@musDonec.net","tempor@orciconsectetuereuismod.co.uk","Duis.sit@eratSednunc.com","elit.sed.consequat@nuncinterdum.edu","lorem@Pellentesqueultricies.org","ornare.placerat.orci@pretiumnequeMorbi.com","euismod.enim@primisinfaucibus.ca","a.scelerisque.sed@sapienCras.com","Aliquam@Vestibulum.net","nec@at.ca","quis.diam.luctus@atauctor.ca","nec@purusin.org","montes.nascetur.ridiculus@viverraMaecenas.co.uk","elementum@amet.edu","fringilla.cursus.purus@velarcuCurabitur.co.uk","et.rutrum@consectetuerrhoncus.edu","Aenean@maurissapiencursus.com","interdum@vehiculaaliquet.co.uk","orci.quis.lectus@facilisisfacilisis.org","et.netus.et@arcu.net","ipsum.porta.elit@sapienNunc.edu","libero.Morbi@ipsumCurabiturconsequat.ca","libero@sitamet.com","porta@penatibus.org","nec.enim.Nunc@egetmetusIn.edu","Nunc.sollicitudin.commodo@porttitorinterdum.org","Phasellus.at.augue@dolor.org","nec.ante@etlibero.com","diam@gravida.co.uk","laoreet@malesuada.co.uk","in.lobortis@blanditenim.edu","ante@ipsumnon.net","in@odio.org","Quisque.tincidunt@risus.co.uk","lacus.varius@Vestibulum.com","eu.eros.Nam@arcuNunc.org","pellentesque@Vivamuseuismodurna.org","Cum.sociis@eleifendCras.com","neque@vulputate.org","imperdiet.dictum.magna@risus.org","sagittis@enimcondimentum.edu","hendrerit@maurisMorbi.org","suscipit.nonummy@disparturientmontes.org","Vivamus.non.lorem@fermentummetusAenean.net","In.mi@maurisaliquam.com","est@massanonante.org","molestie@a.co.uk","sit@acturpis.org","diam@felisorci.edu","dolor.nonummy.ac@elitsedconsequat.co.uk","justo@Praesentinterdum.co.uk","Quisque.varius@enimMaurisquis.ca","nibh.enim.gravida@ut.ca","arcu.Vivamus@orciquis.co.uk","sociis@Sedeget.net","risus@egetvolutpatornare.com","vel.est.tempor@ipsum.net","ipsum@dolordapibusgravida.edu","sem.egestas@quamelementum.co.uk","ipsum@Duisatlacus.co.uk","facilisis.vitae@acturpisegestas.net","Nam@aliquetlobortis.net","ipsum.dolor.sit@nuncInat.net","gravida.sagittis@et.org","mauris@magnatellus.edu","sed@adipiscingenimmi.org","sed@ipsumportaelit.com","malesuada.vel.convallis@amet.net","Praesent.interdum@dictumeu.co.uk","nunc.In.at@ornare.co.uk","Phasellus.fermentum.convallis@ipsum.net","sed.libero.Proin@Aliquameratvolutpat.org","aliquet.libero@telluslorem.net","lectus.pede.ultrices@Maurisquisturpis.edu","blandit.at.nisi@ut.net","erat@convallisdolor.net","ante.Nunc.mauris@vehiculaetrutrum.ca","vel.quam@egestas.edu","non@justofaucibuslectus.co.uk","sem.ut.dolor@odioNaminterdum.org","et.ipsum@malesuada.net","non@Nulladignissim.com","ullamcorper.nisl@iaculisodio.com","neque.sed@necurna.ca","in.cursus.et@fermentumvelmauris.co.uk","magna.sed@eteuismodet.co.uk","a@Crasvehicula.com","tortor.Nunc.commodo@velmauris.net","dignissim.pharetra@Aeneaneuismodmauris.org","egestas.urna.justo@acorci.org","iaculis.enim.sit@maurisIntegersem.com","malesuada@imperdietnec.com","erat.volutpat.Nulla@ipsum.org","Aliquam@IntegerurnaVivamus.co.uk","Nunc.sollicitudin@ipsumCurabitur.net","nibh.enim@quam.co.uk","pede@quismassa.com","vel.nisl@fringillacursuspurus.co.uk","vel@auctorvelitAliquam.org","auctor.quis.tristique@fringillamilacinia.org","nisl.elementum@amagna.com","facilisis@feugiattelluslorem.co.uk","eleifend.Cras@Vestibulumante.net","Integer.eu.lacus@ipsumCurabiturconsequat.com","Donec.porttitor@Etiamvestibulummassa.ca","montes@auctorquistristique.net","Nunc.ullamcorper.velit@Vivamusnon.co.uk","dictum.cursus@sed.org","Aliquam.erat.volutpat@nonummyut.org","ac.mattis@ligulaNullamenim.net","id.sapien.Cras@Proin.ca","Phasellus.dolor@fermentumfermentum.edu","in@odio.edu","non.luctus@pedeNuncsed.com","per.conubia@euismodacfermentum.com","luctus.aliquet@venenatisvelfaucibus.ca","nulla.Cras@purusaccumsaninterdum.ca","aliquet.vel.vulputate@pedesagittis.edu","rutrum@pedeultrices.co.uk","Nullam.lobortis@hendrerit.ca","nonummy.ac.feugiat@Sedmalesuadaaugue.edu","nibh@ipsum.com","in.faucibus.orci@vehicula.com","odio.vel.est@in.edu","amet.ornare.lectus@Suspendisse.co.uk","Maecenas.malesuada.fringilla@at.co.uk","Aliquam@aceleifendvitae.org","Nullam.feugiat.placerat@massaQuisque.ca","urna@tempor.org","magnis.dis.parturient@arcuCurabitur.edu","erat.vel@In.ca","rutrum@Integervitae.ca","metus.In@odio.co.uk","nec.imperdiet@tellus.ca","dui.semper.et@at.org","sit.amet@quisarcu.org","ante@Donecsollicitudinadipiscing.edu","turpis.egestas.Aliquam@egestasnunc.edu","posuere@quismassaMauris.co.uk","Nulla.dignissim@nibhAliquamornare.com","facilisis.vitae.orci@estmaurisrhoncus.net","vitae.aliquet.nec@nostraper.co.uk","lorem@enimsitamet.co.uk","pellentesque@acipsum.org","pede.et.risus@nonvestibulum.org","sed@Nuncsollicitudin.com","erat@Maurisvestibulum.org","scelerisque@tortorNunc.org","metus@idsapien.org","dignissim@Duis.ca","Duis.at.lacus@egestaslaciniaSed.com","auctor.velit@dapibus.co.uk","Curae.Phasellus.ornare@eudolor.net","arcu@metusfacilisis.ca","laoreet@dictummagna.net","tristique.neque@auctorvitaealiquet.ca","nunc.interdum.feugiat@primisinfaucibus.edu","elit.pede.malesuada@quam.net","semper.et.lacinia@ornareliberoat.ca","magna.Praesent.interdum@elit.net","consequat@loremDonec.ca","Vivamus@nisiMauris.edu","feugiat.tellus@sociisnatoquepenatibus.co.uk","scelerisque.mollis.Phasellus@facilisis.edu","rhoncus.Proin@enimEtiam.com","amet.consectetuer.adipiscing@lacusNullatincidunt.edu","aliquet.lobortis.nisi@leo.com","magna@purus.org","a@etmalesuadafames.com","Nunc.commodo@vulputatenisisem.net","et.rutrum.non@imperdieteratnonummy.com","consectetuer@mauris.net","iaculis.lacus@Proinvelarcu.ca","tincidunt.Donec.vitae@habitant.net","et.ultrices@nequesed.org","Lorem.ipsum@nonante.edu","Vestibulum.ut@sed.co.uk","fermentum.arcu@Duis.com","Morbi.quis.urna@vulputate.org","Sed.eget@liberolacusvarius.net","amet.lorem@tincidunt.co.uk","morbi@Classaptenttaciti.com","nisl.Quisque.fringilla@ut.ca","Aenean.egestas.hendrerit@eleifendnec.co.uk","elit@odio.net","sodales.Mauris.blandit@fermentumfermentumarcu.com","massa.non@Nuncsollicitudin.com","quam@sit.co.uk","consectetuer@quispedePraesent.co.uk","erat.eget@aliquetPhasellusfermentum.ca","libero@convalliserat.net","dui@arcu.ca","Curabitur@ascelerisquesed.org","amet@sed.com","in.aliquet.lobortis@acipsum.net","Donec.non@feugiatnec.com","Suspendisse.dui.Fusce@musProin.com","congue@loremauctor.co.uk","magna@Morbi.com","sit@dolor.edu","Praesent.eu.nulla@parturientmontes.com","eu.dui.Cum@arcuvelquam.org","leo.elementum@aliquet.edu","aliquam@urna.org","congue@nonummy.ca","urna.Nullam@atauctor.ca","natoque.penatibus@id.co.uk","aliquam.arcu@risusQuisque.com","ultrices.iaculis@liberoet.com","mollis.Integer.tincidunt@auctorvelit.org","sit@mus.org","est.mollis@orci.net","gravida@eunullaat.co.uk","varius.ultrices@Intinciduntcongue.org","Duis.cursus@nuncnulla.org","eu.turpis@Cumsociis.com","metus.In@sapiencursusin.org","a.feugiat.tellus@velitjusto.co.uk","nibh.lacinia.orci@mifelis.org","tincidunt.neque.vitae@Sed.ca","convallis.est.vitae@Donec.org","mauris@semelit.co.uk","Nam.interdum@Morbiquis.ca","vel.arcu.Curabitur@ullamcorperDuisat.net","dolor@mauris.com","Suspendisse@ipsum.org","Vivamus@dui.edu","condimentum.eget.volutpat@lobortisultrices.ca","commodo@et.edu","ut.ipsum@MorbimetusVivamus.co.uk","ut@feugiatnecdiam.org","Nam@ultrices.co.uk","orci.Donec@turpis.org","semper.tellus@venenatislacus.com","elit.elit@arcuimperdietullamcorper.edu"};
+ win = elm_win_util_standard_add("combobox", "Combobox");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/combobox_multiple.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "combobox_multiple_test");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, ly);
+ evas_object_show(ly);
+
+ itc = elm_genlist_item_class_new();
+ itc->item_style = "default";
+ itc->func.text_get = gl2_text_get;
+ itc->func.content_get = gl_content_get;
+ itc->func.state_get = gl_state_get;
+ itc->func.filter_get = gl2_filter_get;
+ itc->func.del = NULL;
+
+ combobox = elm_combobox_add(win);
+ evas_object_size_hint_weight_set(combobox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(combobox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(combobox, "To:");
+ elm_object_part_text_set(combobox, "guide", "Tap to add recipient");
+ elm_combobox_multiple_selection_set(combobox, EINA_TRUE);
+ for (int i = 0; i < 300; i++)
+ elm_genlist_item_append(combobox, itc, (void *)email_address[i],
+ NULL, ELM_GENLIST_ITEM_NONE, NULL,
+ (void*)(uintptr_t)(i * 10));
+
+ evas_object_smart_callback_add(combobox, "clicked",
+ _combobox_clicked_cb, NULL);
+ evas_object_smart_callback_add(combobox, "item,selected",
+ _combobox_item_selected_cb, NULL);
+ evas_object_smart_callback_add(combobox, "dismissed",
+ _combobox_dismissed_cb, NULL);
+ evas_object_smart_callback_add(combobox, "expanded",
+ _combobox_expanded_cb, NULL);
+ evas_object_smart_callback_add(combobox, "item,pressed",
+ _combobox2_item_pressed_cb, NULL);
+ evas_object_smart_callback_add(combobox, "filter,done",
+ _gl_filter_finished_cb, NULL);
+ evas_object_smart_callback_add(combobox, "changed",
+ _gl2_filter_restart_cb, NULL);
+ elm_object_part_content_set(ly, "combobox", combobox);
+ evas_object_show(combobox);
+
+ evas_object_resize(win, 640, 600);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_config.c b/src/bin/elementary/test_config.c
new file mode 100644
index 0000000000..bf032a73ec
--- /dev/null
+++ b/src/bin/elementary/test_config.c
@@ -0,0 +1,534 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#ifdef MAX_PROFILES
+# undef MAX_PROFILES
+#endif
+
+#define MAX_PROFILES 20
+
+#ifdef LOG
+# undef LOG
+#endif
+
+#define LOG(m) \
+ do { \
+ lb = elm_label_add(win); \
+ elm_object_text_set(lb, m); \
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0); \
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); \
+ evas_object_show(lb); \
+ } while(0)
+
+typedef struct _Prof_Data Prof_Data;
+typedef struct _App_Data App_Data;
+
+struct _Prof_Data
+{
+ Evas_Object *rdg;
+ Eina_List *cks;
+ const char *profile;
+ const char *available_profiles[MAX_PROFILES];
+ int count;
+};
+
+struct _App_Data
+{
+ Evas_Object *win;
+ Eina_List *profiles;
+ Prof_Data curr;
+ Prof_Data new;
+};
+
+void test_config(void *data, Evas_Object *obj, void *event_info);
+
+static void
+_profile_clear(Prof_Data *pd)
+{
+ if (pd->profile)
+ eina_stringshare_del(pd->profile);
+ pd->profile = NULL;
+}
+
+static void
+_profiles_clear(Prof_Data *pd)
+{
+ int i;
+ for (i = 0; i < MAX_PROFILES; i++)
+ {
+ if (pd->available_profiles[i])
+ eina_stringshare_del(pd->available_profiles[i]);
+ pd->available_profiles[i] = NULL;
+ }
+}
+
+static void
+_profile_update(Evas_Object *win)
+{
+ Evas_Object *lb = evas_object_data_get(win, "lb");
+ char **profiles = NULL;
+ const char *profile;
+ unsigned int i, n = 0;
+ char buf[PATH_MAX];
+
+ profile = elm_win_profile_get(win);
+ snprintf(buf, sizeof(buf),
+ "Profile: <b>%s</b><br/>"
+ "Available profiles: <b>",
+ profile);
+
+ elm_win_available_profiles_get(win, &profiles, &n);
+ if ((profiles) && (n > 0))
+ {
+ for (i = 0; i < n; i++)
+ {
+ if (i >= 1) strncat(buf, ", ", 2);
+ strncat(buf, profiles[i], strlen(profiles[i]) + 1);
+ }
+ strncat(buf, "</b>", 4);
+ }
+ elm_object_text_set(lb, buf);
+}
+
+static void
+_bt_profile_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ App_Data *ad = evas_object_data_get((Evas_Object *)data, "ad");
+ Evas_Object *rd = elm_radio_selected_object_get(ad->curr.rdg);
+ const char *profile = elm_object_text_get(rd);
+ if (strcmp(profile, "Nothing") != 0)
+ elm_win_profile_set(ad->win, elm_object_text_get(rd));
+ else
+ elm_win_profile_set(ad->win, NULL);
+ _profile_update(ad->win);
+}
+
+static void
+_bt_available_profiles_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ App_Data *ad = evas_object_data_get((Evas_Object *)data, "ad");
+ Eina_List *l = NULL;
+ const char *str;
+ Evas_Object *o;
+ int i = 0;
+
+ _profiles_clear(&ad->curr);
+
+ EINA_LIST_FOREACH(ad->curr.cks, l, o)
+ {
+ if (elm_check_state_get(o))
+ {
+ str = evas_object_data_get(o, "profile");
+ if (str)
+ {
+ ad->curr.available_profiles[i] = eina_stringshare_add(str);
+ i++;
+ }
+ }
+ }
+ ad->curr.count = i;
+
+ elm_win_available_profiles_set(ad->win,
+ ad->curr.available_profiles,
+ ad->curr.count);
+ _profile_update(ad->win);
+}
+
+static void
+_bt_win_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ App_Data *ad = evas_object_data_get((Evas_Object *)data, "ad");
+ Evas_Object *rd = elm_radio_selected_object_get(ad->new.rdg);
+ const char *profile = elm_object_text_get(rd);
+ const char *str;
+ Eina_List *l = NULL;
+ Evas_Object *o;
+ int i = 0;
+
+ _profile_clear(&ad->new);
+ _profiles_clear(&ad->new);
+
+ if (strcmp(profile, "Nothing") != 0)
+ ad->new.profile = (char *)eina_stringshare_add(profile);
+
+ EINA_LIST_FOREACH(ad->new.cks, l, o)
+ {
+ if (elm_check_state_get(o))
+ {
+ str = evas_object_data_get(o, "profile");
+ if (str)
+ {
+ ad->new.available_profiles[i] = eina_stringshare_add(str);
+ i++;
+ }
+ }
+ }
+ ad->new.count = i;
+
+ test_config(&(ad->new), NULL, NULL);
+}
+
+static void
+_win_profile_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
+{
+ _profile_update(obj);
+}
+
+static void
+_win_del_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ App_Data *ad = evas_object_data_get(obj, "ad");
+ Evas_Object *o;
+ char *str;
+
+ elm_config_profile_list_free(ad->profiles);
+ ad->profiles = NULL;
+
+ EINA_LIST_FREE(ad->curr.cks, o)
+ {
+ str = evas_object_data_del(o, "profile");
+ if (str) eina_stringshare_del(str);
+ }
+
+ EINA_LIST_FREE(ad->new.cks, o)
+ {
+ str = evas_object_data_del(o, "profile");
+ if (str) eina_stringshare_del(str);
+ }
+
+ _profile_clear(&ad->curr);
+ _profiles_clear(&ad->curr);
+ _profile_clear(&ad->new);
+ _profiles_clear(&ad->new);
+
+ free(ad);
+}
+
+static Evas_Object *
+_radio_add(Evas_Object *win, Evas_Object *bx)
+{
+ App_Data *ad = evas_object_data_get(win, "ad");
+ Evas_Object *bx2, *rd, *rdg = NULL;
+ Eina_List *l = NULL;
+ const char *str;
+ int i = 0;
+
+ bx2 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0);
+ elm_box_align_set(bx2, 0.0, 0.5);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ rdg = rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, i);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "Nothing");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ i++;
+
+ EINA_LIST_FOREACH(ad->profiles, l, str)
+ {
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, i);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, str);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ i++;
+ }
+
+ return rdg;
+}
+
+static Eina_List *
+_check_add(Evas_Object *win, Evas_Object *bx)
+{
+ App_Data *ad = evas_object_data_get(win, "ad");
+ Evas_Object *bx2, *ck;
+ Eina_List *l = NULL, *ll = NULL;
+ const char *str;
+
+ bx2 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0);
+ elm_box_align_set(bx2, 0.0, 0.5);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ EINA_LIST_FOREACH(ad->profiles, l, str)
+ {
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, str);
+ evas_object_data_set(ck, "profile", eina_stringshare_add(str));
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx2, ck);
+ evas_object_show(ck);
+
+ ll = eina_list_append(ll, ck);
+ }
+
+ return ll;
+}
+
+static Evas_Object *
+_inlined_add(Evas_Object *parent)
+{
+ Evas_Object *win, *bg, *bx, *lb;
+
+ win = elm_win_add(parent, "inlined", ELM_WIN_INLINED_IMAGE);
+ if (!win) return NULL;
+
+ bg = elm_bg_add(win);
+ elm_bg_color_set(bg, 110, 210, 120);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.0);
+ evas_object_show(bx);
+
+ LOG("ELM_WIN_INLINED_IMAGE");
+ elm_box_pack_end(bx, lb);
+
+ LOG("Profile: <b>N/A</b>");
+ elm_box_pack_end(bx, lb);
+ evas_object_data_set(win, "lb", lb);
+
+ evas_object_move(win, 10, 100);
+ evas_object_resize(win, 150, 70);
+ evas_object_move(elm_win_inlined_image_object_get(win), 10, 100);
+ evas_object_resize(elm_win_inlined_image_object_get(win), 150, 70);
+
+ evas_object_smart_callback_add(win, "profile,changed", _win_profile_changed_cb, NULL);
+ evas_object_show(win);
+
+ return win;
+}
+
+static Evas_Object *
+_socket_add(const char *name)
+{
+ Evas_Object *win, *bg, *bx, *lb;
+
+ win = elm_win_add(NULL, "socket image", ELM_WIN_SOCKET_IMAGE);
+ if (!win) return NULL;
+
+ if (elm_win_socket_listen(win, name, 0, EINA_FALSE))
+ {
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ elm_bg_color_set(bg, 80, 110, 205);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.0);
+ evas_object_show(bx);
+
+ LOG("ELM_WIN_SOCKET_IMAGE");
+ elm_box_pack_end(bx, lb);
+
+ LOG("Profile: <b>N/A</b>");
+ elm_box_pack_end(bx, lb);
+ evas_object_data_set(win, "lb", lb);
+
+ _inlined_add(win);
+
+ evas_object_move(win, 0, 0);
+ evas_object_resize(win, 150, 200);
+
+ evas_object_smart_callback_add(win, "profile,changed", _win_profile_changed_cb, NULL);
+ evas_object_show(win);
+ }
+ else
+ {
+ evas_object_del(win);
+ win = NULL;
+ }
+
+ return win;
+}
+
+static Evas_Object *
+_plug_add(Evas_Object *win, Evas_Object *bx, const char *name)
+{
+ Evas_Object *plug, *ly;
+ Eina_Bool res = EINA_FALSE;
+ char buf[PATH_MAX];
+
+ plug = elm_plug_add(win);
+ if (plug) res = elm_plug_connect(plug, name, 0, EINA_FALSE);
+
+ if (res)
+ {
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "win_config");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(ly);
+
+ evas_object_size_hint_weight_set(plug, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, ly);
+ elm_object_part_content_set(ly, "swallow", plug);
+ evas_object_show(plug);
+ }
+ else
+ {
+ if (plug) evas_object_del(plug);
+ plug = NULL;
+ }
+
+ return plug;
+}
+
+#ifdef FRAME
+# undef FRAME
+#endif
+
+#define FRAME(t) \
+ do { \
+ fr = elm_frame_add(bx); \
+ elm_object_text_set(fr, t); \
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); \
+ evas_object_size_hint_fill_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); \
+ elm_box_pack_end(bx, fr); \
+ evas_object_show(fr); \
+ bx2 = elm_box_add(win); \
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); \
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0); \
+ elm_box_align_set(bx2, 0.0, 0.5); \
+ elm_object_content_set(fr, bx2); \
+ evas_object_show(bx2); \
+ } while(0)
+
+void
+test_config(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ App_Data *ad;
+ Prof_Data *pd = (Prof_Data *)data;
+ Evas_Object *win, *sc, *bx, *fr, *bx2, *lb, *bt;
+ Ecore_Evas *ee;
+ const char *siname = "_TestConfigSocketImage_";
+ char buf[PATH_MAX];
+
+ if (!(ad = calloc(1, sizeof(App_Data)))) return;
+
+ win = elm_win_util_standard_add("config", "Configuration");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_data_set(win, "ad", ad);
+ ad->win = win;
+ ad->profiles = elm_config_profile_list_get();
+
+ sc = elm_scroller_add(win);
+ elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, sc);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(sc, bx);
+
+ FRAME("Current window profile");
+ ee = ecore_evas_ecore_evas_get(evas_object_evas_get(win));
+ snprintf(buf, sizeof(buf),
+ "Virtual desktop window profile support: <b>%s</b>",
+ ecore_evas_window_profile_supported_get(ee) ? "Yes" : "No");
+ LOG(buf);
+ elm_box_pack_end(bx2, lb);
+
+ LOG("Profile: <b>N/A</b><br/>Available profiles:");
+ elm_box_pack_end(bx2, lb);
+ evas_object_data_set(win, "lb", lb);
+
+ LOG("<br/>Window profile");
+ elm_box_pack_end(bx2, lb);
+ ad->curr.rdg = _radio_add(win, bx2);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Set");
+ evas_object_smart_callback_add(bt, "clicked", _bt_profile_set, win);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ LOG("Window available profiles");
+ elm_box_pack_end(bx2, lb);
+ ad->curr.cks = _check_add(win, bx2);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Set");
+ evas_object_smart_callback_add(bt, "clicked", _bt_available_profiles_set, win);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ FRAME("Socket");
+ if (_socket_add(siname))
+ {
+ LOG("Starting socket image.");
+ elm_box_pack_end(bx2, lb);
+ }
+ else
+ {
+ LOG("Failed to create socket.<br/>"
+ "Please check whether another test configuration window is<br/>"
+ "already running and providing socket image.");
+ elm_box_pack_end(bx2, lb);
+ }
+
+ FRAME("Plug");
+ if (!_plug_add(win, bx2, siname))
+ {
+ LOG("Failed to connect to server.");
+ elm_box_pack_end(bx2, lb);
+ }
+
+ FRAME("Create new window with profile");
+ LOG("Window profile");
+ elm_box_pack_end(bx2, lb);
+ ad->new.rdg = _radio_add(win, bx2);
+
+ LOG("Window available profiles");
+ elm_box_pack_end(bx2, lb);
+ ad->new.cks = _check_add(win, bx2);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Create");
+ evas_object_smart_callback_add(bt, "clicked", _bt_win_add, win);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(win, "profile,changed", _win_profile_changed_cb, NULL);
+ evas_object_smart_callback_add(win, "delete,request", _win_del_cb, NULL);
+
+ if (pd && !obj) //obj is NULL when called by _bt_win_add but not when user clicks this test
+ {
+ if (pd->available_profiles[0])
+ elm_win_available_profiles_set(win,
+ pd->available_profiles,
+ pd->count);
+ if (pd->profile)
+ elm_win_profile_set(win, pd->profile);
+
+ _profile_update(win);
+ }
+
+ evas_object_show(bx);
+ evas_object_show(sc);
+
+ evas_object_resize(win, 400, 500);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_conform.c b/src/bin/elementary/test_conform.c
new file mode 100644
index 0000000000..f850b1c6e9
--- /dev/null
+++ b/src/bin/elementary/test_conform.c
@@ -0,0 +1,195 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+void
+test_conformant(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ Evas_Object *win, *conform, *btn, *bx, *en;
+
+ win = elm_win_util_standard_add("conformant", "Conformant");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_conformant_set(win, EINA_TRUE);
+
+ conform = elm_conformant_add(win);
+ evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, conform);
+ evas_object_show(conform);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_scroller_bounce_set(en, EINA_TRUE, EINA_FALSE);
+ elm_object_text_set(en, "This is the top entry here");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "Test Conformant");
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_scroller_bounce_set(en, EINA_TRUE, EINA_FALSE);
+ elm_object_text_set(en, "This is the middle entry here");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "Test Conformant");
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_scroller_bounce_set(en, EINA_FALSE, EINA_TRUE);
+ elm_object_text_set(en,
+ "This is a multi-line entry at the bottom<br/>"
+ "This can contain more than 1 line of text and be "
+ "scrolled around to allow for entering of lots of "
+ "content. It is also to test to see that autoscroll "
+ "moves to the right part of a larger multi-line "
+ "text entry that is inside of a scroller than can be "
+ "scrolled around, thus changing the expected position "
+ "as well as cursor changes updating auto-scroll when "
+ "it is enabled.");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ elm_object_content_set(conform, bx);
+ evas_object_show(bx);
+
+ evas_object_resize(win, 240, 240);
+ evas_object_show(win);
+}
+
+static void
+popobj(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ elm_naviframe_item_pop(data);
+}
+
+void
+test_conformant2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ Evas_Object *win, *conform, *btn, *bx, *en, *pg;
+
+ win = elm_win_util_standard_add("conformant2", "Conformant 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_conformant_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_scroller_bounce_set(en, EINA_TRUE, EINA_FALSE);
+ elm_object_text_set(en, "This is the top entry here");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+
+ btn = elm_button_add(win);
+ elm_object_focus_allow_set(btn, EINA_FALSE);
+ elm_object_text_set(btn, "Delete Below");
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ pg = elm_naviframe_add(win);
+ evas_object_size_hint_weight_set(pg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(pg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, pg);
+ evas_object_show(pg);
+
+ evas_object_smart_callback_add(btn, "clicked", popobj, pg);
+
+ conform = elm_conformant_add(win);
+ evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_naviframe_item_simple_push(pg, conform);
+ evas_object_show(conform);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_scroller_bounce_set(en, EINA_FALSE, EINA_TRUE);
+ elm_object_text_set(en, "This entry and button below get deleted.");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ btn = elm_button_add(win);
+ elm_object_focus_allow_set(btn, EINA_FALSE);
+ elm_object_text_set(btn, "Delete this bottom bit 1");
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ evas_object_smart_callback_add(btn, "clicked", popobj, pg);
+
+ elm_object_content_set(conform, bx);
+ evas_object_show(bx);
+
+ conform = elm_conformant_add(win);
+ evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_naviframe_item_simple_push(pg, conform);
+ evas_object_show(conform);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_scroller_bounce_set(en, EINA_FALSE, EINA_TRUE);
+ elm_object_text_set(en, "This entry and button below get deleted.");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ btn = elm_button_add(win);
+ elm_object_focus_allow_set(btn, EINA_FALSE);
+ elm_object_text_set(btn, "Delete this bottom bit 2");
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ evas_object_smart_callback_add(btn, "clicked", popobj, pg);
+
+ elm_object_content_set(conform, bx);
+ evas_object_show(bx);
+
+ evas_object_resize(win, 240, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_conform_indicator.c b/src/bin/elementary/test_conform_indicator.c
new file mode 100644
index 0000000000..d7c13b9e7b
--- /dev/null
+++ b/src/bin/elementary/test_conform_indicator.c
@@ -0,0 +1,384 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static int vis = 0;
+static int rotate_with_resize = 0;
+static Evas_Object *win_port = NULL;
+static Evas_Object *win_land = NULL;
+
+static void
+_rot_0(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ if (rotate_with_resize)
+ elm_win_rotation_with_resize_set(win, 0);
+ else
+ elm_win_rotation_set(win, 0);
+}
+
+static void
+_rot_90(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ if (rotate_with_resize)
+ elm_win_rotation_with_resize_set(win, 90);
+ else
+ elm_win_rotation_set(win, 90);
+}
+
+static void
+_rot_180(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ if (rotate_with_resize)
+ elm_win_rotation_with_resize_set(win, 180);
+ else
+ elm_win_rotation_set(win, 180);
+}
+
+static void
+_rot_270(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ if (rotate_with_resize)
+ elm_win_rotation_with_resize_set(win, 270);
+ else
+ elm_win_rotation_set(win, 270);
+}
+
+static void
+_visible_change_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+
+ printf("visible change before = %d\n", vis);
+ if (vis == 0)
+ {
+ elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW);
+ vis = 1;
+ }
+ else
+ {
+ elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_HIDE);
+ vis = 0;
+ }
+
+ /*Add App code here*/
+ printf("visible change after = %d\n", vis);
+}
+
+static void
+_launch_conformant_indicator_window_btn_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *conform, *bt, *bx;
+ Evas_Object *plug_port = NULL, *plug_land = NULL;
+
+ win = elm_win_util_standard_add("conformant-indicator",
+ "Conformant Indicator");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_conformant_set(win, EINA_TRUE);
+
+ //Create conformant
+ conform = elm_conformant_add(win);
+ evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, conform);
+ evas_object_show(conform);
+
+ bx = elm_box_add(conform);
+ elm_object_content_set(conform, bx);
+ evas_object_show(bx);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Rot 0");
+ evas_object_smart_callback_add(bt, "clicked", _rot_0, win);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Rot 90");
+ evas_object_smart_callback_add(bt, "clicked", _rot_90, win);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Rot 180");
+ evas_object_smart_callback_add(bt, "clicked", _rot_180, win);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Rot 270");
+ evas_object_smart_callback_add(bt, "clicked", _rot_270, win);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ /* portrait plug */
+ plug_port = elm_plug_add(bx);
+ if (!plug_port)
+ {
+ printf("fail to create plug to server [elm_indicator_portrait]\n");
+ evas_object_del(win);
+ return;
+ }
+
+ if (!elm_plug_connect(plug_port, "elm_indicator_portrait", 0, EINA_FALSE))
+ {
+ printf("fail to connect to server [elm_indicator_portraits]\n");
+ evas_object_del(win);
+ return;
+ }
+ evas_object_size_hint_weight_set(plug_port, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(plug_port, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(plug_port);
+ elm_box_pack_end(bx, plug_port);
+
+ /* landscape plug */
+ plug_land = elm_plug_add(bx);
+ if (!plug_land)
+ {
+ printf("fail to create plug to server [elm_indicator_landscape]\n");
+ evas_object_del(win);
+ return;
+ }
+ if (!elm_plug_connect(plug_land, "elm_indicator_landscape", 0, EINA_FALSE))
+ {
+ printf("fail to connect to server [elm_indicator_landscape]\n");
+ evas_object_del(win);
+ return;
+ }
+ evas_object_size_hint_weight_set(plug_land, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(plug_land, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(plug_land);
+ elm_box_pack_end(bx, plug_land);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Show/Hide");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", _visible_change_cb, win);
+
+ evas_object_resize(win, 400, 600);
+ evas_object_show(win);
+}
+
+static void
+_mouse_down_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = event_info;
+ Evas_Object *sub_obj = data;
+
+ printf("\nAPP mouse down [%d]x[%d] obj=%p type=%s\n", ev->canvas.x, ev->canvas.y,sub_obj,evas_object_type_get(sub_obj));
+
+ evas_object_move(sub_obj, ev->canvas.x, ev->canvas.y);
+}
+
+static void
+_mouse_move_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev = event_info;
+ Evas_Object *sub_obj = data;
+ if (!ev->buttons) return;
+
+ printf("APP mouse move [%d]x[%d] obj=%p type=%s\n", ev->cur.canvas.x, ev->cur.canvas.y,sub_obj,evas_object_type_get(sub_obj));
+ evas_object_move(sub_obj, ev->cur.canvas.x, ev->cur.canvas.y);
+}
+
+static void
+_fill_portrait(Evas_Object *win)
+{
+ Evas_Object *bg, *btn;
+
+ bg = elm_bg_add(win);
+ evas_object_resize(bg, 720, 60);
+ elm_bg_color_set(bg, 221, 187, 187);
+ evas_object_show(bg);
+
+ btn = elm_button_add(win);
+ if (!btn)
+ {
+ printf("fail to elm_button_add() \n");
+ return;
+ }
+
+ elm_object_text_set(btn, "portrait");
+
+ evas_object_resize(btn, 200, 50);
+ evas_object_move(btn, 260, 0);
+ evas_object_show(btn);
+
+ // This checks whether the indicator gets mouse event from application correctly
+ evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, btn);
+ evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, btn);
+}
+
+static void
+_fill_landscape(Evas_Object *win)
+{
+ Evas_Object *bg, *btn;
+
+ bg = elm_bg_add(win);
+ evas_object_resize(bg, 1280, 60);
+ elm_bg_color_set(bg, 207, 255, 255);
+ evas_object_show(bg);
+
+ btn = elm_button_add(win);
+ if (!btn)
+ {
+ printf("fail to elm_button_add() \n");
+ return;
+ }
+
+ elm_object_text_set(btn, "landscape");
+
+ evas_object_resize(btn, 200, 50);
+ evas_object_move(btn, 580, 0);
+ evas_object_show(btn);
+
+ // This checks whether the indicator gets mouse event from application correctly
+ evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, btn);
+ evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, btn);
+}
+
+static Evas_Object *
+_create_portrait(void)
+{
+ const char *port_indi_name;
+
+ win_port = elm_win_add(NULL, "portrait_indicator", ELM_WIN_SOCKET_IMAGE);
+ if (!win_port)
+ {
+ printf("fail to create a portrait indicator window\n");
+ return NULL;
+ }
+ elm_win_autodel_set(win_port, EINA_TRUE);
+
+ port_indi_name = elm_config_indicator_service_get(0);
+ if (!port_indi_name)
+ {
+ printf("indicator has no portrait service name: use default name\n");
+ port_indi_name = "elm_indicator_portrait";
+ }
+
+ if (!elm_win_socket_listen(win_port, port_indi_name, 0, EINA_FALSE))
+ {
+ printf("failed to listen portrait window socket.\n");
+ evas_object_del(win_port);
+ return NULL;
+ }
+
+ elm_win_title_set(win_port, "win sock test:port");
+ elm_win_borderless_set(win_port, EINA_TRUE);
+
+ evas_object_move(win_port, 0, 0);
+ evas_object_resize(win_port, 720, 60);
+
+ _fill_portrait(win_port);
+
+ return win_port;
+}
+
+static Evas_Object *
+_create_landscape(void)
+{
+ const char *land_indi_name;
+
+ win_land = elm_win_add(NULL, "win_socket_test:land", ELM_WIN_SOCKET_IMAGE);
+ if (!win_land)
+ {
+ printf("fail to create a landscape indicator window\n");
+ return NULL;
+ }
+ elm_win_autodel_set(win_land, EINA_TRUE);
+
+ land_indi_name = elm_config_indicator_service_get(90);
+ if (!land_indi_name)
+ {
+ printf("indicator has no landscape service name: use default name\n");
+ land_indi_name = "elm_indicator_landscape";
+ }
+
+ if (!elm_win_socket_listen(win_land, land_indi_name, 0, 0))
+ {
+ printf("fail to listen landscape window socket.\n");
+ evas_object_del(win_land);
+ return NULL;
+ }
+
+ elm_win_title_set(win_land, "win sock test:land");
+ elm_win_borderless_set(win_land, EINA_TRUE);
+
+ evas_object_move(win_land, 0, 0);
+ evas_object_resize(win_land, 1280, 60);
+
+ _fill_landscape(win_land);
+
+ return win_land;
+}
+
+static void
+_indicator_service_start_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event EINA_UNUSED)
+{
+ elm_object_disabled_set(data, EINA_TRUE);
+
+ win_port = _create_portrait();
+ if (!win_port) return;
+
+ win_land = _create_landscape();
+ if (!win_land) return;
+
+ evas_object_show(win_port);
+ evas_object_show(win_land);
+
+}
+
+void
+test_conformant_indicator(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event EINA_UNUSED)
+{
+ Evas_Object *win, *btn, *bx;
+
+ win = elm_win_util_standard_add("conformant-indicator-service",
+ "Conformant Indicator Service");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "Start Indicator Service");
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _indicator_service_start_btn_cb, btn);
+
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "Launch Conformant Indicator Window");
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _launch_conformant_indicator_window_btn_cb, NULL);
+
+ evas_object_resize(win, 200, 200);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_ctxpopup.c b/src/bin/elementary/test_ctxpopup.c
new file mode 100644
index 0000000000..27e5376a2a
--- /dev/null
+++ b/src/bin/elementary/test_ctxpopup.c
@@ -0,0 +1,433 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static int list_mouse_down = 0;
+
+static void
+_dismissed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ evas_object_del(obj);
+}
+
+static void
+_print_current_dir(Evas_Object *obj)
+{
+ Elm_Ctxpopup_Direction dir;
+ dir = elm_ctxpopup_direction_get(obj);
+
+ switch(dir)
+ {
+ case ELM_CTXPOPUP_DIRECTION_LEFT:
+ printf("ctxpopup direction: left!\n");
+ break;
+ case ELM_CTXPOPUP_DIRECTION_RIGHT:
+ printf("ctxpopup direction: right!\n");
+ break;
+ case ELM_CTXPOPUP_DIRECTION_UP:
+ printf("ctxpopup direction: up!\n");
+ break;
+ case ELM_CTXPOPUP_DIRECTION_DOWN:
+ printf("ctxpopup direction: down!\n");
+ break;
+ case ELM_CTXPOPUP_DIRECTION_UNKNOWN:
+ printf("ctxpopup direction: unknow!\n");
+ break;
+ }
+ printf(" [%s : %d] auto_hide_mode=%d\n", __func__, __LINE__, elm_ctxpopup_auto_hide_disabled_get(obj));
+}
+
+static void
+_btn_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Button Clicked\n");
+}
+
+static void
+_ctxpopup_item_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("ctxpopup item selected: %s\n",
+ elm_object_item_text_get(event_info));
+}
+
+static Elm_Object_Item *
+_ctxpopup_item_new(Evas_Object *obj, const char *label, const char *icon)
+{
+ Evas_Object *ic = NULL;
+ Elm_Object_Item *it = NULL;
+
+ if (!obj) return NULL;
+
+ if (icon)
+ {
+ ic = elm_icon_add(obj);
+ elm_icon_standard_set(ic, icon);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ }
+
+ it = elm_ctxpopup_item_append(obj, label, ic, _ctxpopup_item_cb, NULL);
+ return it;
+}
+
+static void
+_geometry_update(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Coord_Rectangle *geom = event_info;
+ printf("ctxpopup geometry(%d %d %d %d)\n", geom->x, geom->y, geom->w, geom->h);
+}
+
+static void
+_list_item_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ctxpopup;
+ Elm_Object_Item *it = NULL;
+ Evas_Coord x,y;
+
+ if (list_mouse_down > 0) return;
+
+ ctxpopup = elm_ctxpopup_add(obj);
+ evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL);
+ evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL);
+
+ _ctxpopup_item_new(ctxpopup, "Go to home folder", "home");
+ _ctxpopup_item_new(ctxpopup, "Save file", "file");
+ _ctxpopup_item_new(ctxpopup, "Delete file", "delete");
+ it = _ctxpopup_item_new(ctxpopup, "Navigate to folder", "folder");
+ elm_object_item_disabled_set(it, EINA_TRUE);
+ _ctxpopup_item_new(ctxpopup, "Edit entry", "edit");
+ it = _ctxpopup_item_new(ctxpopup, "Set date and time", "clock");
+ elm_object_item_disabled_set(it, EINA_TRUE);
+
+ evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
+ evas_object_size_hint_max_set(ctxpopup, 240, 240);
+ evas_object_move(ctxpopup, x, y);
+ evas_object_show(ctxpopup);
+ _print_current_dir(ctxpopup);
+}
+
+static void
+_list_item_cb2(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ctxpopup;
+ Elm_Object_Item *it = NULL;
+ Evas_Coord x,y;
+
+ if (list_mouse_down > 0) return;
+
+ ctxpopup = elm_ctxpopup_add(obj);
+ evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL);
+ evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL);
+
+ _ctxpopup_item_new(ctxpopup, NULL, "home");
+ _ctxpopup_item_new(ctxpopup, NULL, "file");
+ _ctxpopup_item_new(ctxpopup, NULL, "delete");
+ _ctxpopup_item_new(ctxpopup, NULL, "folder");
+ it = _ctxpopup_item_new(ctxpopup, NULL, "edit");
+ elm_object_item_disabled_set(it, EINA_TRUE);
+ _ctxpopup_item_new(ctxpopup, NULL, "clock");
+
+ evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
+ evas_object_size_hint_max_set(ctxpopup, 240, 240);
+ evas_object_move(ctxpopup, x, y);
+ evas_object_show(ctxpopup);
+ _print_current_dir(ctxpopup);
+}
+
+static void
+_list_item_cb3(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ctxpopup;
+ Elm_Object_Item *it = NULL;
+ Evas_Coord x,y;
+
+ if (list_mouse_down > 0) return;
+
+ ctxpopup = elm_ctxpopup_add(obj);
+ evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL);
+ evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL);
+
+ _ctxpopup_item_new(ctxpopup, "Eina", NULL);
+ _ctxpopup_item_new(ctxpopup, "Eet", NULL);
+ _ctxpopup_item_new(ctxpopup, "Evas", NULL);
+ it = _ctxpopup_item_new(ctxpopup, "Ecore", NULL);
+ elm_object_item_disabled_set(it, EINA_TRUE);
+ _ctxpopup_item_new(ctxpopup, "Embryo", NULL);
+ _ctxpopup_item_new(ctxpopup, "Edje", NULL);
+
+ evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
+ evas_object_move(ctxpopup, x, y);
+ evas_object_show(ctxpopup);
+ _print_current_dir(ctxpopup);
+}
+
+static void
+_list_item_cb4(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ctxpopup;
+ Evas_Coord x,y;
+
+ if (list_mouse_down > 0) return;
+
+ ctxpopup = elm_ctxpopup_add(obj);
+ evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL);
+ evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL);
+
+ elm_ctxpopup_horizontal_set(ctxpopup, EINA_TRUE);
+
+ _ctxpopup_item_new(ctxpopup, NULL, "home");
+ _ctxpopup_item_new(ctxpopup, NULL, "file");
+ _ctxpopup_item_new(ctxpopup, NULL, "delete");
+ _ctxpopup_item_new(ctxpopup, NULL, "folder");
+ _ctxpopup_item_new(ctxpopup, NULL, "edit");
+ _ctxpopup_item_new(ctxpopup, NULL, "clock");
+
+ evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
+ evas_object_size_hint_max_set(ctxpopup, 240, 240);
+ evas_object_move(ctxpopup, x, y);
+ evas_object_show(ctxpopup);
+ _print_current_dir(ctxpopup);
+}
+
+static void
+_list_item_cb5(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ctxpopup, *btn, *sc, *bx;
+ Evas_Coord x,y;
+
+ if (list_mouse_down > 0) return;
+
+ bx = elm_box_add(obj);
+ evas_object_size_hint_min_set(bx, 150, 150);
+
+ sc = elm_scroller_add(bx);
+ elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
+ evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(sc);
+
+ btn = elm_button_add(sc);
+ elm_object_text_set(btn, "Enlightenment");
+ evas_object_size_hint_min_set(btn, 140, 140);
+
+ elm_object_content_set(sc, btn);
+
+ elm_box_pack_end(bx, sc);
+
+ ctxpopup = elm_ctxpopup_add(obj);
+ evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL);
+ evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL);
+
+ elm_object_content_set(ctxpopup, bx);
+
+ evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
+ evas_object_move(ctxpopup, x, y);
+ evas_object_show(ctxpopup);
+ _print_current_dir(ctxpopup);
+
+ evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, ctxpopup);
+}
+
+static void
+_ctxpopup_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static void
+_restack_btn_clicked_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *im, *ctxpopup = data;
+ char buf[PATH_MAX];
+
+ printf("Restack button clicked\n");
+
+ im = evas_object_image_filled_add(evas_object_evas_get(obj));
+ snprintf(buf, sizeof(buf), "%s/images/%s",
+ elm_app_data_dir_get(), "twofish.jpg");
+ evas_object_image_file_set(im, buf, NULL);
+ evas_object_move(im, 40, 40);
+ evas_object_resize(im, 320, 320);
+ evas_object_show(im);
+
+ evas_object_raise(ctxpopup);
+ evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL,
+ _ctxpopup_del_cb, im);
+}
+
+static void
+_list_item_cb6(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ctxpopup, *btn, *sc, *bx;
+ Evas_Coord x,y;
+
+ if (list_mouse_down > 0) return;
+
+ bx = elm_box_add(obj);
+ evas_object_size_hint_min_set(bx, 200, 150);
+
+ sc = elm_scroller_add(bx);
+ elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
+ evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(sc);
+
+ btn = elm_button_add(sc);
+ elm_object_text_set(btn, "Ctxpop will be on the top of layer");
+ evas_object_size_hint_min_set(btn, 190, 140);
+
+ elm_object_content_set(sc, btn);
+
+ elm_box_pack_end(bx, sc);
+
+ ctxpopup = elm_ctxpopup_add(obj);
+ evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL);
+ evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL);
+
+ elm_object_content_set(ctxpopup, bx);
+
+ evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
+ evas_object_move(ctxpopup, x, y);
+ evas_object_show(ctxpopup);
+ _print_current_dir(ctxpopup);
+
+ evas_object_smart_callback_add(btn, "clicked",
+ _restack_btn_clicked_cb, ctxpopup);
+}
+
+static void
+_ctxpopup_item_disable_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("ctxpopup item selected: %s\n",
+ elm_object_item_text_get(event_info));
+
+ elm_object_item_disabled_set(event_info, EINA_TRUE);
+}
+
+static void
+_ctxpopup_item_delete_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ printf("ctxpopup item selected: %s\n",
+ elm_object_item_text_get(event_info));
+
+ evas_object_del(obj);
+}
+
+static void
+_list_item_cb7(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ctxpopup;
+ Evas_Coord x,y;
+
+ if (list_mouse_down > 0) return;
+ ctxpopup = elm_ctxpopup_add(obj);
+ evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL);
+ evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL);
+
+ elm_ctxpopup_item_append(ctxpopup, "Disable this item", NULL, _ctxpopup_item_disable_cb, ctxpopup);
+ elm_ctxpopup_item_append(ctxpopup, "Delete this ctxpopup", NULL, _ctxpopup_item_delete_cb, ctxpopup);
+ elm_ctxpopup_item_append(ctxpopup, "Another item", NULL, _ctxpopup_item_cb, NULL);
+
+ evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
+ evas_object_size_hint_max_set(ctxpopup, 240, 240);
+ evas_object_move(ctxpopup, x, y);
+ evas_object_show(ctxpopup);
+ _print_current_dir(ctxpopup);
+}
+
+static void
+_list_item_cb8(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ctxpopup;
+ Elm_Object_Item *it = NULL;
+ Evas_Coord x,y;
+
+ if (list_mouse_down > 0) return;
+
+ ctxpopup = elm_ctxpopup_add(obj);
+ evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL);
+ evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL);
+
+ elm_ctxpopup_auto_hide_disabled_set(ctxpopup, EINA_TRUE);
+
+ _ctxpopup_item_new(ctxpopup, "Go to home folder", "home");
+ _ctxpopup_item_new(ctxpopup, "Save file", "file");
+ _ctxpopup_item_new(ctxpopup, "Delete file", "delete");
+ it = _ctxpopup_item_new(ctxpopup, "Navigate to folder", "folder");
+ elm_object_item_disabled_set(it, EINA_TRUE);
+ _ctxpopup_item_new(ctxpopup, "Edit entry", "edit");
+
+ evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
+ evas_object_move(ctxpopup, x, y);
+ evas_object_show(ctxpopup);
+ _print_current_dir(ctxpopup);
+}
+
+static void
+_list_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ elm_list_item_selected_set(event_info, EINA_FALSE);
+}
+
+static void
+_list_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ list_mouse_down++;
+}
+
+static void
+_list_mouse_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ list_mouse_down--;
+}
+
+static void
+_win_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ list_mouse_down = 0;
+}
+
+void
+test_ctxpopup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *list;
+
+ win = elm_win_util_standard_add("contextual-popup", "Contextual Popup");
+ evas_object_smart_callback_add(win, "delete,request", _win_del, NULL);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ list = elm_list_add(win);
+ evas_object_event_callback_add(list, EVAS_CALLBACK_MOUSE_DOWN,
+ _list_mouse_down, NULL);
+ evas_object_event_callback_add(list, EVAS_CALLBACK_MOUSE_UP,
+ _list_mouse_up, NULL);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, list);
+ elm_list_mode_set(list, ELM_LIST_COMPRESS);
+ evas_object_smart_callback_add(list, "selected", _list_clicked, NULL);
+
+ elm_list_item_append(list, "Ctxpopup with icons and labels", NULL, NULL,
+ _list_item_cb, NULL);
+ elm_list_item_append(list, "Ctxpopup with icons only", NULL, NULL,
+ _list_item_cb2, NULL);
+ elm_list_item_append(list, "Ctxpopup with labels only", NULL, NULL,
+ _list_item_cb3, NULL);
+ elm_list_item_append(list, "Ctxpopup at horizontal mode", NULL, NULL,
+ _list_item_cb4, NULL);
+ elm_list_item_append(list, "Ctxpopup with user content", NULL, NULL,
+ _list_item_cb5, NULL);
+ elm_list_item_append(list, "Ctxpopup with restacking", NULL, NULL,
+ _list_item_cb6, NULL);
+ elm_list_item_append(list, "Ctxpopup with callback function", NULL, NULL,
+ _list_item_cb7, NULL);
+ elm_list_item_append(list, "Ctxpopup with auto hide disabled mode", NULL, NULL,
+ _list_item_cb8, NULL);
+ evas_object_show(list);
+ elm_list_go(list);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_cursor.c b/src/bin/elementary/test_cursor.c
new file mode 100644
index 0000000000..1e6401abb9
--- /dev/null
+++ b/src/bin/elementary/test_cursor.c
@@ -0,0 +1,473 @@
+#include <Elementary_Cursor.h>
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+// XXX: show all type of cursors in the elementary_test. this needs to be the first test
+
+typedef struct _Testitem
+{
+ Elm_Object_Item *item;
+ const char *path;
+ int mode;
+ int onoff;
+} Testitem;
+
+static Elm_Gengrid_Item_Class gic;
+static Eina_Bool cursor_setted = EINA_FALSE;
+
+char *
+grd_lbl_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ const Testitem *ti = data;
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Photo %s", ti->path);
+ return strdup(buf);
+}
+
+Evas_Object *
+grd_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ const Testitem *ti = data;
+ if (!strcmp(part, "elm.swallow.icon"))
+ {
+ Evas_Object *icon = elm_bg_add(obj);
+ elm_bg_file_set(icon, ti->path, NULL);
+ evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL,
+ 1, 1);
+ evas_object_show(icon);
+ return icon;
+ }
+ return NULL;
+}
+
+static Elm_Genlist_Item_Class itct;
+
+static void
+glt_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ Evas_Object *gl = elm_object_item_widget_get(glit);
+ int val = (int)(uintptr_t) elm_object_item_data_get(glit);
+ Elm_Object_Item *glit1, *glit2, *glit3;
+
+ val *= 10;
+ glit1 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 1), glit,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ glit2 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 2), glit,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ glit3 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 3), glit,
+ ELM_GENLIST_ITEM_TREE, NULL, NULL);
+
+ elm_genlist_item_cursor_set(glit1, ELM_CURSOR_HAND2);
+ elm_genlist_item_cursor_set(glit2, ELM_CURSOR_HAND2);
+ elm_genlist_item_cursor_set(glit3, ELM_CURSOR_HAND1);
+
+}
+
+static void
+glt_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_subitems_clear(glit);
+}
+
+static void
+glt_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_expanded_set(glit, EINA_TRUE);
+}
+
+static void
+glt_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_expanded_set(glit, EINA_FALSE);
+}
+
+char *
+glt_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item mode %i", (int)(uintptr_t)data);
+ return strdup(buf);
+}
+
+static void
+bt_clicked(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (cursor_setted)
+ {
+ elm_object_cursor_unset(obj);
+ cursor_setted = EINA_FALSE;
+ elm_object_text_set(obj, "Cursor set on click");
+ }
+ else
+ {
+ elm_object_cursor_set(obj, ELM_CURSOR_HAND1);
+ cursor_setted = EINA_TRUE;
+ elm_object_text_set(obj, "Cursor unset on click");
+ }
+}
+
+void
+test_cursor(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *bx, *bt, *list, *entry, *ck;
+ Elm_Object_Item *lit;
+
+ win = elm_win_add(NULL, "cursor", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Cursor");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+ elm_object_cursor_set(bg, ELM_CURSOR_CIRCLE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ ck = elm_clock_add(win);
+ elm_object_cursor_set(ck, ELM_CURSOR_CLOCK);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ bt = elm_button_add(win);
+ elm_object_cursor_set(bt, ELM_CURSOR_COFFEE_MUG);
+ elm_object_text_set(bt, "Coffee Mug");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_cursor_set(bt, ELM_CURSOR_CLOCK);
+ elm_object_text_set(bt, "Cursor unset");
+ elm_object_cursor_unset(bt);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Cursor set on click");
+ evas_object_smart_callback_add(bt, "clicked", bt_clicked, NULL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ list = elm_list_add(win);
+ elm_box_pack_end(bx, list);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_cursor_set(list, ELM_CURSOR_WATCH);
+ lit = elm_list_item_append(list, "watch over list | hand1", NULL, NULL, NULL,
+ NULL);
+ elm_object_item_cursor_set(lit, ELM_CURSOR_HAND1);
+ lit = elm_list_item_append(list, "watch over list | hand2", NULL, NULL, NULL,
+ NULL);
+ elm_object_item_cursor_set(lit, ELM_CURSOR_HAND2);
+ elm_list_go(list);
+ evas_object_show(list);
+
+ entry = elm_entry_add(win);
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_object_text_set(entry, "Xterm cursor");
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_fill_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, entry);
+ evas_object_show(entry);
+ elm_object_cursor_set(entry, ELM_CURSOR_XTERM);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+void
+test_cursor2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *o, *grid, *gl;
+ Elm_Object_Item *glit1, *glit2, *glit3;
+ Elm_Object_Item *tb_it;
+ Elm_Object_Item *lit;
+ char buf[PATH_MAX];
+ static Testitem ti[144];
+ int i, n;
+ const char *img[9] =
+ {
+ "panel_01.jpg",
+ "plant_01.jpg",
+ "rock_01.jpg",
+ "rock_02.jpg",
+ "sky_01.jpg",
+ "sky_02.jpg",
+ "sky_03.jpg",
+ "sky_04.jpg",
+ "wood_01.jpg",
+ };
+
+ win = elm_win_util_standard_add("cursor2", "Cursor 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ o = elm_toolbar_add(win);
+ elm_toolbar_homogeneous_set(o, EINA_FALSE);
+ evas_object_size_hint_weight_set(o, 0.0, 0.0);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0);
+ tb_it = elm_toolbar_item_append(o, NULL, "Bogosity", NULL, NULL);
+ elm_object_item_cursor_set(tb_it, ELM_CURSOR_BOGOSITY);
+ tb_it = elm_toolbar_item_append(o, NULL, "Unset", NULL, NULL);
+ elm_object_item_cursor_set(tb_it, ELM_CURSOR_BOGOSITY);
+ elm_object_item_cursor_unset(tb_it);
+ tb_it = elm_toolbar_item_append(o, NULL, "Xterm", NULL, NULL);
+ elm_object_item_cursor_set(tb_it, ELM_CURSOR_XTERM);
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_list_add(win);
+ elm_box_pack_end(bx, o);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ lit = elm_list_item_append(o, "cursor bogosity", NULL, NULL, NULL, NULL);
+ elm_object_item_cursor_set(lit, ELM_CURSOR_BOGOSITY);
+ lit = elm_list_item_append(o, "cursor unset", NULL, NULL, NULL, NULL);
+ elm_object_item_cursor_set(lit, ELM_CURSOR_BOGOSITY);
+ elm_object_item_cursor_unset(lit);
+ lit = elm_list_item_append(o, "cursor xterm", NULL, NULL, NULL, NULL);
+ elm_object_item_cursor_set(lit, ELM_CURSOR_XTERM);
+ elm_list_go(o);
+ evas_object_show(o);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(gl);
+
+ itct.item_style = "default";
+ itct.func.text_get = glt_text_get;
+
+ glit1 = elm_genlist_item_append(gl, &itct, (void *) 1, NULL,
+ ELM_GENLIST_ITEM_TREE, NULL, NULL);
+ glit2 = elm_genlist_item_append(gl, &itct, (void *) 2, NULL,
+ ELM_GENLIST_ITEM_TREE, NULL, NULL);
+ glit3 = elm_genlist_item_append(gl, &itct, (void *) 3, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ elm_genlist_item_cursor_set(glit1, ELM_CURSOR_HAND1);
+ elm_genlist_item_cursor_set(glit2, ELM_CURSOR_HAND1);
+ elm_genlist_item_cursor_set(glit3, ELM_CURSOR_CROSS);
+
+ evas_object_smart_callback_add(gl, "expand,request", glt_exp_req, gl);
+ evas_object_smart_callback_add(gl, "contract,request", glt_con_req, gl);
+ evas_object_smart_callback_add(gl, "expanded", glt_exp, gl);
+ evas_object_smart_callback_add(gl, "contracted", glt_con, gl);
+
+ elm_box_pack_end(bx, gl);
+
+ grid = elm_gengrid_add(win);
+ elm_gengrid_item_size_set(grid, 130, 130);
+ elm_gengrid_horizontal_set(grid, EINA_FALSE);
+ elm_gengrid_multi_select_set(grid, EINA_TRUE);
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ gic.item_style = "default";
+ gic.func.text_get = grd_lbl_get;
+ gic.func.content_get = grd_content_get;
+
+ n = 0;
+ for (i = 0; i < 3 * 3; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
+ n = (n + 1) % 9;
+ ti[i].mode = i;
+ ti[i].path = eina_stringshare_add(buf);
+ ti[i].item = elm_gengrid_item_append(grid, &gic, &(ti[i]), NULL, NULL);
+ if (n % 2)
+ elm_gengrid_item_cursor_set(ti[i].item, ELM_CURSOR_HAND1);
+ else
+ elm_gengrid_item_cursor_set(ti[i].item, ELM_CURSOR_CLOCK);
+ if (!(i % 5))
+ elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE);
+ }
+ elm_box_pack_end(bx, grid);
+ evas_object_show(grid);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+void
+test_cursor3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *o;
+ Elm_Object_Item *lit;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("cursor3", "Cursor 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ snprintf(buf, sizeof(buf), "%s/objects/cursors.edj", elm_app_data_dir_get());
+ elm_theme_extension_add(NULL, buf);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ o = elm_button_add(win);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_cursor_set(o, ELM_CURSOR_HAND1);
+ elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE);
+ elm_object_text_set(o, "hand1");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_button_add(win);
+ elm_object_cursor_set(o, ELM_CURSOR_HAND2);
+ elm_object_text_set(o, "hand2 x");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_button_add(win);
+ elm_object_cursor_set(o, ELM_CURSOR_HAND2);
+ elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE);
+ elm_object_text_set(o, "hand2");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_button_add(win);
+ elm_object_cursor_set(o, "hand3");
+ elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE);
+ elm_object_text_set(o, "hand3");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_button_add(win);
+ elm_object_cursor_set(o, "hand3");
+ elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE);
+ elm_object_cursor_style_set(o, "transparent");
+ elm_object_text_set(o, "hand3 transparent");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_button_add(win);
+ elm_object_cursor_set(o, "hand3");
+ elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE);
+ elm_object_cursor_unset(o);
+ elm_object_text_set(o, "unset");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_button_add(win);
+ elm_object_cursor_set(o, "hand4");
+ elm_object_text_set(o, "not existent");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ elm_config_cursor_engine_only_set(EINA_FALSE);
+ o = elm_button_add(win);
+ elm_object_cursor_set(o, "hand2");
+ elm_object_text_set(o, "hand 2 engine only config false");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ elm_config_cursor_engine_only_set(EINA_TRUE);
+ o = elm_button_add(win);
+ elm_object_cursor_set(o, "hand2");
+ elm_object_text_set(o, "hand 2 engine only config true");
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ o = elm_list_add(win);
+ elm_box_pack_end(bx, o);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ lit = elm_list_item_append(o, "cursor hand2 x", NULL, NULL, NULL, NULL);
+ elm_object_item_cursor_set(lit, ELM_CURSOR_HAND2);
+ lit = elm_list_item_append(o, "cursor hand2", NULL, NULL, NULL, NULL);
+ elm_object_item_cursor_set(lit, ELM_CURSOR_HAND2);
+ elm_object_item_cursor_engine_only_set(lit, EINA_FALSE);
+ lit = elm_list_item_append(o, "cursor hand3", NULL, NULL, NULL, NULL);
+ elm_object_item_cursor_set(lit, "hand3");
+ elm_object_item_cursor_engine_only_set(lit, EINA_FALSE);
+ lit = elm_list_item_append(o, "cursor hand3 transparent", NULL, NULL,
+ NULL, NULL);
+ elm_object_item_cursor_set(lit, "hand3");
+ elm_object_item_cursor_style_set(lit, "transparent");
+ elm_object_item_cursor_engine_only_set(lit, EINA_FALSE);
+ elm_list_go(o);
+ evas_object_show(o);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+void
+test_cursor4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *ly, *bt;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("cursor layout", "Cursor Layout");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ snprintf(buf, sizeof(buf), "%s/objects/cursors.edj", elm_app_data_dir_get());
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ ly = elm_layout_add(win);
+ elm_layout_file_set(ly, buf, "test/layout/events");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_cursor_set(ly, ELM_CURSOR_HAND1);
+ elm_box_pack_end(bx, ly);
+ evas_object_show(ly);
+
+ ly = elm_layout_add(win);
+ elm_layout_file_set(ly, buf, "test/layout/noevents");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_cursor_set(ly, ELM_CURSOR_XTERM);
+ elm_layout_part_cursor_set(ly, "top-left", ELM_CURSOR_CROSS);
+ elm_layout_part_cursor_set(ly, "bottom-left", ELM_CURSOR_PIRATE);
+ elm_box_pack_end(bx, ly);
+ evas_object_show(ly);
+
+ ly = elm_layout_add(win);
+ elm_layout_file_set(ly, buf, "test/layout/parts2");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_layout_part_cursor_set(ly, "top-left", ELM_CURSOR_CROSS);
+ elm_layout_part_cursor_set(ly, "bottom-left", ELM_CURSOR_PIRATE);
+ elm_box_pack_end(bx, ly);
+ evas_object_show(ly);
+
+ ly = elm_layout_add(win);
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_layout_file_set(ly, buf, "test/layout/swallow");
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Cursor over obj");
+ elm_object_part_content_set(ly, "swallow1", bt);
+ elm_object_cursor_set(bt, ELM_CURSOR_PIRATE);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Cursor over part");
+ elm_object_part_content_set(ly, "swallow2", bt);
+ elm_layout_part_cursor_set(ly, "swallow2", ELM_CURSOR_PIRATE);
+ elm_box_pack_end(bx, ly);
+ evas_object_show(ly);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_datetime.c b/src/bin/elementary/test_datetime.c
new file mode 100644
index 0000000000..8a8a199eff
--- /dev/null
+++ b/src/bin/elementary/test_datetime.c
@@ -0,0 +1,107 @@
+#ifdef HAVE_CONFIG_H
+#include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+/* A simple test, just displaying datetime in its default format */
+
+Evas_Object *dt1, *dt2, *dt3;
+
+static void
+_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("Datetime value is changed\n");
+}
+
+static void
+_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ time_t t;
+ struct tm new_time;
+
+ t = time(NULL);
+ localtime_r(&t, &new_time);
+
+ new_time.tm_year = 85;
+ new_time.tm_mon = 9;
+ new_time.tm_mday = 26;
+ new_time.tm_hour = 9;
+ new_time.tm_min = 0;
+ elm_datetime_field_visible_set(dt1, ELM_DATETIME_HOUR, EINA_TRUE);
+ elm_datetime_field_visible_set(dt1, ELM_DATETIME_MINUTE, EINA_TRUE);
+ elm_datetime_value_set(dt1, &new_time);
+ elm_object_disabled_set(dt1, EINA_TRUE);
+
+ elm_object_disabled_set(obj, EINA_TRUE);
+ evas_object_del(dt2);
+ evas_object_del(dt3);
+ dt2 = dt3 = NULL;
+}
+
+void
+test_datetime(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt;
+ time_t t;
+ struct tm time1;
+
+ win = elm_win_util_standard_add("datetime", "DateTime");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ elm_box_horizontal_set(bx, EINA_FALSE);
+ evas_object_show(bx);
+ evas_object_size_hint_min_set(bx, 360, 240);
+
+ dt1 = elm_datetime_add(bx);
+ evas_object_size_hint_weight_set(dt1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(dt1, EVAS_HINT_FILL, 0.5);
+ elm_datetime_field_visible_set(dt1, ELM_DATETIME_HOUR, EINA_FALSE);
+ elm_datetime_field_visible_set(dt1, ELM_DATETIME_MINUTE, EINA_FALSE);
+ elm_datetime_field_visible_set(dt1, ELM_DATETIME_AMPM, EINA_FALSE);
+ elm_box_pack_end(bx, dt1);
+ evas_object_show(dt1);
+
+ dt2 = elm_datetime_add(bx);
+ evas_object_size_hint_weight_set(dt2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(dt2, EVAS_HINT_FILL, 0.5);
+ elm_datetime_field_visible_set(dt2, ELM_DATETIME_YEAR, EINA_FALSE);
+ elm_datetime_field_visible_set(dt2, ELM_DATETIME_MONTH, EINA_FALSE);
+ elm_datetime_field_visible_set(dt2, ELM_DATETIME_DATE, EINA_FALSE);
+ elm_box_pack_end(bx, dt2);
+ elm_object_disabled_set(dt2, EINA_TRUE);
+ evas_object_show(dt2);
+
+ dt3 = elm_datetime_add(bx);
+ evas_object_size_hint_weight_set(dt3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(dt3, EVAS_HINT_FILL, 0.5);
+
+ // get the current local time
+ t = time(NULL);
+ localtime_r(&t, &time1);
+ // set the max year as 2030 and the remaining fields are equal to current time values
+ time1.tm_year = 130;
+ elm_datetime_value_max_set(dt3, &time1);
+ // set the min time limit as "1980 January 10th 02:30 PM"
+ time1.tm_year = 80;
+ time1.tm_mon = 4;
+ time1.tm_mday = 10;
+ time1.tm_hour = 14;
+ time1.tm_min = 30;
+ elm_datetime_value_min_set(dt3, &time1);
+ // minutes can be input only in between 15 and 45
+ elm_datetime_field_limit_set(dt3, ELM_DATETIME_MINUTE, 15, 45);
+ evas_object_smart_callback_add(dt3, "changed", _changed_cb, NULL);
+ elm_box_pack_end(bx, dt3);
+ evas_object_show(dt3);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Back to the future...");
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, NULL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_dayselector.c b/src/bin/elementary/test_dayselector.c
new file mode 100644
index 0000000000..16259e32fa
--- /dev/null
+++ b/src/bin/elementary/test_dayselector.c
@@ -0,0 +1,125 @@
+#ifdef HAVE_CONFIG_H
+#include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void _changed_cb(void* data EINA_UNUSED, Evas_Object* obj, void* event_info)
+{
+ char buf[256];
+ Elm_Dayselector_Day day = (Elm_Dayselector_Day) event_info;
+ Eina_Bool checked = elm_dayselector_day_selected_get(obj, day);
+
+ switch(day)
+ {
+ case ELM_DAYSELECTOR_SUN:
+ snprintf(buf, sizeof(buf), "%s", "Sun");
+ break;
+ case ELM_DAYSELECTOR_MON:
+ snprintf(buf, sizeof(buf), "%s", "Mon");
+ break;
+ case ELM_DAYSELECTOR_TUE:
+ snprintf(buf, sizeof(buf), "%s", "Tue");
+ break;
+ case ELM_DAYSELECTOR_WED:
+ snprintf(buf, sizeof(buf), "%s", "Wed");
+ break;
+ case ELM_DAYSELECTOR_THU:
+ snprintf(buf, sizeof(buf), "%s", "Thu");
+ break;
+ case ELM_DAYSELECTOR_FRI:
+ snprintf(buf, sizeof(buf), "%s", "Fri");
+ break;
+ case ELM_DAYSELECTOR_SAT:
+ snprintf(buf, sizeof(buf), "%s", "Sat");
+ break;
+ default:
+ snprintf(buf, sizeof(buf), "%s", "???");
+ break;
+ }
+ fprintf(stderr, "%s = %d\n", buf, checked);
+}
+
+void
+test_dayselector(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *dayselector, *monday;
+ Eina_List *weekdays_list;
+ const char *weekday;
+ const char *weekdays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
+ const char *weekdays2[] = {"S", "M", "T", "W", "T", "F", "S"};
+
+ win = elm_win_util_standard_add("dayselector", "Day Selector");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ // Default
+ dayselector = elm_dayselector_add(bx);
+ evas_object_size_hint_weight_set(dayselector, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(dayselector, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, dayselector);
+ evas_object_show(dayselector);
+ evas_object_smart_callback_add(dayselector, "dayselector,changed",
+ _changed_cb, NULL);
+
+ //Sunday first
+ dayselector = elm_dayselector_add(bx);
+ evas_object_size_hint_weight_set(dayselector, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(dayselector, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, dayselector);
+ evas_object_show(dayselector);
+ evas_object_smart_callback_add(dayselector, "dayselector,changed",
+ _changed_cb, NULL);
+ elm_dayselector_weekdays_names_set(dayselector, weekdays);
+ elm_dayselector_week_start_set(dayselector, ELM_DAYSELECTOR_SUN);
+
+ //Special Style
+ dayselector = elm_dayselector_add(bx);
+ evas_object_size_hint_weight_set(dayselector, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(dayselector, EVAS_HINT_FILL, 0.5);
+ elm_dayselector_week_start_set(dayselector, ELM_DAYSELECTOR_MON);
+ elm_box_pack_end(bx, dayselector);
+ evas_object_show(dayselector);
+ evas_object_smart_callback_add(dayselector, "dayselector,changed",
+ _changed_cb, NULL);
+ monday = elm_object_part_content_get(dayselector, "day0");
+ elm_object_signal_emit(monday, "elm,type,weekend,style1", "");
+
+ //Setting weekday name
+ dayselector = elm_dayselector_add(bx);
+ evas_object_size_hint_weight_set(dayselector, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(dayselector, EVAS_HINT_FILL, 0.5);
+ elm_dayselector_weekdays_names_set(dayselector, weekdays2);
+ elm_box_pack_end(bx, dayselector);
+ evas_object_show(dayselector);
+ evas_object_smart_callback_add(dayselector, "dayselector,changed",
+ _changed_cb, NULL);
+
+ weekdays_list = elm_dayselector_weekdays_names_get(dayselector);
+
+ fprintf(stderr, "User set weekday names to: ");
+ EINA_LIST_FREE(weekdays_list, weekday)
+ {
+ fprintf(stderr, "%s\n", weekday);
+ eina_stringshare_del(weekday);
+ }
+
+ //Disabled
+ dayselector = elm_dayselector_add(bx);
+ evas_object_size_hint_weight_set(dayselector, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(dayselector, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, dayselector);
+ evas_object_show(dayselector);
+ elm_object_disabled_set(dayselector, EINA_TRUE);
+
+ evas_object_resize(win, 350, 150);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_disable.c b/src/bin/elementary/test_disable.c
new file mode 100644
index 0000000000..3d5c6a8f90
--- /dev/null
+++ b/src/bin/elementary/test_disable.c
@@ -0,0 +1,207 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_disable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Eina_Bool status = EINA_FALSE;
+ status = elm_object_disabled_get(data);
+ elm_object_disabled_set(data, !status);
+}
+
+void
+test_box_disable(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt, *bx_out, *fr, *lb;
+ Evas_Object *btn[4];
+
+ win = elm_win_util_standard_add("box-enable/disable", "Box Enable/Disable");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx_out = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx_out);
+ evas_object_show(bx_out);
+
+ fr = elm_frame_add(bx_out);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_out, fr);
+ elm_object_text_set(fr, "Description");
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ lb = elm_label_add(bx);
+ elm_object_text_set(lb, "This test shows how enable/disable of Container widget works");
+ evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ btn[0] = elm_button_add(bx);
+ elm_object_text_set(btn[0], "Disable/Enable Box");
+ evas_object_size_hint_weight_set(btn[0], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn[0], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn[0]);
+ evas_object_show(btn[0]);
+
+ btn[1] = elm_button_add(bx);
+ elm_object_text_set(btn[1], "Disable/Enable Button 1");
+ evas_object_size_hint_weight_set(btn[1], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn[1], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn[1]);
+ evas_object_show(btn[1]);
+
+ btn[2] = elm_button_add(bx);
+ elm_object_text_set(btn[2], "Disable/Enable Button 2");
+ evas_object_size_hint_weight_set(btn[2], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn[2], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn[2]);
+ evas_object_show(btn[2]);
+
+ btn[3] = elm_button_add(bx);
+ elm_object_text_set(btn[3], "Disable/Enable Button 3");
+ evas_object_size_hint_weight_set(btn[3], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn[3], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn[3]);
+ evas_object_show(btn[3]);
+
+ bx = elm_box_add(bx_out);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_out, bx);
+ evas_object_show(bx);
+ evas_object_smart_callback_add(btn[0], "clicked", _disable_cb, bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(btn[1], "clicked", _disable_cb, bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(btn[2], "clicked", _disable_cb, bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 3");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(btn[3], "clicked", _disable_cb, bt);
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
+
+void
+test_layout_disable(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *ly, *bt;
+ Evas_Object *fr, *btn[4], *bx, *lb;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("layout", "Layout");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ fr = elm_frame_add(box);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, fr);
+ elm_object_text_set(fr, "Description");
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ lb = elm_label_add(bx);
+ elm_object_text_set(lb, "This test shows how enable/disable of Container widget works");
+ evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ btn[0] = elm_button_add(bx);
+ elm_object_text_set(btn[0], "Disable/Enable Layout");
+ evas_object_size_hint_weight_set(btn[0], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn[0], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn[0]);
+ evas_object_show(btn[0]);
+
+ btn[1] = elm_button_add(bx);
+ elm_object_text_set(btn[1], "Disable/Enable Button 1");
+ evas_object_size_hint_weight_set(btn[1], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn[1], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn[1]);
+ evas_object_show(btn[1]);
+
+ btn[2] = elm_button_add(bx);
+ elm_object_text_set(btn[2], "Disable/Enable Button 2");
+ evas_object_size_hint_weight_set(btn[2], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn[2], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn[2]);
+ evas_object_show(btn[2]);
+
+ btn[3] = elm_button_add(bx);
+ elm_object_text_set(btn[3], "Disable/Enable Button 3");
+ evas_object_size_hint_weight_set(btn[3], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn[3], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, btn[3]);
+ evas_object_show(btn[3]);
+
+ ly = elm_layout_add(win);
+
+ if (!elm_layout_theme_set(
+ ly, "layout", "application", "titlebar"))
+ fprintf(stderr, "Failed to set layout");
+
+ elm_object_part_text_set(ly, "elm.text", "Layout Disable/Enable Test");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, ly);
+ evas_object_show(ly);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "layout");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, ly);
+ evas_object_show(ly);
+ evas_object_smart_callback_add(btn[0], "clicked", _disable_cb, ly);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 1");
+ elm_object_part_content_set(ly, "element1", bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(btn[1], "clicked", _disable_cb, bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 2");
+ elm_object_part_content_set(ly, "element2", bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(btn[2], "clicked", _disable_cb, bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 3");
+ elm_object_part_content_set(ly, "element3", bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(btn[3], "clicked", _disable_cb, bt);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_diskselector.c b/src/bin/elementary/test_diskselector.c
new file mode 100644
index 0000000000..a6e14f7609
--- /dev/null
+++ b/src/bin/elementary/test_diskselector.c
@@ -0,0 +1,355 @@
+#include "test.h"
+#include <Elementary_Cursor.h>
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ void *box; /* Use this to get box content */
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ SCROLLER_POLICY_SET_ON,
+ SCROLLER_POLICY_SET_OFF,
+ BOUNCE_SET,
+ ITEM_LABEL_SET,
+ TOOLTIP_TEXT_SET,
+ ITEM_TOOLTIP_UNSET,
+ ITEM_CURSOR_SET,
+ ITEM_CURSOR_UNSET,
+ ITEM_ICON_SET,
+ SELECTED_SET,
+ ITEM_PREV_GET,
+ ITEM_DEL_NOT_SELECTED,
+ ITEM_DEL, /* delete when selected */
+ CLEAR,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+ const Eina_List *disks = elm_box_children_get(api->box);
+ if (!eina_list_count(disks))
+ return;
+
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case SCROLLER_POLICY_SET_ON: /* 0 */
+ { /* Get first disk */
+ Evas_Object *disk = eina_list_nth(disks, 0);
+ elm_scroller_policy_set(disk, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON);
+ }
+ break;
+
+ case SCROLLER_POLICY_SET_OFF: /* 1 */
+ { /* Get first disk */
+ Evas_Object *disk = eina_list_nth(disks, 0);
+ elm_scroller_policy_set(disk, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ }
+ break;
+
+ case BOUNCE_SET: /* 2 */
+ { /* Get second disk, cancel bounce */
+ Evas_Object *disk = eina_list_nth(disks, 1);
+ elm_scroller_bounce_set(disk, EINA_FALSE, EINA_FALSE);
+ }
+ break;
+
+ case ITEM_LABEL_SET: /* 3 */
+ elm_object_item_text_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), "Label from API");
+ break;
+
+ case TOOLTIP_TEXT_SET: /* 4 */
+ elm_object_item_tooltip_text_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), "Tooltip from API");
+ break;
+
+ case ITEM_TOOLTIP_UNSET: /* 5 */
+ elm_object_item_tooltip_unset(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)));
+ break;
+
+ case ITEM_CURSOR_SET: /* 6 */
+ elm_object_item_cursor_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), ELM_CURSOR_HAND2);
+ break;
+
+ case ITEM_CURSOR_UNSET: /* 7 */
+ elm_object_item_cursor_unset(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)));
+ break;
+
+ case ITEM_ICON_SET: /* 8 */
+ { /* Set icon of selected item in first disk */
+ char buf[PATH_MAX];
+ Evas_Object *ic = elm_icon_add(elm_object_parent_widget_get(eina_list_nth(disks, 0)));
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_object_item_part_content_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), NULL, ic);
+ evas_object_show(ic);
+ }
+ break;
+
+ case SELECTED_SET: /* 9 */
+ { /* Select NEXT item of third disk */
+ elm_diskselector_item_selected_set(elm_diskselector_last_item_get(eina_list_nth(disks, 1)), EINA_TRUE);
+ elm_diskselector_item_selected_set(elm_diskselector_item_next_get(elm_diskselector_selected_item_get(eina_list_nth(disks, 2))), EINA_TRUE);
+ }
+ break;
+
+ case ITEM_PREV_GET: /* 10 */
+ { /* Select PREV item of third disk */
+ elm_diskselector_item_selected_set(elm_diskselector_item_prev_get(elm_diskselector_selected_item_get(eina_list_nth(disks, 2))), EINA_TRUE);
+ }
+ break;
+
+ case ITEM_DEL_NOT_SELECTED: /* 11 */
+ { /* Remove selected item of third disk */
+ elm_object_item_del(elm_diskselector_item_prev_get(elm_diskselector_selected_item_get(eina_list_nth(disks, 2))));
+ }
+ break;
+
+ case ITEM_DEL: /* 12 */
+ { /* Remove selected item of first disk */
+ elm_object_item_del(elm_diskselector_selected_item_get(eina_list_nth(disks, 1)));
+ }
+ break;
+
+ case CLEAR: /* 13 */
+ elm_diskselector_clear(eina_list_nth(disks, 0));
+ break;
+
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+_disk_sel(void *data EINA_UNUSED, Evas_Object * obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *ds_it = event_info;
+ printf("Equinox: %s\n", elm_object_item_text_get(ds_it));
+}
+
+static void
+_disk_next(void *data EINA_UNUSED, Evas_Object * obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *next_ds_it, *prev_ds_it, *ds_it = event_info;
+ prev_ds_it = elm_diskselector_item_prev_get(ds_it);
+ next_ds_it = elm_diskselector_item_next_get(ds_it);
+ printf("Prev: %s, Next: %s\n", elm_object_item_text_get(prev_ds_it),
+ elm_object_item_text_get(next_ds_it));
+}
+
+static void
+_print_disk_info_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *ds_it = event_info;
+ printf("Selected label: %s\n", elm_object_item_text_get(ds_it));
+}
+
+static void
+_item_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *ds_it = event_info;
+ printf("Clicked label: %s\n", elm_object_item_text_get(ds_it));
+}
+
+static Evas_Object *
+_disk_create(Evas_Object *parent, Eina_Bool rnd)
+{
+ Elm_Object_Item *ds_it;
+ Evas_Object *di;
+
+ di = elm_diskselector_add(parent);
+
+ elm_diskselector_item_append(di, "January", NULL, NULL, NULL);
+ elm_diskselector_item_append(di, "February", NULL, _disk_next, NULL);
+ elm_diskselector_item_append(di, "March", NULL, _disk_sel, NULL);
+ elm_diskselector_item_append(di, "April", NULL, NULL, NULL);
+ elm_diskselector_item_append(di, "May", NULL, NULL, NULL);
+ elm_diskselector_item_append(di, "June", NULL, NULL, NULL);
+ elm_diskselector_item_append(di, "July", NULL, NULL, NULL);
+ ds_it = elm_diskselector_item_append(di, "August", NULL, NULL, NULL);
+ elm_diskselector_item_append(di, "September", NULL, _disk_sel, NULL);
+ elm_diskselector_item_append(di, "October", NULL, NULL, NULL);
+ elm_diskselector_item_append(di, "November", NULL, NULL, NULL);
+ elm_diskselector_item_append(di, "December", NULL, NULL, NULL);
+
+ elm_diskselector_item_selected_set(ds_it, EINA_TRUE);
+ elm_diskselector_round_enabled_set(di, rnd);
+
+ return di;
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_diskselector(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *disk, *ic, *bxx, *bt;
+ Elm_Object_Item *ds_it;
+ char buf[PATH_MAX];
+ api_data *api = calloc(1, sizeof(api_data));
+ int idx = 0;
+
+ char *month_list[] = {
+ "Jan", "Feb", "Mar",
+ "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep",
+ "Oct", "Nov", "Dec"
+ };
+ char date[3];
+
+ win = elm_win_util_standard_add("diskselector", "Disk Selector");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bt = elm_button_add(bxx);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+ elm_box_pack_end(bxx, bt);
+
+ bx = elm_box_add(bxx);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(bx);
+ elm_box_pack_end(bxx, bx);
+ api->box = bx;
+
+ disk = _disk_create(bx, EINA_TRUE);
+ evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, disk);
+ evas_object_show(disk);
+ evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL);
+ ds_it = elm_diskselector_selected_item_get(disk);
+ elm_diskselector_item_selected_set(ds_it, EINA_FALSE);
+
+ disk = _disk_create(bx, EINA_FALSE);
+ evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, disk);
+ evas_object_show(disk);
+ evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL);
+ ds_it = elm_diskselector_first_item_get(disk);
+ ds_it = elm_diskselector_item_next_get(ds_it);
+ elm_diskselector_item_selected_set(ds_it, EINA_TRUE);
+
+ disk = _disk_create(bx, EINA_FALSE);
+ evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, disk);
+ evas_object_show(disk);
+ evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL);
+ elm_diskselector_side_text_max_length_set(disk, 4);
+
+ disk = elm_diskselector_add(bx);
+ ic = elm_icon_add(disk);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_diskselector_item_append(disk, "Sunday", ic, NULL, NULL);
+ elm_diskselector_item_append(disk, "Monday", NULL, NULL, NULL);
+ elm_diskselector_item_append(disk, "Tuesday", NULL, NULL, NULL);
+ elm_diskselector_item_append(disk, "Wednesday", NULL, NULL, NULL);
+ elm_diskselector_item_append(disk, "Thursday", NULL, NULL, NULL);
+ elm_diskselector_item_append(disk, "Friday", NULL, NULL, NULL);
+ elm_diskselector_item_append(disk, "Saturday", NULL, NULL, NULL);
+ elm_diskselector_round_enabled_set(disk, EINA_TRUE);
+ evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, disk);
+ evas_object_show(disk);
+ evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL);
+
+ disk = elm_diskselector_add(bx);
+ ic = elm_icon_add(disk);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_diskselector_item_append(disk, "머리스타일", ic, NULL, NULL);
+ elm_diskselector_item_append(disk, "プロが伝授する", NULL, NULL, NULL);
+ elm_diskselector_item_append(disk, "生上访要求政府", NULL, NULL, NULL);
+ elm_diskselector_item_append(disk, "English", NULL, NULL, NULL);
+ elm_diskselector_item_append(disk, "والشريعة", NULL, NULL, NULL);
+ elm_diskselector_item_append(disk, "עִבְרִית", NULL, NULL, NULL);
+ elm_diskselector_item_append(disk, "Grüßen", NULL, NULL, NULL);
+ elm_diskselector_round_enabled_set(disk, EINA_TRUE);
+ evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, disk);
+ evas_object_show(disk);
+ evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL);
+
+ // displayed item number setting example
+ disk = elm_diskselector_add(bx);
+ elm_diskselector_display_item_num_set(disk, 5);
+ printf("Number of Items in DiskSelector : %d\n",
+ elm_diskselector_display_item_num_get(disk));
+
+ for (idx = 0; idx < (int)(sizeof(month_list) / sizeof(month_list[0])); idx++)
+ {
+ ds_it = elm_diskselector_item_append(disk, month_list[idx], NULL, NULL,
+ NULL);
+ }
+
+ elm_diskselector_item_selected_set(ds_it, EINA_TRUE);
+ elm_diskselector_round_enabled_set(disk, EINA_TRUE);
+ evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, disk);
+ evas_object_show(disk);
+ evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL);
+ evas_object_smart_callback_add(disk, "clicked", _item_clicked_cb, NULL);
+
+ // displayed item number setting example
+ disk = elm_diskselector_add(bx);
+ elm_diskselector_display_item_num_set(disk, 7);
+ printf("Number of Items in DiskSelector : %d\n",
+ elm_diskselector_display_item_num_get(disk));
+
+ for (idx = 1; idx < 31; idx++)
+ {
+ snprintf(date, sizeof(date), "%d", idx);
+ ds_it = elm_diskselector_item_append(disk, date, NULL, NULL, NULL);
+ }
+
+ elm_diskselector_item_selected_set(ds_it, EINA_TRUE);
+ elm_diskselector_round_enabled_set(disk, EINA_TRUE);
+ evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, disk);
+ evas_object_show(disk);
+ evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_dnd.c b/src/bin/elementary/test_dnd.c
new file mode 100644
index 0000000000..40c2c61c11
--- /dev/null
+++ b/src/bin/elementary/test_dnd.c
@@ -0,0 +1,1399 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define FILESEP "file://"
+#define FILESEP_LEN sizeof(FILESEP) - 1
+
+static const char *img[9] =
+{
+ "panel_01.jpg",
+ "plant_01.jpg",
+ "rock_01.jpg",
+ "rock_02.jpg",
+ "sky_01.jpg",
+ "sky_02.jpg",
+ "sky_03.jpg",
+ "sky_04.jpg",
+ "wood_01.jpg",
+};
+
+struct _anim_icon_st
+{
+ int start_x;
+ int start_y;
+ Evas_Object *o;
+};
+typedef struct _anim_icon_st anim_icon_st;
+
+struct _drag_anim_st
+{
+ Evas_Object *icwin;
+ Evas *e;
+ Evas_Coord mdx; /* Mouse-down x */
+ Evas_Coord mdy; /* Mouse-down y */
+ Eina_List *icons; /* List of icons to animate (anim_icon_st) */
+ Ecore_Timer *tm;
+ Ecore_Animator *ea;
+ Evas_Object *gl;
+};
+typedef struct _drag_anim_st drag_anim_st;
+
+#define DRAG_TIMEOUT 0.3
+#define ANIM_TIME 0.5
+
+static Eina_Bool _5s_cancel = EINA_FALSE;
+static Ecore_Timer *_5s_timeout = NULL;
+
+static int
+_item_ptr_cmp(const void *d1, const void *d2)
+{
+ return ((const char *) d1 - (const char *) d2);
+}
+
+static Elm_Genlist_Item_Class *itc1;
+static Elm_Gengrid_Item_Class *gic;
+
+static const char *
+_drag_data_build(Eina_List **items)
+{
+ const char *drag_data = NULL;
+ if (*items)
+ {
+ Eina_List *l;
+ Elm_Object_Item *it;
+ const char *t;
+ unsigned int len = 0;
+
+ EINA_LIST_FOREACH(*items, l, it)
+ {
+ t = (char *)elm_object_item_data_get(it);
+ if (t)
+ len += strlen(t);
+ }
+
+ drag_data = malloc(len + eina_list_count(*items) * (FILESEP_LEN + 1) + 1);
+ strcpy((char *) drag_data, "");
+
+ /* drag data in form: file://URI1\nfile://URI2\n */
+ EINA_LIST_FOREACH(*items, l, it)
+ {
+ t = (char *)elm_object_item_data_get(it);
+ if (t)
+ {
+ strcat((char *) drag_data, FILESEP);
+ strcat((char *) drag_data, t);
+ }
+ }
+ }
+ return drag_data;
+}
+
+static char *
+_drag_data_extract(char **drag_data)
+{
+ char *uri = NULL;
+ if (!drag_data)
+ return uri;
+
+ char *p = *drag_data;
+ if (!p)
+ return uri;
+ char *s = strstr(p, FILESEP);
+ if (s)
+ p += FILESEP_LEN;
+ s = strchr(p, '\n');
+ uri = p;
+ if (s)
+ {
+ if (s - p > 0)
+ {
+ char *s1 = s - 1;
+ if (s1[0] == '\r')
+ s1[0] = '\0';
+ else
+ {
+ char *s2 = s + 1;
+ if (s2[0] == '\r')
+ {
+ s[0] = '\0';
+ s++;
+ }
+ else
+ s[0] = '\0';
+ }
+ }
+ else
+ s[0] = '\0';
+ s++;
+ }
+ else
+ p = NULL;
+ *drag_data = s;
+
+ return uri;
+}
+
+static char *
+gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return strdup(data);
+}
+
+static Evas_Object *
+gl_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ if (!strcmp(part, "elm.swallow.icon"))
+ {
+ Evas_Object *icon = elm_icon_add(obj);
+ elm_image_file_set(icon, data, NULL);
+ evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_show(icon);
+ return icon;
+ }
+ return NULL;
+}
+
+static void
+gl_del_cb(void *data, Evas_Object *obj EINA_UNUSED)
+{
+ eina_stringshare_del(data);
+}
+
+static void
+_win_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("<%s> <%d> will del <%p>\n", __func__, __LINE__, data);
+ elm_drop_item_container_del(data);
+ elm_drag_item_container_del(data);
+
+ if (gic) elm_gengrid_item_class_free(gic);
+ gic = NULL;
+ if (itc1) elm_genlist_item_class_free(itc1);
+ itc1 = NULL;
+}
+
+static Elm_Object_Item *
+_gl_item_getcb(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *xposret EINA_UNUSED, int *yposret)
+{ /* This function returns pointer to item under (x,y) coords */
+ printf("<%s> <%d> obj=<%p>\n", __func__, __LINE__, obj);
+ Elm_Object_Item *gli;
+ gli = elm_genlist_at_xy_item_get(obj, x, y, yposret);
+ if (gli)
+ printf("over <%s>, gli=<%p> yposret %i\n",
+ (char *)elm_object_item_data_get(gli), gli, *yposret);
+ else
+ printf("over none, yposret %i\n", *yposret);
+ return gli;
+}
+
+static Elm_Object_Item *
+_grid_item_getcb(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *xposret, int *yposret)
+{ /* This function returns pointer to item under (x,y) coords */
+ printf("<%s> <%d> obj=<%p>\n", __func__, __LINE__, obj);
+ Elm_Object_Item *item;
+ item = elm_gengrid_at_xy_item_get(obj, x, y, xposret, yposret);
+ if (item)
+ printf("over <%s>, item=<%p> xposret %i yposret %i\n",
+ (char *)elm_object_item_data_get(item), item, *xposret, *yposret);
+ else
+ printf("over none, xposret %i yposret %i\n", *xposret, *yposret);
+ return item;
+}
+
+static inline char *
+_strndup(const char *str, size_t len)
+{
+ size_t slen = strlen(str);
+ char *ret;
+
+ if (slen > len) slen = len;
+ ret = malloc (slen + 1);
+ if (!ret) return NULL;
+
+ if (slen > 0) memcpy(ret, str, slen);
+ ret[slen] = '\0';
+ return ret;
+}
+
+static void
+_gl_poscb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, Evas_Coord x, Evas_Coord y, int xposret, int yposret, Elm_Xdnd_Action action EINA_UNUSED)
+{
+ printf("<%s> <%d> obj: %p, item: %p <%s>, x y: %d %d, posret: %d %d\n",
+ __func__, __LINE__, obj, it, elm_object_item_text_get(it),
+ x, y, xposret, yposret);
+}
+
+static Eina_Bool
+_gl_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, Elm_Selection_Data *ev, int xposret EINA_UNUSED, int yposret)
+{ /* This function is called when data is dropped on the genlist */
+ printf("<%s> <%d> str=<%s>\n", __func__, __LINE__, (char *) ev->data);
+ if (!ev->data)
+ return EINA_FALSE;
+ if (ev->len <= 0)
+ return EINA_FALSE;
+
+ char *dd = _strndup(ev->data, ev->len);
+ if (!dd) return EINA_FALSE;
+ char *p = dd;
+
+ char *s = _drag_data_extract(&p);
+ while (s)
+ {
+ switch(yposret)
+ {
+ case -1: /* Dropped on top-part of the it item */
+ {
+ elm_genlist_item_insert_before(obj,
+ itc1, strdup(s), NULL, it,
+ ELM_GENLIST_ITEM_NONE,
+ NULL, NULL);
+ break;
+ }
+ case 0: /* Dropped on center of the it item */
+ case 1: /* Dropped on botton-part of the it item */
+ {
+ if (!it) it = elm_genlist_last_item_get(obj);
+ if (it) it = elm_genlist_item_insert_after(obj,
+ itc1, strdup(s), NULL, it,
+ ELM_GENLIST_ITEM_NONE,
+ NULL, NULL);
+ else
+ it = elm_genlist_item_append(obj,
+ itc1, strdup(s), NULL,
+ ELM_GENLIST_ITEM_NONE,
+ NULL, NULL);
+ break;
+ }
+ default:
+ {
+ free(dd);
+ return EINA_FALSE;
+ }
+ }
+
+ s = _drag_data_extract(&p);
+ }
+ free(dd);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_grid_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, Elm_Selection_Data *ev, int xposret EINA_UNUSED, int yposret EINA_UNUSED)
+{ /* This function is called when data is dropped on the genlist */
+ printf("<%s> <%d> str=<%s>\n", __func__, __LINE__, (char *) ev->data);
+ if (!ev->data)
+ return EINA_FALSE;
+ if (ev->len <= 0)
+ return EINA_FALSE;
+
+ char *dd = _strndup(ev->data, ev->len);
+ if (!dd) return EINA_FALSE;
+ char *p = dd;
+ char *s = _drag_data_extract(&p);
+ while(s)
+ {
+ if (it)
+ it = elm_gengrid_item_insert_after(obj, gic, eina_stringshare_add(s), it, NULL, NULL);
+ else
+ it = elm_gengrid_item_append(obj, gic, eina_stringshare_add(s), NULL, NULL);
+ s = _drag_data_extract(&p);
+ }
+ free(dd);
+
+ return EINA_TRUE;
+}
+
+static void _gl_obj_mouse_move( void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _gl_obj_mouse_up( void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+static void
+anim_st_free(drag_anim_st *anim_st)
+{ /* Stops and free mem of ongoing animation */
+ printf("<%s> <%d>\n", __func__, __LINE__);
+ if (anim_st)
+ {
+ evas_object_event_callback_del_full
+ (anim_st->gl, EVAS_CALLBACK_MOUSE_MOVE, _gl_obj_mouse_move, anim_st);
+ evas_object_event_callback_del_full
+ (anim_st->gl, EVAS_CALLBACK_MOUSE_UP, _gl_obj_mouse_up, anim_st);
+ if (anim_st->tm)
+ {
+ ecore_timer_del(anim_st->tm);
+ anim_st->tm = NULL;
+ }
+
+ if (anim_st->ea)
+ {
+ ecore_animator_del(anim_st->ea);
+ anim_st->ea = NULL;
+ }
+
+ anim_icon_st *st;
+
+ EINA_LIST_FREE(anim_st->icons, st)
+ {
+ evas_object_hide(st->o);
+ evas_object_del(st->o);
+ free(st);
+ }
+
+ free(anim_st);
+ }
+}
+
+static Eina_Bool
+_drag_anim_play(void *data, double pos)
+{ /* Impl of the animation of icons, called on frame time */
+ drag_anim_st *anim_st = data;
+ printf("<%s> <%d>\n", __func__, __LINE__);
+ Eina_List *l;
+ anim_icon_st *st;
+
+ if (anim_st)
+ {
+ if (pos > 0.99)
+ {
+ anim_st->ea = NULL; /* Avoid deleting on mouse up */
+
+ EINA_LIST_FOREACH(anim_st->icons, l, st)
+ evas_object_hide(st->o); /* Hide animated icons */
+ anim_st_free(anim_st);
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ EINA_LIST_FOREACH(anim_st->icons, l, st)
+ {
+ int x, y, w, h;
+ Evas_Coord xm, ym;
+ evas_object_geometry_get(st->o, NULL, NULL, &w, &h);
+ evas_pointer_canvas_xy_get(anim_st->e, &xm, &ym);
+ x = st->start_x + (pos * (xm - (st->start_x + (w/2))));
+ y = st->start_y + (pos * (ym - (st->start_y + (h/2))));
+ evas_object_move(st->o, x, y);
+ }
+
+ return ECORE_CALLBACK_RENEW;
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_gl_anim_start(void *data)
+{ /* Start icons animation before actually drag-starts */
+ drag_anim_st *anim_st = data;
+ printf("<%s> <%d>\n", __func__, __LINE__);
+ int yposret = 0;
+
+ Eina_List *l;
+ Eina_List *items = eina_list_clone(elm_genlist_selected_items_get(anim_st->gl));
+ Elm_Object_Item *gli = elm_genlist_at_xy_item_get(anim_st->gl,
+ anim_st->mdx, anim_st->mdy, &yposret);
+ if (gli)
+ { /* Add the item mouse is over to the list if NOT seleced */
+ void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli);
+ if (!p)
+ items = eina_list_append(items, gli);
+ }
+
+ EINA_LIST_FOREACH(items, l, gli)
+ { /* Now add icons to animation window */
+ Evas_Object *o = elm_object_item_part_content_get(gli,
+ "elm.swallow.icon");
+
+ if (o)
+ {
+ int w, h;
+ const char *f;
+ const char *g;
+ anim_icon_st *st = calloc(1, sizeof(*st));
+ elm_image_file_get(o, &f, &g);
+ Evas_Object *ic = elm_icon_add(anim_st->gl);
+ elm_image_file_set(ic, f, g);
+ evas_object_geometry_get(o, &st->start_x, &st->start_y, &w, &h);
+ evas_object_size_hint_align_set(ic,
+ EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(ic,
+ EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ evas_object_move(ic, st->start_x, st->start_y);
+ evas_object_resize(ic, w, h);
+ evas_object_show(ic);
+
+ st->o = ic;
+ anim_st->icons = eina_list_append(anim_st->icons, st);
+ }
+ }
+
+ eina_list_free(items);
+
+ anim_st->tm = NULL;
+ anim_st->ea = ecore_animator_timeline_add(DRAG_TIMEOUT,
+ _drag_anim_play, anim_st);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_gl_obj_mouse_up(
+ void *data,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{ /* Cancel any drag waiting to start on timeout */
+ drag_anim_st *anim_st = data;
+ anim_st_free(anim_st);
+}
+
+static void
+_gl_obj_mouse_move(
+ void *data,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{ /* Cancel any drag waiting to start on timeout */
+
+ if (((Evas_Event_Mouse_Move *)event_info)->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ {
+ drag_anim_st *anim_st = data;
+ anim_st_free(anim_st);
+ }
+}
+
+static void
+_gl_obj_mouse_down(
+ void *data,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{ /* Launch a timer to start drag animation */
+ Evas_Event_Mouse_Down *ev = event_info;
+ drag_anim_st *anim_st = calloc(1, sizeof(*anim_st));
+ anim_st->e = e;
+ anim_st->mdx = ev->canvas.x;
+ anim_st->mdy = ev->canvas.y;
+ anim_st->gl = data;
+ anim_st->tm = ecore_timer_add(DRAG_TIMEOUT, _gl_anim_start, anim_st);
+ evas_object_event_callback_add(data, EVAS_CALLBACK_MOUSE_UP,
+ _gl_obj_mouse_up, anim_st);
+ evas_object_event_callback_add(data, EVAS_CALLBACK_MOUSE_MOVE,
+ _gl_obj_mouse_move, anim_st);
+}
+/* END - Handling drag start animation */
+
+static void
+_gl_dragdone(void *data, Evas_Object *obj EINA_UNUSED, Eina_Bool doaccept)
+{
+ printf("<%s> <%d> data=<%p> doaccept=<%d>\n",
+ __func__, __LINE__, data, doaccept);
+
+ Elm_Object_Item *it;
+ Eina_List *l;
+
+ if (_5s_cancel)
+ {
+ ecore_timer_del(_5s_timeout);
+ _5s_timeout = NULL;
+ }
+
+ if (doaccept)
+ { /* Remove items dragged out (accepted by target) */
+ EINA_LIST_FOREACH(data, l, it)
+ elm_object_item_del(it);
+ }
+
+ eina_list_free(data);
+ return;
+}
+
+static Eina_Bool
+_5s_timeout_gone(void *data)
+{
+ printf("Cancel DnD\n");
+ elm_drag_cancel(data);
+ _5s_timeout = NULL;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Evas_Object *
+_gl_createicon(void *data, Evas_Object *win, Evas_Coord *xoff, Evas_Coord *yoff)
+{
+ printf("<%s> <%d>\n", __func__, __LINE__);
+ Evas_Object *icon = NULL;
+ Evas_Object *o = elm_object_item_part_content_get(data, "elm.swallow.icon");
+
+ if (o)
+ {
+ int xm, ym, w = 30, h = 30;
+ const char *f;
+ const char *g;
+ elm_image_file_get(o, &f, &g);
+ evas_pointer_canvas_xy_get(evas_object_evas_get(o), &xm, &ym);
+ if (xoff) *xoff = xm - (w/2);
+ if (yoff) *yoff = ym - (h/2);
+ icon = elm_icon_add(win);
+ elm_image_file_set(icon, f, g);
+ evas_object_size_hint_align_set(icon,
+ EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(icon,
+ EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ if (xoff && yoff) evas_object_move(icon, *xoff, *yoff);
+ evas_object_resize(icon, w, h);
+ }
+
+ return icon;
+}
+
+static Eina_List *
+_gl_icons_get(void *data)
+{ /* Start icons animation before actually drag-starts */
+ printf("<%s> <%d>\n", __func__, __LINE__);
+ int yposret = 0;
+
+ Eina_List *l;
+
+ Eina_List *icons = NULL;
+
+ Evas_Coord xm, ym;
+ evas_pointer_canvas_xy_get(evas_object_evas_get(data), &xm, &ym);
+ Eina_List *items = eina_list_clone(elm_genlist_selected_items_get(data));
+ Elm_Object_Item *gli = elm_genlist_at_xy_item_get(data,
+ xm, ym, &yposret);
+ if (gli)
+ { /* Add the item mouse is over to the list if NOT seleced */
+ void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli);
+ if (!p)
+ items = eina_list_append(items, gli);
+ }
+
+ EINA_LIST_FOREACH(items, l, gli)
+ { /* Now add icons to animation window */
+ Evas_Object *o = elm_object_item_part_content_get(gli,
+ "elm.swallow.icon");
+
+ if (o)
+ {
+ int x, y, w, h;
+ const char *f, *g;
+ elm_image_file_get(o, &f, &g);
+ Evas_Object *ic = elm_icon_add(data);
+ elm_image_file_set(ic, f, g);
+ evas_object_geometry_get(o, &x, &y, &w, &h);
+ evas_object_size_hint_align_set(ic,
+ EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(ic,
+ EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ evas_object_move(ic, x, y);
+ evas_object_resize(ic, w, h);
+ evas_object_show(ic);
+
+ icons = eina_list_append(icons, ic);
+ }
+ }
+
+ eina_list_free(items);
+ return icons;
+}
+
+static const char *
+_gl_get_drag_data(Evas_Object *obj, Elm_Object_Item *it, Eina_List **items)
+{ /* Construct a string of dragged info, user frees returned string */
+ const char *drag_data = NULL;
+ printf("<%s> <%d>\n", __func__, __LINE__);
+
+ *items = eina_list_clone(elm_genlist_selected_items_get(obj));
+ if (it)
+ { /* Add the item mouse is over to the list if NOT seleced */
+ void *p = eina_list_search_unsorted(*items, _item_ptr_cmp, it);
+ if (!p)
+ *items = eina_list_append(*items, it);
+ }
+ drag_data = _drag_data_build(items);
+ printf("<%s> <%d> Sending <%s>\n", __func__, __LINE__, drag_data);
+
+ return drag_data;
+}
+
+static const char *
+_grid_get_drag_data(Evas_Object *obj, Elm_Object_Item *it, Eina_List **items)
+{ /* Construct a string of dragged info, user frees returned string */
+ const char *drag_data = NULL;
+ printf("<%s> <%d>\n", __func__, __LINE__);
+
+ *items = eina_list_clone(elm_gengrid_selected_items_get(obj));
+ if (it)
+ { /* Add the item mouse is over to the list if NOT seleced */
+ void *p = eina_list_search_unsorted(*items, _item_ptr_cmp, it);
+ if (!p)
+ *items = eina_list_append(*items, it);
+ }
+ drag_data = _drag_data_build(items);
+ printf("<%s> <%d> Sending <%s>\n", __func__, __LINE__, drag_data);
+
+ return drag_data;
+}
+
+static Eina_Bool
+_gl_dnd_default_anim_data_getcb(Evas_Object *obj, /* The genlist object */
+ Elm_Object_Item *it,
+ Elm_Drag_User_Info *info)
+{ /* This called before starting to drag, mouse-down was on it */
+ info->format = ELM_SEL_FORMAT_TARGETS;
+ info->createicon = _gl_createicon;
+ info->createdata = it;
+ info->icons = _gl_icons_get(obj);
+ info->dragdone = _gl_dragdone;
+
+ /* Now, collect data to send for drop from ALL selected items */
+ /* Save list pointer to remove items after drop and free list on done */
+ info->data = _gl_get_drag_data(obj, it, (Eina_List **) &info->donecbdata);
+ printf("%s - data = %s\n", __FUNCTION__, info->data);
+ info->acceptdata = info->donecbdata;
+
+ if (info->data)
+ return EINA_TRUE;
+ else
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+_gl_data_getcb(Evas_Object *obj, /* The genlist object */
+ Elm_Object_Item *it,
+ Elm_Drag_User_Info *info)
+{ /* This called before starting to drag, mouse-down was on it */
+ info->format = ELM_SEL_FORMAT_TARGETS;
+ info->createicon = _gl_createicon;
+ info->createdata = it;
+ info->dragdone = _gl_dragdone;
+
+ /* Now, collect data to send for drop from ALL selected items */
+ /* Save list pointer to remove items after drop and free list on done */
+ info->data = _gl_get_drag_data(obj, it, (Eina_List **) &info->donecbdata);
+ info->acceptdata = info->donecbdata;
+
+ if (info->data)
+ return EINA_TRUE;
+ else
+ return EINA_FALSE;
+}
+
+static Eina_List *
+_grid_icons_get(void *data)
+{ /* Start icons animation before actually drag-starts */
+ printf("<%s> <%d>\n", __func__, __LINE__);
+
+ Eina_List *l;
+
+ Eina_List *icons = NULL;
+
+ Evas_Coord xm, ym;
+ evas_pointer_canvas_xy_get(evas_object_evas_get(data), &xm, &ym);
+ Eina_List *items = eina_list_clone(elm_gengrid_selected_items_get(data));
+ Elm_Object_Item *gli = elm_gengrid_at_xy_item_get(data,
+ xm, ym, NULL, NULL);
+ if (gli)
+ { /* Add the item mouse is over to the list if NOT seleced */
+ void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli);
+ if (!p)
+ items = eina_list_append(items, gli);
+ }
+
+ EINA_LIST_FOREACH(items, l, gli)
+ { /* Now add icons to animation window */
+ Evas_Object *o = elm_object_item_part_content_get(gli,
+ "elm.swallow.icon");
+
+ if (o)
+ {
+ int x, y, w, h;
+ const char *f, *g;
+ elm_image_file_get(o, &f, &g);
+ Evas_Object *ic = elm_icon_add(data);
+ elm_image_file_set(ic, f, g);
+ evas_object_geometry_get(o, &x, &y, &w, &h);
+ evas_object_size_hint_align_set(ic,
+ EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(ic,
+ EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ evas_object_move(ic, x, y);
+ evas_object_resize(ic, w, h);
+ evas_object_show(ic);
+
+ icons = eina_list_append(icons, ic);
+ }
+ }
+
+ eina_list_free(items);
+ return icons;
+}
+
+static void
+_gl_dragstart(void *data EINA_UNUSED, Evas_Object *obj)
+{
+ printf("<%s> <%d>\n", __func__, __LINE__);
+ if (_5s_cancel)
+ _5s_timeout = ecore_timer_add(5.0, _5s_timeout_gone, obj);
+}
+
+static Eina_Bool
+_grid_data_getcb(Evas_Object *obj, /* The genlist object */
+ Elm_Object_Item *it,
+ Elm_Drag_User_Info *info)
+{
+ /* This called before starting to drag, mouse-down was on it */
+ info->format = ELM_SEL_FORMAT_TARGETS;
+ info->createicon = _gl_createicon;
+ info->createdata = it;
+ info->dragstart = _gl_dragstart;
+ info->icons = _grid_icons_get(obj);
+ info->dragdone = _gl_dragdone;
+
+ /* Now, collect data to send for drop from ALL selected items */
+ /* Save list pointer to remove items after drop and free list on done */
+ info->data = _grid_get_drag_data(obj, it, (Eina_List **) &info->donecbdata);
+ printf("%s %d- data = %s\n", __FUNCTION__, __LINE__, info->data);
+ info->acceptdata = info->donecbdata;
+
+ if (info->data)
+ return EINA_TRUE;
+ else
+ return EINA_FALSE;
+}
+
+void
+test_dnd_genlist_default_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ Evas_Object *win, *gl, *bxx, *bx2, *lb;
+ int i, j;
+
+ win = elm_win_util_standard_add("dnd-genlist-default-anim", "DnD-Genlist-Default-Anim");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bxx = elm_box_add(win);
+ elm_box_horizontal_set(bxx, EINA_FALSE);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Drag and drop between genlists with default anim.");
+ evas_object_size_hint_min_set(lb, 0, 50);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.5);
+ evas_object_show(lb);
+ elm_box_pack_end(bxx, lb);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bx2);
+ elm_box_pack_end(bxx, bx2);
+
+ itc1 = elm_genlist_item_class_new();
+ itc1->item_style = "default";
+ itc1->func.text_get = gl_text_get;
+ itc1->func.content_get = gl_content_get;
+ itc1->func.del = NULL;
+
+ for (j = 0; j < 2; j++)
+ {
+ gl = elm_genlist_add(win);
+
+ /* START Drag and Drop handling */
+ evas_object_smart_callback_add(win, "delete,request", _win_del, gl);
+ elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */
+ elm_drop_item_container_add(gl,
+ ELM_SEL_FORMAT_TARGETS,
+ _gl_item_getcb,
+ NULL, NULL,
+ NULL, NULL,
+ _gl_poscb, NULL,
+ _gl_dropcb, NULL);
+
+ elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT,
+ _gl_item_getcb, _gl_dnd_default_anim_data_getcb);
+
+ // FIXME: This causes genlist to resize the horiz axis very slowly :(
+ // Reenable this and resize the window horizontally, then try to resize it back
+ //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, gl);
+ evas_object_show(gl);
+
+ for (i = 0; i < 20; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
+ const char *path = eina_stringshare_add(buf);
+ elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ }
+ }
+
+ evas_object_resize(win, 680, 800);
+ evas_object_show(win);
+}
+
+void
+test_dnd_genlist_user_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ Evas_Object *win, *gl, *bxx;
+ int i, j;
+
+ win = elm_win_util_standard_add("dnd-genlist-user-anim", "DnD-Genlist-User-Anim");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bxx = elm_box_add(win);
+ elm_box_horizontal_set(bxx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ itc1 = elm_genlist_item_class_new();
+ itc1->item_style = "default";
+ itc1->func.text_get = gl_text_get;
+ itc1->func.content_get = gl_content_get;
+ itc1->func.del = NULL;
+
+ for (j = 0; j < 2; j++)
+ {
+ gl = elm_genlist_add(win);
+
+ /* START Drag and Drop handling */
+ evas_object_smart_callback_add(win, "delete,request", _win_del, gl);
+ elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */
+ elm_drop_item_container_add(gl,
+ ELM_SEL_FORMAT_TARGETS,
+ _gl_item_getcb,
+ NULL, NULL,
+ NULL, NULL,
+ NULL, NULL,
+ _gl_dropcb, NULL);
+
+ elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT,
+ _gl_item_getcb, _gl_data_getcb);
+
+ /* We add mouse-down, up callbacks to start/stop drag animation */
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN,
+ _gl_obj_mouse_down, gl);
+ /* END Drag and Drop handling */
+
+ // FIXME: This causes genlist to resize the horiz axis very slowly :(
+ // Reenable this and resize the window horizontally, then try to resize it back
+ //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bxx, gl);
+ evas_object_show(gl);
+
+ for (i = 0; i < 20; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
+ const char *path = eina_stringshare_add(buf);
+ elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ }
+ }
+
+ evas_object_resize(win, 680, 800);
+ evas_object_show(win);
+}
+
+void
+test_dnd_genlist_gengrid(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ Evas_Object *win, *bxx;
+ int i;
+
+ win = elm_win_util_standard_add("dnd-genlist-gengrid", "DnD-Genlist-Gengrid");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bxx = elm_box_add(win);
+ elm_box_horizontal_set(bxx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ {
+ itc1 = elm_genlist_item_class_new();
+ itc1->item_style = "default";
+ itc1->func.text_get = gl_text_get;
+ itc1->func.content_get = gl_content_get;
+ itc1->func.del = NULL;
+
+ Evas_Object *gl = elm_genlist_add(win);
+ evas_object_smart_callback_add(win, "delete,request", _win_del, gl);
+
+ /* START Drag and Drop handling */
+ elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */
+ elm_drop_item_container_add(gl, ELM_SEL_FORMAT_TARGETS, _gl_item_getcb, NULL, NULL,
+ NULL, NULL, NULL, NULL, _gl_dropcb, NULL);
+
+ elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT,
+ _gl_item_getcb, _gl_dnd_default_anim_data_getcb);
+ /* END Drag and Drop handling */
+
+ // FIXME: This causes genlist to resize the horiz axis very slowly :(
+ // Reenable this and resize the window horizontally, then try to resize it back
+ //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bxx, gl);
+ evas_object_show(gl);
+
+ for (i = 0; i < 20; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
+ const char *path = eina_stringshare_add(buf);
+ elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ }
+ }
+
+ {
+ Evas_Object *grid = elm_gengrid_add(win);
+ evas_object_smart_callback_add(win, "delete,request", _win_del, grid);
+ elm_gengrid_item_size_set(grid,
+ ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150));
+ elm_gengrid_horizontal_set(grid, EINA_FALSE);
+ elm_gengrid_reorder_mode_set(grid, EINA_FALSE);
+ elm_gengrid_multi_select_set(grid, EINA_TRUE); /* We allow multi drag */
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ gic = elm_gengrid_item_class_new();
+ gic->item_style = "default";
+ gic->func.text_get = gl_text_get;
+ gic->func.content_get = gl_content_get;
+ gic->func.del = gl_del_cb;
+
+ elm_drop_item_container_add(grid, ELM_SEL_FORMAT_TARGETS, _grid_item_getcb, NULL, NULL,
+ NULL, NULL, NULL, NULL, _grid_dropcb, NULL);
+
+ elm_drag_item_container_add(grid, ANIM_TIME, DRAG_TIMEOUT,
+ _grid_item_getcb, _grid_data_getcb);
+ for (i = 0; i < 20; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
+ const char *path = eina_stringshare_add(buf);
+ elm_gengrid_item_append(grid, gic, path, NULL, NULL);
+ }
+ elm_box_pack_end(bxx, grid);
+ evas_object_show(grid);
+ }
+
+ evas_object_resize(win, 680, 800);
+ evas_object_show(win);
+}
+
+static Eina_Bool _drop_box_button_new_cb(void *data, Evas_Object *obj, Elm_Selection_Data *ev)
+{
+ Evas_Object *win = data;
+ if (ev->len <= 0)
+ return EINA_FALSE;
+
+ char *dd = _strndup(ev->data, ev->len);
+ if (!dd) return EINA_FALSE;
+ char *p = dd;
+ char *s = _drag_data_extract(&p);
+ while (s)
+ {
+ Evas_Object *ic = elm_icon_add(win);
+ elm_image_file_set(ic, s, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ Evas_Object *bt = elm_button_add(win);
+ elm_object_text_set(bt, "Dropped button");
+ elm_object_part_content_set(bt, "icon", ic);
+ elm_box_pack_end(obj, bt);
+ evas_object_show(bt);
+ evas_object_show(ic);
+ s = _drag_data_extract(&p);
+ }
+ free(dd);
+
+ return EINA_TRUE;
+}
+
+void _enter_but_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
+{
+ printf("Entered %s - drop it here and I will never print this line anymore.\n", __FUNCTION__);
+}
+
+static Eina_Bool _drop_but_icon_change_cb(void *data, Evas_Object *obj, Elm_Selection_Data *ev)
+{
+ Evas_Object *win = data;
+ Evas_Object *ic;
+ if (ev->len <= 0)
+ return EINA_FALSE;
+
+ char *dd = _strndup(ev->data, ev->len);
+ if (!dd) return EINA_FALSE;
+ char *p = dd;
+ char *s = _drag_data_extract(&p);
+ ic = elm_icon_add(win);
+ elm_image_file_set(ic, s, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_del(elm_object_part_content_get(obj, "icon"));
+ elm_object_part_content_set(obj, "icon", ic);
+ evas_object_show(ic);
+ free(dd);
+
+ return EINA_TRUE;
+}
+
+/* Callback used to test multi-callbacks feature */
+static Eina_Bool _drop_but_cb_remove_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev EINA_UNUSED)
+{
+ printf("Second callback called - removing it\n");
+ elm_drop_target_del(obj, ELM_SEL_FORMAT_TARGETS, _enter_but_cb, NULL, NULL, NULL, NULL, NULL, _drop_but_cb_remove_cb, NULL);
+ return EINA_TRUE;
+}
+
+static Eina_Bool _drop_bg_change_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev)
+{
+ if (ev->len <= 0)
+ return EINA_FALSE;
+
+ char *dd = _strndup(ev->data, ev->len);
+ if (!dd) return EINA_FALSE;
+ char *p = dd;
+ char *s = _drag_data_extract(&p);
+ elm_bg_file_set(obj, s, NULL);
+ free(dd);
+
+ return EINA_TRUE;
+}
+
+static void
+_5s_cancel_ck_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ _5s_cancel = elm_check_state_get(obj);
+}
+
+void
+test_dnd_multi_features(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ Evas_Object *win, *bxx, *bg;
+ int i;
+
+ win = elm_win_util_standard_add("dnd-multi-features", "DnD-Multi Features");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_drop_target_add(bg, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_bg_change_cb, NULL);
+ elm_win_resize_object_add(win, bg);
+
+ /* And show the background. */
+ evas_object_show(bg);
+ bxx = elm_box_add(win);
+ elm_box_horizontal_set(bxx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ {
+ Evas_Object *grid = elm_gengrid_add(bxx);
+ evas_object_smart_callback_add(win, "delete,request", _win_del, grid);
+ elm_gengrid_item_size_set(grid,
+ ELM_SCALE_SIZE(100), ELM_SCALE_SIZE(100));
+ elm_gengrid_horizontal_set(grid, EINA_FALSE);
+ elm_gengrid_reorder_mode_set(grid, EINA_FALSE);
+ elm_gengrid_multi_select_set(grid, EINA_TRUE); /* We allow multi drag */
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ gic = elm_gengrid_item_class_new();
+ gic->item_style = "default";
+ gic->func.text_get = gl_text_get;
+ gic->func.content_get = gl_content_get;
+
+ elm_drag_item_container_add(grid, ANIM_TIME, DRAG_TIMEOUT,
+ _grid_item_getcb, _grid_data_getcb);
+ for (i = 0; i < 10; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
+ const char *path = eina_stringshare_add(buf);
+ elm_gengrid_item_append(grid, gic, path, NULL, NULL);
+ }
+ elm_box_pack_end(bxx, grid);
+ evas_object_show(grid);
+ }
+
+ {
+ Evas_Object *ic, *bt;
+ Evas_Object *vert_box = elm_box_add(bxx);
+ evas_object_size_hint_weight_set(vert_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bxx, vert_box);
+ evas_object_show(vert_box);
+ elm_drop_target_add(vert_box, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_box_button_new_cb, win);
+
+ _5s_cancel = EINA_FALSE;
+ Evas_Object *ck = elm_check_add(vert_box);
+ elm_object_style_set(ck, "toggle");
+ elm_object_text_set(ck, "Cancel after 5s:");
+ elm_check_state_set(ck, _5s_cancel);
+ evas_object_smart_callback_add(ck, "changed", _5s_cancel_ck_changed, NULL);
+ elm_box_pack_end(vert_box, ck);
+ evas_object_show(ck);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Multi-callbacks check");
+ elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_but_icon_change_cb, win);
+ elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, _enter_but_cb, NULL, NULL, NULL, NULL, NULL, _drop_but_cb_remove_cb, NULL);
+ elm_object_part_content_set(bt, "icon", ic);
+ elm_box_pack_end(vert_box, bt);
+ evas_object_show(bt);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Drop into me to change my icon");
+ elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_but_icon_change_cb, win);
+ elm_object_part_content_set(bt, "icon", ic);
+ elm_box_pack_end(vert_box, bt);
+ evas_object_show(bt);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "No action on drop");
+ elm_object_part_content_set(bt, "icon", ic);
+ elm_box_pack_end(vert_box, bt);
+ evas_object_show(bt);
+ evas_object_show(ic);
+ }
+ evas_object_resize(win, 680, 800);
+ evas_object_show(win);
+}
+
+static void
+_enter_cb(void *data EINA_UNUSED, Evas_Object *obj)
+{
+ printf("%s: obj: %s %p enter\n", __func__,
+ evas_object_type_get(obj), obj);
+}
+
+static void
+_leave_cb(void *data EINA_UNUSED, Evas_Object *obj)
+{
+ printf("%s: obj: %s %p leave\n", __func__,
+ evas_object_type_get(obj), obj);
+}
+
+static void
+_pos_cb(void *data EINA_UNUSED, Evas_Object *obj, Evas_Coord x, Evas_Coord y, Elm_Xdnd_Action action)
+{
+ printf("%s: obj: %s %p pos: %d %d, action: %d\n", __func__,
+ evas_object_type_get(obj), obj, x, y, action);
+}
+
+static Eina_Bool
+_label_drop_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev)
+{
+ const char *text = ev->data;
+ printf("%s: obj: %s %p drop data: %s\n", __func__,
+ evas_object_type_get(obj), obj, text);
+ elm_object_text_set(obj, text);
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_image_drop_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev)
+{
+ const char *f = ev->data;
+ printf("%s: obj: %s %p drop data: %s\n", __func__,
+ evas_object_type_get(obj), obj, f);
+ elm_image_file_set(obj, f, NULL);
+ return EINA_TRUE;
+}
+
+static Evas_Object *
+_label_create_icon(void *data, Evas_Object *parent, Evas_Coord *xoff, Evas_Coord *yoff)
+{
+ Evas_Object *lb = data;
+ Evas_Object *icon;
+ const char *text;
+ Evas_Coord x, y, w, h;
+ int xm, ym;
+
+ icon = elm_label_add(parent);
+ text = elm_object_text_get(lb);
+ elm_object_text_set(icon, text);
+
+ evas_object_geometry_get(lb, &x, &y, &w, &h);
+ evas_object_move(icon, x, y);
+ evas_object_resize(icon, w, h);
+ evas_object_show(icon);
+
+ evas_pointer_canvas_xy_get(evas_object_evas_get(lb), &xm, &ym);
+ if (xoff) *xoff = xm - (w / 2);
+ if (yoff) *yoff = ym - (h / 2);
+
+ return icon;
+}
+
+static void
+_label_drag_done_cb(void *data, Evas_Object *obj EINA_UNUSED)
+{
+ free(data);
+}
+
+static void
+_label_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *lb = data;
+ const char *mkup = elm_object_text_get(lb);
+ char *text = evas_textblock_text_markup_to_utf8(NULL, mkup);
+
+ if (!text)
+ {
+ printf("Cannot convert text\n");
+ }
+ elm_drag_start(lb, ELM_SEL_FORMAT_TEXT, text, ELM_XDND_ACTION_COPY,
+ _label_create_icon, lb,
+ NULL, NULL, NULL, NULL,
+ _label_drag_done_cb, text);
+}
+
+static Evas_Object *
+_image_create_icon(void *data, Evas_Object *parent, Evas_Coord *xoff, Evas_Coord *yoff)
+{
+ Evas_Object *ic;
+ Evas_Object *io = data;
+ const char *f, *g;
+ Evas_Coord x, y, w, h, xm, ym;
+
+ elm_image_file_get(io, &f, &g);
+ ic = elm_image_add(parent);
+ elm_image_file_set(ic, f, g);
+ evas_object_geometry_get(io, &x, &y, &w, &h);
+ evas_object_move(ic, x, y);
+ evas_object_resize(ic, 60, 60);
+ evas_object_show(ic);
+
+ evas_pointer_canvas_xy_get(evas_object_evas_get(io), &xm, &ym);
+ if (xoff) *xoff = xm - 30;
+ if (yoff) *yoff = ym - 30;
+
+ return ic;
+}
+
+static void
+_image_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *io = data;
+ const char *f;
+ char dd[PATH_MAX];
+
+ elm_image_file_get(io, &f, NULL);
+ snprintf(dd, sizeof(dd), "file://%s", f);
+
+ elm_drag_start(io, ELM_SEL_FORMAT_IMAGE, dd, ELM_XDND_ACTION_COPY,
+ _image_create_icon, io,
+ NULL, NULL, NULL, NULL, NULL, NULL);
+}
+
+void
+test_dnd_types(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx1, *lb, *io, *en;
+ int i;
+
+ win = elm_win_util_standard_add("dnd-types", "DnD types");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ for(i = 0; i < 2; i++)
+ {
+ char buf[PATH_MAX];
+ bx1 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx1, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bx1);
+ evas_object_show(bx1);
+
+ lb = elm_label_add(win);
+ if (i == 0)
+ elm_object_text_set(lb, "This is an label.<br/>You can drag or drop text here.<br/>"
+ "This is a larger label with newlines<br/>"
+ "to make it bigger, bit it won't expand or wrap<br/>"
+ "just be a block of text that can't change its<br/>"
+ "formatting as it's fixed based on text<br/>");
+ else
+ elm_object_text_set(lb, "Another label for drag and drop test.<br/>"
+ "A small label. You can drag or drop text.<br/><br/><br/>");
+ elm_drop_target_add(lb, ELM_SEL_FORMAT_TEXT,
+ _enter_cb, NULL,
+ _leave_cb, NULL,
+ _pos_cb, NULL,
+ _label_drop_cb, NULL);
+ evas_object_event_callback_add(lb, EVAS_CALLBACK_MOUSE_DOWN, _label_mouse_down_cb, lb);
+ elm_box_pack_end(bx1, lb);
+ evas_object_show(lb);
+
+ en = elm_entry_add(win);
+ if (i == 0)
+ {
+ elm_object_text_set(en,
+ "Entry:<br/>You can only drop <b>text</> here.<br/>"
+ "This is an entry widget in this window that<br/>"
+ "uses markup <b>like this</> for styling.");
+ elm_entry_cnp_mode_set(en, ELM_CNP_MODE_PLAINTEXT);
+ }
+ else
+ {
+ elm_object_text_set(en,
+ "Entry:<br/>You can drop <b>text or image</> here.<br/>"
+ "This is an entry widget in this window that<br/>"
+ "uses markup <b>like this</> for styling.");
+
+ }
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx1, en);
+ evas_object_show(en);
+
+ if (i == 0)
+ snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
+ else
+ snprintf(buf, sizeof(buf), "%s/images/rock_02.jpg", elm_app_data_dir_get());
+ io = elm_image_add(win);
+ elm_image_file_set(io, buf, NULL);
+ evas_object_size_hint_weight_set(io, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(io, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_min_set(io, 100, 100);
+ elm_drop_target_add(io, ELM_SEL_FORMAT_IMAGE,
+ _enter_cb, NULL,
+ _leave_cb, NULL,
+ _pos_cb, NULL,
+ _image_drop_cb, NULL);
+ evas_object_event_callback_add(io, EVAS_CALLBACK_MOUSE_DOWN, _image_mouse_down_cb, io);
+ elm_box_pack_end(bx1, io);
+ evas_object_show(io);
+ }
+
+ evas_object_show(win);
+ evas_object_resize(win, 400, 400);
+}
diff --git a/src/bin/elementary/test_eio.c b/src/bin/elementary/test_eio.c
new file mode 100644
index 0000000000..51118b7f17
--- /dev/null
+++ b/src/bin/elementary/test_eio.c
@@ -0,0 +1,245 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#ifdef HAVE_SYS_TIMES_H
+# include <sys/times.h>
+#endif
+
+#ifdef _WIN32
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# endif
+# include <windows.h>
+# undef WIN32_LEAN_AND_MEAN
+#endif
+
+#include <Eio.h>
+
+#include <Elementary.h>
+
+static Elm_Genlist_Item_Class it_eio;
+
+#ifdef _WIN32
+ULONGLONG st_time_kernel;
+ULONGLONG st_time_user;
+ULONGLONG en_time_kernel;
+ULONGLONG en_time_user;
+#else
+static clock_t st_time;
+static clock_t en_time;
+static struct tms st_cpu;
+static struct tms en_cpu;
+#endif
+
+static void _sel_file(void *data, Evas_Object *obj, void *event_info);
+static Eina_Bool _ls_filter_cb(void *data, Eio_File *handler, const char *file);
+static void _ls_main_cb(void *data, Eio_File *handler, const char *file);
+static void _ls_done_cb(void *data, Eio_File *handler);
+static void _ls_error_cb(void *data, Eio_File *handler, int error);
+static void _file_chosen(void *data, Evas_Object *obj, void *event_info);
+static char *_gl_text_get(void *data, Evas_Object *obj, const char *part);
+static Evas_Object *_gl_content_get(void *data, Evas_Object *obj, const char *part);
+static Eina_Bool _gl_state_get(void *data, Evas_Object *obj, const char *part);
+static void _gl_del(void *data, Evas_Object *obj);
+static void _test_eio_clear(void *data, Evas_Object *obj, void *event);
+
+static void
+_sel_file(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+}
+
+static Eina_Bool
+_ls_filter_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, const char *file EINA_UNUSED)
+{
+ return EINA_TRUE;
+}
+
+static int
+_compare_cb(const void *data1, const void *data2)
+{
+ Elm_Object_Item *it = (Elm_Object_Item *)data1;
+ Elm_Object_Item *it2 = (Elm_Object_Item *)data2;
+ return strcoll(elm_object_item_data_get(it),
+ elm_object_item_data_get(it2));
+}
+
+static void
+_ls_main_cb(void *data, Eio_File *handler EINA_UNUSED, const char *file)
+{
+ elm_genlist_item_sorted_insert(data,
+ &it_eio,
+ eina_stringshare_add(file),
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ _compare_cb,
+ _sel_file,
+ NULL);
+}
+
+static void
+_ls_done_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED)
+{
+#ifdef _WIN32
+ FILETIME tc;
+ FILETIME te;
+ FILETIME tk;
+ FILETIME tu;
+ ULARGE_INTEGER time_kernel;
+ ULARGE_INTEGER time_user;
+
+ if (!GetProcessTimes(GetCurrentProcess(),
+ &tc, &te, &tk, &tu))
+ return;
+
+ time_kernel.u.LowPart = tk.dwLowDateTime;
+ time_kernel.u.HighPart = tk.dwHighDateTime;
+ en_time_kernel = time_kernel.QuadPart;
+
+ time_user.u.LowPart = tu.dwLowDateTime;
+ time_user.u.HighPart = tu.dwHighDateTime;
+ en_time_user = time_user.QuadPart;
+
+ fprintf(stderr, "ls done\n");
+ fprintf(stderr, "Kernel Time: %lld, User Time: %lld",
+ (en_time_kernel - st_time_kernel),
+ (en_time_user - st_time_user));
+#else
+ en_time = times(&en_cpu);
+ fprintf(stderr, "ls done\n");
+ fprintf(stderr, "Real Time: %.jd, User Time: %.jd, System Time: %.jd\n",
+ (intmax_t)(en_time - st_time),
+ (intmax_t)(en_cpu.tms_utime - st_cpu.tms_utime),
+ (intmax_t)(en_cpu.tms_stime - st_cpu.tms_stime));
+#endif
+}
+
+static void
+_ls_error_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, int error)
+{
+ fprintf(stderr, "error: [%s]\n", strerror(error));
+}
+
+static void
+_file_chosen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ const char *file = event_info;
+ if (file)
+ {
+#ifdef _WIN32
+ FILETIME tc;
+ FILETIME te;
+ FILETIME tk;
+ FILETIME tu;
+ ULARGE_INTEGER time_kernel;
+ ULARGE_INTEGER time_user;
+
+ if (!GetProcessTimes(GetCurrentProcess(),
+ &tc, &te, &tk, &tu))
+ return;
+
+ time_kernel.u.LowPart = tk.dwLowDateTime;
+ time_kernel.u.HighPart = tk.dwHighDateTime;
+ st_time_kernel = time_kernel.QuadPart;
+
+ time_user.u.LowPart = tu.dwLowDateTime;
+ time_user.u.HighPart = tu.dwHighDateTime;
+ st_time_user = time_user.QuadPart;
+#else
+ st_time = times(&st_cpu);
+#endif
+ eio_file_ls(file,
+ _ls_filter_cb,
+ _ls_main_cb,
+ _ls_done_cb,
+ _ls_error_cb,
+ data);
+ }
+}
+
+static char *
+_gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "Item # %s", (char*)data);
+ return strdup(buf);
+}
+
+static Evas_Object *
+_gl_content_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return NULL;
+}
+
+static Eina_Bool
+_gl_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+static void
+_gl_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
+{
+}
+
+static void
+_test_eio_clear(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ elm_genlist_clear(data);
+}
+
+void
+test_eio(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *vbox, *hbox, *ic, *bt, *fs_bt, *gl;
+
+ it_eio.item_style = "default";
+ it_eio.func.text_get = _gl_text_get;
+ it_eio.func.content_get = _gl_content_get;
+ it_eio.func.state_get = _gl_state_get;
+ it_eio.func.del = _gl_del;
+
+ win = elm_win_util_standard_add("fileselector-button", "File Selector Button");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ vbox = elm_box_add(win);
+ evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, vbox);
+ evas_object_show(vbox);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(vbox, gl);
+ evas_object_show(gl);
+
+ /* file selector button */
+ hbox = elm_box_add(win);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "file");
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ fs_bt = elm_fileselector_button_add(win);
+ elm_object_text_set(fs_bt, "Select a dir");
+ elm_object_part_content_set(fs_bt, "icon", ic);
+ elm_fileselector_button_inwin_mode_set(fs_bt, EINA_TRUE);
+ elm_fileselector_folder_only_set(fs_bt, EINA_TRUE);
+
+ elm_box_pack_end(hbox, fs_bt);
+ elm_box_pack_end(vbox, hbox);
+ evas_object_show(fs_bt);
+ evas_object_show(ic);
+
+ /* attribute setting buttons */
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "clear");
+ evas_object_smart_callback_add(bt, "clicked", _test_eio_clear, gl);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+ evas_object_show(hbox);
+
+ evas_object_smart_callback_add(fs_bt, "file,chosen", _file_chosen, gl);
+
+ evas_object_resize(win, 300, 500);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_entry.c b/src/bin/elementary/test_entry.c
new file mode 100644
index 0000000000..1a56d000e4
--- /dev/null
+++ b/src/bin/elementary/test_entry.c
@@ -0,0 +1,2716 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#define EO_BETA_API
+#include <Elementary.h>
+
+static void
+my_entry_bt_1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_object_text_set(en, "");
+}
+
+static void
+my_entry_bt_2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ const char *s = elm_object_text_get(en);
+ printf("ENTRY:\n");
+ if (s) printf("%s\n", s);
+ printf("ENTRY PLAIN UTF8:\n");
+ if (s)
+ {
+ s = elm_entry_markup_to_utf8(s);
+ if (s)
+ {
+ printf("%s\n", s);
+ free((char *)s);
+ }
+ }
+}
+
+static void
+my_entry_bt_3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ const char *s = elm_entry_selection_get(en);
+ int start = 0, end = 0;
+ elm_entry_select_region_get(en, &start, &end);
+ printf("SELECTION REGION: %d - %d\n", start, end);
+ printf("SELECTION:\n");
+ if (s) printf("%s\n", s);
+ printf("SELECTION PLAIN UTF8:\n");
+ if (s)
+ {
+ s = elm_entry_markup_to_utf8(s);
+ if (s)
+ {
+ printf("%s\n", s);
+ free((char *)s);
+ }
+ }
+}
+
+static void
+my_entry_bt_4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_entry_insert(en, "Insert some <b>BOLD</> text");
+}
+
+static void
+my_entry_bt_5(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_scrollable_set(en, !elm_entry_scrollable_get(en));
+}
+
+static void
+my_entry_bt_6(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ static Elm_Wrap_Type wr = ELM_WRAP_NONE;
+
+ wr++;
+ if (wr == ELM_WRAP_LAST) wr = ELM_WRAP_NONE;
+ printf("wr: %i\n", wr);
+ elm_entry_line_wrap_set(en, wr);
+}
+
+static void
+my_entry_bt_7(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_editable_set(en, !elm_entry_editable_get(en));
+}
+
+static void
+changed_cb1(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ck = data;
+ printf("ck %p to %i\n", obj, elm_check_state_get(obj));
+ elm_config_context_menu_disabled_set(elm_check_state_get(obj));
+ printf("ck2 %p is now %i\n", ck, elm_check_state_get(ck));
+}
+
+void
+test_entry(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *bt, *en, *ck;
+ char buf[4096];
+
+ win = elm_win_util_standard_add("entry", "Entry");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ en = elm_entry_add(win);
+ elm_entry_line_wrap_set(en, ELM_WRAP_NONE);
+ snprintf(buf, sizeof(buf),
+ "This is an entry widget in this window that<br/>"
+ "uses markup <b>like this</> for styling and<br/>"
+ "formatting <em>like this</>, as well as<br/>"
+ "<a href=X><link>links in the text</></a>, so enter text<br/>"
+ "in here to edit it. By the way, links are<br/>"
+ "called <a href=anc-02>Anchors</a> so you will need<br/>"
+ "to refer to them this way.<br/>"
+ "<br/>"
+
+ "Also you can stick in items with (relsize + ascent): "
+ "<item relsize=16x16 vsize=ascent href=emoticon/evil-laugh></item>"
+ " (full) "
+ "<item relsize=16x16 vsize=full href=emoticon/guilty-smile></item>"
+ " (to the left)<br/>"
+
+ "Also (size + ascent): "
+ "<item size=16x16 vsize=ascent href=emoticon/haha></item>"
+ " (full) "
+ "<item size=16x16 vsize=full href=emoticon/happy-panting></item>"
+ " (before this)<br/>"
+
+ "And as well (absize + ascent): "
+ "<item absize=64x64 vsize=ascent href=emoticon/knowing-grin></item>"
+ " (full) "
+ "<item absize=64x64 vsize=full href=emoticon/not-impressed></item>"
+ " or even paths to image files on disk too like: "
+ "<item absize=96x128 vsize=full href=file://%s/images/sky_01.jpg></item>"
+ " ... end."
+ , elm_app_data_dir_get()
+ );
+ elm_object_text_set(en, buf);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+ elm_object_focus_set(en, EINA_TRUE);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Clr");
+ evas_object_smart_callback_add(bt, "clicked", my_entry_bt_1, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Prnt");
+ evas_object_smart_callback_add(bt, "clicked", my_entry_bt_2, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Sel");
+ evas_object_smart_callback_add(bt, "clicked", my_entry_bt_3, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Ins");
+ evas_object_smart_callback_add(bt, "clicked", my_entry_bt_4, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Scrl");
+ evas_object_smart_callback_add(bt, "clicked", my_entry_bt_5, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Wr");
+ evas_object_smart_callback_add(bt, "clicked", my_entry_bt_6, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Edit");
+ evas_object_smart_callback_add(bt, "clicked", my_entry_bt_7, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Context Menu Disable");
+ evas_object_smart_callback_add(ck, "changed", changed_cb1, ck);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_show(win);
+}
+
+static void
+my_scrolled_entry_bt_1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_object_text_set(en, "");
+}
+
+static void
+my_scrolled_entry_bt_2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ const char *s = elm_object_text_get(en);
+ printf("ENTRY:\n");
+ if (s) printf("%s\n", s);
+ printf("ENTRY PLAIN UTF8:\n");
+ if (s)
+ {
+ s = elm_entry_markup_to_utf8(s);
+ if (s)
+ {
+ printf("%s\n", s);
+ free((char *)s);
+ }
+ }
+}
+
+static void
+my_scrolled_entry_bt_3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ const char *s = elm_entry_selection_get(en);
+ int start = 0, end = 0;
+ elm_entry_select_region_get(en, &start, &end);
+ printf("SELECTION REGION: %d - %d\n", start, end);
+ printf("SELECTION:\n");
+ if (s) printf("%s\n", s);
+ printf("SELECTION PLAIN UTF8:\n");
+ if (s)
+ {
+ s = elm_entry_markup_to_utf8(s);
+ if (s)
+ {
+ printf("%s\n", s);
+ free((char *)s);
+ }
+ }
+}
+
+static void
+my_scrolled_entry_bt_4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_entry_insert(en, "Insert some <b>BOLD</> text");
+}
+
+static void
+my_scrolled_entry_bt_5(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ const char *s = elm_object_text_get(en);
+ printf("PASSWORD: '%s'\n", s ? s : "");
+}
+
+static void
+scrolled_anchor_test(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_entry_insert(en, "ANCHOR CLICKED");
+}
+
+static void
+_item_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Entry_Context_Menu_Item *item = (Elm_Entry_Context_Menu_Item *)event_info;
+ printf("\ncurrent selected text = %s\n", elm_entry_context_menu_item_label_get(item));
+}
+
+static void
+_entry_rejected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Entry_Filter_Accept_Set *accept_set = data;
+
+ if (!accept_set) return;
+
+ if (accept_set->accepted)
+ printf("REJECTED: This entry only accepts the following character set: [%s]\n", accept_set->accepted);
+ else
+ printf("REJECTED: This entry rejects the following character set: [%s]\n", accept_set->rejected);
+}
+
+static void
+_end_show_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_end_visible_set(en, EINA_TRUE);
+}
+
+static void
+_end_hide_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_end_visible_set(en, EINA_FALSE);
+}
+
+static Eina_Bool
+_context_menu_show_cb(void *data EINA_UNUSED, const Eo_Event *event)
+{
+ elm_entry_context_menu_clear(event->obj);
+ elm_entry_context_menu_item_add(event->obj, "MenuD1", NULL, ELM_ICON_NONE, _item_cb, NULL);
+ elm_entry_context_menu_item_add(event->obj, "MenuD2", NULL, ELM_ICON_NONE, _item_cb, NULL);
+ return EO_CALLBACK_CONTINUE;
+}
+
+void
+test_entry_scrolled(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *bx3, *bx4, *bt, *en, *en_p, *sp, *entry, *label;
+ static Elm_Entry_Filter_Accept_Set digits_filter_data, digits_filter_data2;
+ static Elm_Entry_Filter_Limit_Size limit_filter_data, limit_filter_data2;
+
+ win = elm_win_util_standard_add("entry-scrolled", "Entry Scrolled");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ /* disabled entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_object_text_set(en, "Disabled entry");
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_object_disabled_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ /* entry with guide */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_object_part_text_set(en, "guide", "This string is guide");
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ /* password entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_password_set(en, EINA_TRUE);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_object_text_set(en, "Access denied, give up!");
+ elm_object_disabled_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ /* multi-line disable entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON);
+ elm_object_disabled_set(en, EINA_TRUE);
+ elm_entry_context_menu_item_add(en, "Hello", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_entry_context_menu_item_add(en, "World", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_object_text_set(en,
+ "Multi-line disabled entry widget :)<br/>"
+ "We can use markup <b>like this</> for styling and<br/>"
+ "formatting <em>like this</>, as well as<br/>"
+ "<a href=X><link>links in the text</></a>,"
+ "but it won't be editable or clickable.");
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ /* Single line selected entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(en, "This is a single line");
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_entry_select_all(en);
+ elm_entry_context_menu_item_add(en, "Menu1", NULL, ELM_ICON_NONE, _item_cb, NULL);
+ elm_entry_context_menu_item_add(en, "Menu2", NULL, ELM_ICON_NONE, _item_cb, NULL);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ /* Only digits entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(en, "01234");
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ digits_filter_data.accepted = "0123456789";
+ digits_filter_data.rejected = NULL;
+ elm_entry_markup_filter_append(en, elm_entry_filter_accept_set, &digits_filter_data);
+ evas_object_smart_callback_add(en, "rejected", _entry_rejected_cb, &digits_filter_data);
+
+ /* No digits entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(en, "No numbers here");
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ digits_filter_data2.accepted = NULL;
+ digits_filter_data2.rejected = "0123456789";
+ elm_entry_markup_filter_append(en, elm_entry_filter_accept_set, &digits_filter_data2);
+ evas_object_smart_callback_add(en, "rejected", _entry_rejected_cb, &digits_filter_data2);
+
+ /* Size limited entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(en, "Just 20 chars");
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ limit_filter_data.max_char_count = 20;
+ limit_filter_data.max_byte_count = 0;
+ elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data);
+
+ /* Byte size limited entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(en, "And now only 30 bytes");
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ limit_filter_data2.max_char_count = 0;
+ limit_filter_data2.max_byte_count = 30;
+ elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data2);
+
+ /* Single line password entry */
+ en_p = elm_entry_add(win);
+ elm_entry_scrollable_set(en_p, EINA_TRUE);
+ evas_object_size_hint_weight_set(en_p, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en_p, EVAS_HINT_FILL, 0.5);
+ elm_scroller_policy_set(en_p, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_object_text_set(en_p, "Password here");
+ elm_entry_single_line_set(en_p, EINA_TRUE);
+ elm_entry_password_set(en_p, EINA_TRUE);
+ evas_object_show(en_p);
+ elm_box_pack_end(bx, en_p);
+
+ /* Last password show entry */
+ bx4 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx4, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bx4);
+
+ label = elm_label_add(bx4);
+ elm_object_text_set(label, "<b>Last password show entry</b>");
+ evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx4, label);
+ evas_object_show(label);
+
+ en = elm_entry_add(bx4);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_password_set(en, EINA_TRUE);
+ elm_object_text_set(en, "Last password show");
+ elm_entry_single_line_set(en, EINA_TRUE);
+ edje_password_show_last_set(EINA_TRUE);
+ edje_password_show_last_timeout_set(-1);
+ evas_object_show(en);
+
+ elm_box_pack_end(bx4, en);
+ elm_box_pack_end(bx, bx4);
+
+ /* entry with icon/end widgets */
+ entry = elm_entry_add(win);
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ bt = elm_icon_add(win);
+ elm_icon_standard_set(bt, "home");
+ evas_object_size_hint_min_set(bt, 48, 48);
+ evas_object_color_set(bt, 128, 0, 0, 128);
+ evas_object_show(bt);
+ elm_object_part_content_set(entry, "icon", bt);
+ bt = elm_icon_add(win);
+ elm_icon_standard_set(bt, "delete");
+ evas_object_color_set(bt, 128, 0, 0, 128);
+ evas_object_size_hint_min_set(bt, 48, 48);
+ evas_object_show(bt);
+ elm_object_part_content_set(entry, "end", bt);
+ elm_object_text_set(entry, "entry with icon and end objects. For the test of show/hide end, text should be long long...");
+ evas_object_show(entry);
+ elm_box_pack_end(bx, entry);
+
+ /* markup entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON);
+ elm_object_text_set(en,
+ "This is an entry widget in this window that<br/>"
+ "uses markup <b>like this</> for styling and<br/>"
+ "formatting <em>like this</>, as well as<br/>"
+ "<a href=X><link>links in the text</></a>, so enter text<br/>"
+ "in here to edit it. By them way, links are<br/>"
+ "called <a href=anc-02>Anchors</a> so you will need<br/>"
+ "to refer to them this way. At the end here is a really long "
+ "line to test line wrapping to see if it works. But just in "
+ "case this line is not long enough I will add more here to "
+ "really test it out, as Elementary really needs some "
+ "good testing to see if entry widgets work as advertised.");
+ evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+ eo_event_callback_add(en, ELM_ENTRY_EVENT_CONTEXT_OPEN, _context_menu_show_cb, NULL);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Clear");
+ evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_1, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Print");
+ evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_2, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Print pwd");
+ evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_5, en_p);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Selection");
+ evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_3, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Insert");
+ evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_4, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx3 = elm_box_add(win);
+ elm_box_horizontal_set(bx3, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "End Show");
+ evas_object_smart_callback_add(bt, "clicked", _end_show_cb, entry);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx3, bt);
+ elm_object_focus_allow_set(bt, 0);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "End Hide");
+ evas_object_smart_callback_add(bt, "clicked", _end_hide_cb, entry);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx3, bt);
+ elm_object_focus_allow_set(bt, 0);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx3);
+ evas_object_show(bx3);
+
+ elm_object_focus_set(win, EINA_TRUE);
+ evas_object_resize(win, 320, 500);
+ evas_object_show(win);
+}
+
+static void
+my_ent_bt_clr(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_object_text_set(en, "");
+}
+
+static void
+my_ent_bt_pri(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ const char *s = elm_object_text_get(en);
+ printf("ENTRY:\n");
+ if (s) printf("%s\n", s);
+ printf("ENTRY PLAIN UTF8:\n");
+ if (s)
+ {
+ s = elm_entry_markup_to_utf8(s);
+ if (s)
+ {
+ printf("%s\n", s);
+ free((char *)s);
+ }
+ }
+}
+
+static void
+my_ent_bt_sel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ const char *s = elm_entry_selection_get(en);
+ int start = 0, end = 0;
+ elm_entry_select_region_get(en, &start, &end);
+ printf("SELECTION REGION: %d - %d\n", start, end);
+ printf("SELECTION:\n");
+ if (s) printf("%s\n", s);
+ printf("SELECTION PLAIN UTF8:\n");
+ if (s)
+ {
+ s = elm_entry_markup_to_utf8(s);
+ if (s)
+ {
+ printf("%s\n", s);
+ free((char *)s);
+ }
+ }
+}
+
+static void
+my_ent_bt_all(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_select_all(en);
+}
+
+static void
+my_ent_bt_non(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_select_none(en);
+}
+
+static void
+my_ent_bt_region(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_select_region_set(en, 10, 16);
+}
+
+static void
+my_ent_bt_ins(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_entry_insert(en, "Insert text");
+}
+
+static void
+my_ent_bt_lef(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_cursor_prev(en);
+}
+
+static void
+my_ent_bt_rig(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_cursor_next(en);
+}
+
+static void
+my_ent_bt_up_(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_cursor_up(en);
+}
+
+static void
+my_ent_bt_dow(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_cursor_down(en);
+}
+
+static void
+my_ent_bt_beg(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_cursor_begin_set(en);
+}
+
+static void
+my_ent_bt_end(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_cursor_end_set(en);
+}
+
+static void
+my_ent_bt_lbe(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_cursor_line_begin_set(en);
+}
+
+static void
+my_ent_bt_len(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_cursor_line_end_set(en);
+}
+
+static void
+my_ent_bt_sbe(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_cursor_selection_begin(en);
+}
+
+static void
+my_ent_bt_sen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_cursor_selection_end(en);
+}
+
+static void
+my_ent_bt_fmt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ printf("IS FORMAT: %i\n",
+ (int)elm_entry_cursor_is_format_get(en));
+}
+
+static void
+my_ent_bt_vfm(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ printf("IS VISIBLE FORMAT %i\n",
+ (int)elm_entry_cursor_is_visible_format_get(en));
+}
+
+static void
+my_ent_bt_chr(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ printf("CHAR '%s'\n", elm_entry_cursor_content_get(en));
+}
+
+static void
+my_ent_bt_cut(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_selection_cut(en);
+}
+
+static void
+my_ent_bt_cop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_selection_copy(en);
+}
+
+static void
+my_ent_bt_pas(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_selection_paste(en);
+}
+
+static char *user_style =
+ "DEFAULT='font_size=16 color=#F00'"
+ "em='+ backing=on backing_color=#FFF'"
+ "grn='+ color=#0F0'"
+ "ul='+ underline=on underline_color=#AAA'";
+
+static void
+ent_bt_style_user_peek(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ const char* cur_style = elm_entry_text_style_user_peek(en);
+ if (cur_style)
+ printf("Current style user: %s\n", cur_style);
+ else
+ printf("Style user stack is empty.\n");
+}
+
+static void
+ent_bt_style_user_pop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_text_style_user_pop(en);
+ printf("Style user popped\n");
+}
+
+static void
+ent_bt_style_user_push(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_text_style_user_push(en, user_style);
+ printf("Style user pushed\n");
+}
+
+void
+test_entry_style_user(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *hbx, *en, *bt, *bt2;
+
+ win = elm_win_util_standard_add("entry-user-style", "Entry User Style");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ en = elm_entry_add(bx);
+ elm_entry_line_wrap_set(en, ELM_WRAP_MIXED);
+ elm_entry_text_style_user_push(en, user_style);
+ elm_object_text_set(en,
+ "Default style<br>"
+ "<em>Change a standard tag (backing)</em><br>"
+ "<grn>Create a custom tag (green)</grn><br>"
+ "<ul>Create a custom tag (underline)</ul><br>"
+ "<underline=double underline_color=#0F0 underline2_color=#00F>Unnamed tag (underline double)</underline><br>"
+ );
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+ elm_object_focus_set(en, EINA_TRUE);
+
+ hbx = elm_box_add(bx);
+ elm_box_horizontal_set(hbx, EINA_TRUE);
+ elm_box_pack_end(bx, hbx);
+ evas_object_show(hbx);
+
+ bt = elm_button_add(hbx);
+ elm_object_text_set(bt, "Peek");
+ evas_object_smart_callback_add(bt, "clicked", ent_bt_style_user_peek, en);
+ elm_box_pack_end(hbx, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt2 = elm_button_add(hbx);
+ elm_object_text_set(bt2, "Pop");
+ evas_object_smart_callback_add(bt2, "clicked", ent_bt_style_user_pop, en);
+ elm_box_pack_end(hbx, bt2);
+ elm_object_focus_allow_set(bt2, EINA_FALSE);
+ evas_object_show(bt2);
+
+ bt2 = elm_button_add(hbx);
+ elm_object_text_set(bt2, "Push");
+ evas_object_smart_callback_add(bt2, "clicked", ent_bt_style_user_push, en);
+ elm_box_pack_end(hbx, bt2);
+ elm_object_focus_allow_set(bt2, EINA_FALSE);
+ evas_object_show(bt2);
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
+
+
+static char *default_style_text =
+ "<title>Elementary typography</title><br>"
+ "<ps>"
+ "<subtitle>Basic tags</subtitle><br>"
+ "Elm by default provide the <b>bold</b>, the <i>italic</i>, the "
+ "<hilight>hilight</hilight> and the <link>link</link> tags.<br>"
+ "<ps>"
+ "<subtitle>Font sizes</subtitle><br>"
+ "You can also use the <big>big</big> or <bigger>bigger</bigger> and "
+ "the <small>small</small> or <smaller>smaller</smaller> tags.<br>"
+ "<ps>"
+ "<subtitle>Status indicators</subtitle><br>"
+ "<info>info</info>, <success>success</success>, <warning>warning</warning> and <failure>failure</failure><br>"
+ "<ps>"
+ "<subtitle>Forms attributes</subtitle><br>"
+ "<name>Song:</name> <val>The show must go on</val><br>"
+ "<name>Artist:</name> <val>Queen</val><br>"
+ "<name>Album:</name> <val>Innuendo</val><br>"
+ "<ps>"
+ "<subtitle>Syntax highlight</subtitle><br>"
+ "<code>"
+ "<preprocessor>#include</preprocessor> <string>&lt;stdlib.h&gt;</string><br>"
+ "<preprocessor>#include</preprocessor> <string>&lt;Evas.h&gt;</string><br>"
+ "<br>"
+ "<preprocessor>#define</preprocessor> MESSAGE <string>\"Hello World\"</string><br>"
+ "<br>"
+ "<comment>/* Prints a message to standard output */</comment><br>"
+ "<type>void</type> <function>print_message</function><brace>(</brace><type>const char</type> *msg<brace>)</brace> <brace>{</brace><br>"
+ " printf<brace>(</brace><string>\"%s\\n\"</string>, msg<brace>)</brace>;<br>"
+ "<brace>}</brace><br>"
+ "<br>"
+ "<type>int</type> <function>main</function><brace>(</brace><type>int</type> argc, <type>char</type> *argv[]<brace>)</brace> <brace>{</brace><br>"
+ " <type>int</type> num_int = <number>123</number>;<br>"
+ " <type>float</type> num_float = <number>0.999</number>;<br>"
+ " <type>char</type> *str = <string>\"This is a string\"</string>;<br>"
+ " <type>Evas_Object</type> *obj = <keyword>NULL</keyword>;<br>"
+ " print_message<brace>(</brace>MESSAGE<brace>)</brace>;<br>"
+ " <keyword>return</keyword> <number>0</number>;<br>"
+ "<brace>}</brace><br>"
+ "<ps>"
+ "<line_added>+diff line added</line_added><br>"
+ "<line_removed>-diff line removed</line_removed><br>"
+ "<line_changed> diff line changed</line_changed><br>"
+ "</code>";
+
+static void
+ent_bt_def_style_disabled(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_object_disabled_set(en, elm_check_state_get(obj));
+}
+
+static void
+ent_bt_def_style_scrollable(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_scrollable_set(en, elm_check_state_get(obj));
+}
+
+static void
+ent_bt_def_style_markup(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+
+ if (elm_check_state_get(obj))
+ {
+ char *markup = elm_entry_utf8_to_markup(default_style_text);
+ elm_object_text_set(en, markup);
+ free(markup);
+ }
+ else
+ elm_object_text_set(en, default_style_text);
+}
+
+static void
+ent_bt_def_style_wrap(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+
+ if (elm_check_state_get(obj))
+ elm_entry_line_wrap_set(en, ELM_WRAP_NONE);
+ else
+ elm_entry_line_wrap_set(en, ELM_WRAP_WORD);
+}
+
+void
+test_entry_style_default(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *vbx, *en, *o;
+
+ win = elm_win_util_standard_add("entry-style", "Entry Default Style");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_resize(win, 400, 400);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ en = elm_entry_add(win);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en, default_style_text);
+ elm_entry_editable_set(en, EINA_TRUE);
+ elm_entry_line_wrap_set(en, ELM_WRAP_WORD);
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+
+ o = elm_separator_add(win);
+ elm_separator_horizontal_set(o, EINA_TRUE);
+ elm_box_pack_end(bx, o);
+ evas_object_show(o);
+
+ vbx = elm_box_add(win);
+ elm_box_horizontal_set(vbx, EINA_TRUE);
+ elm_box_pack_end(bx, vbx);
+ evas_object_show(vbx);
+
+ o = elm_check_add(win);
+ elm_object_text_set(o, "show markup");
+ evas_object_smart_callback_add(o, "changed", ent_bt_def_style_markup, en);
+ elm_box_pack_end(vbx, o);
+ evas_object_show(o);
+
+ o = elm_check_add(win);
+ elm_object_text_set(o, "disabled");
+ evas_object_smart_callback_add(o, "changed", ent_bt_def_style_disabled, en);
+ elm_box_pack_end(vbx, o);
+ evas_object_show(o);
+
+ o = elm_check_add(win);
+ elm_object_text_set(o, "scrollable");
+ evas_object_smart_callback_add(o, "changed", ent_bt_def_style_scrollable, en);
+ elm_box_pack_end(vbx, o);
+ evas_object_show(o);
+
+ o = elm_check_add(win);
+ elm_object_text_set(o, "no wrap");
+ evas_object_smart_callback_add(o, "changed", ent_bt_def_style_wrap, en);
+ elm_box_pack_end(vbx, o);
+ evas_object_show(o);
+
+ evas_object_show(win);
+}
+
+static void
+_entry_activated_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ printf("entry is activated: %s\n", elm_entry_entry_get(obj));
+}
+
+void
+test_entry3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *bt, *en;
+
+ win = elm_win_util_standard_add("entry3", "Entry 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ /* Single line selected entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_object_text_set(en, "This is a single line");
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_smart_callback_add(en, "activated", _entry_activated_cb, NULL);
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Clr");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_clr, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pri");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pri, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Sel");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sel, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "All");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_all, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Non");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_non, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Region");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_region, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Ins");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_ins, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Lef");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lef, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rig");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_rig, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Up ");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_up_, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Dow");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_dow, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Beg");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_beg, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "End");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_end, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "LBe");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lbe, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "LEn");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_len, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "SBe");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sbe, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "SEn");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sen, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Fmt");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_fmt, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "VFm");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_vfm, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Chr");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_chr, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Cut");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cut, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Cop");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cop, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pas");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pas, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ /* markup entry */
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en,
+ "This is an entry widget in this window that<br/>"
+ "uses markup <b>like this</> for styling and<br/>"
+ "formatting <em>like this</>, as well as<br/>"
+ "<a href=X><link>links in the text</></a>, so enter text<br/>"
+ "in here to edit it. By them way, links are<br/>"
+ "called <a href=anc-02>Anchors</a> so you will need<br/>"
+ "to refer to them this way. At the end here is a really long "
+ "line to test line wrapping to see if it works. But just in "
+ "case this line is not long enough I will add more here to "
+ "really test it out, as Elementary really needs some "
+ "good testing to see if entry widgets work as advertised."
+ );
+ evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en);
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Clr");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_clr, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pri");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pri, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Sel");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sel, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "All");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_all, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Non");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_non, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Ins");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_ins, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Lef");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lef, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rig");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_rig, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Up ");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_up_, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Dow");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_dow, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Beg");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_beg, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "LEn");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_len, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "SBe");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sbe, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "SEn");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sen, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Fmt");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_fmt, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "VFm");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_vfm, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Chr");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_chr, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Cut");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cut, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Cop");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cop, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pas");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pas, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 320, 480);
+
+ elm_object_focus_set(win, EINA_TRUE);
+ evas_object_show(win);
+}
+
+void
+test_entry4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *ly, *en;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("entry4", "Entry 4");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "layout");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, ly);
+ evas_object_show(ly);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_object_text_set(en, "This is a single line");
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_object_part_content_set(ly, "element1", en);
+ evas_object_show(en);
+
+ en = elm_entry_add(win);
+ elm_entry_line_wrap_set(en, ELM_WRAP_NONE);
+ elm_object_text_set(en,
+ "This is an entry widget<br/>"
+ "that uses markup<br/>"
+ "<b>like this</> and has<br/>"
+ "no scroller, so you can<br/>"
+ "use it more flexibly.");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_part_content_set(ly, "element2", en);
+ evas_object_show(en);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en,
+ "This is an entry widget in this window that<br/>"
+ "uses markup <b>like this</> for styling and<br/>"
+ "formatting <em>like this</>, as well as<br/>"
+ "<a href=X><link>links in the text</></a>, so enter text<br/>"
+ "in here to edit it. By them way, links are<br/>"
+ "called <a href=anc-02>Anchors</a> so you will need<br/>"
+ "to refer to them this way. At the end here is a really long "
+ "line to test line wrapping to see if it works. But just in "
+ "case this line is not long enough I will add more here to "
+ "really test it out, as Elementary really needs some "
+ "good testing to see if entry widgets work as advertised."
+ );
+ evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en);
+ elm_object_part_content_set(ly, "element3", en);
+ evas_object_show(en);
+
+ evas_object_show(win);
+}
+
+void
+test_entry5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *bt, *en;
+
+ win = elm_win_util_standard_add("entry5", "Entry 5");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_line_wrap_set(en, ELM_WRAP_CHAR);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en,
+ "This is an entry widget in this window that "
+ "uses markup like this for styling and "
+ "formatting like this, as well as "
+ "to refer to them this way. At the end here is a really long "
+ "line to test line wrapping to see if it works. But just in "
+ "case this line is not long enough I will add more here to "
+ "really test it out, as Elementary really needs some "
+ "good testing to see if entry widgets work as advertised."
+ );
+ evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en);
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Clr");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_clr, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pri");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pri, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Sel");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sel, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "All");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_all, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Non");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_non, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Ins");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_ins, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Lef");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lef, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rig");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_rig, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Up ");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_up_, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Dow");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_dow, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Beg");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_beg, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "End");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_end, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "LBe");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lbe, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "LEn");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_len, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "SBe");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sbe, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "SEn");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sen, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Fmt");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_fmt, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "VFm");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_vfm, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Chr");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_chr, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Cut");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cut, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Cop");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cop, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pas");
+ evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pas, en);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 320, 480);
+
+ elm_object_focus_set(win, EINA_TRUE);
+ evas_object_show(win);
+}
+
+void
+test_entry6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *en;
+
+ win = elm_win_util_standard_add("entry6", "Entry 6");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_line_wrap_set(en, ELM_WRAP_CHAR);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en,
+ "input_panel_enabled: TRUE.<br>"
+ "When this entry gets a focus, virtual keyboard will be shown "
+ "in illume environment.");
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_line_wrap_set(en, ELM_WRAP_CHAR);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en,
+ "input_panel_enabled: FALSE.<br>"
+ "This entry doesn't allow to show virtual keyboard automatically.<br>"
+ "it is used in case that wants its own keypad such as calculator.");
+ elm_entry_input_panel_enabled_set(en, EINA_FALSE);
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+
+ evas_object_resize(win, 320, 300);
+
+ elm_object_focus_set(win, EINA_TRUE);
+ evas_object_show(win);
+}
+
+static void
+changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ en = (Evas_Object*)data;
+
+ elm_entry_editable_set(en, elm_check_state_get(obj));
+}
+
+static void
+en_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *sp, *en;
+ sp = (Evas_Object *)data;
+ en = (Evas_Object *)obj;
+ elm_spinner_min_max_set(sp, 0, strlen(elm_object_text_get(en)));
+}
+
+static void
+sp_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en, *sp;
+ en = (Evas_Object *)data;
+ sp = (Evas_Object *)obj;
+ elm_entry_cursor_pos_set(en, elm_spinner_value_get(sp));
+ elm_object_focus_set(en, EINA_TRUE);
+}
+
+static void
+add_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ en = (Evas_Object *)data;
+
+ elm_entry_context_menu_item_add(en, "item", NULL, ELM_ICON_NONE, NULL, NULL);
+}
+
+static void
+clear_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ en = (Evas_Object *)data;
+
+ elm_entry_context_menu_clear(en);
+}
+
+static Evas_Object *
+item_provider(void *images EINA_UNUSED, Evas_Object *en, const char *item)
+{
+ Evas_Object *o = NULL;;
+ char buf[1024];
+
+ if (!strcmp(item, "itemprovider"))
+ {
+ snprintf(buf, sizeof(buf), "%s/images/icon_00.png",
+ elm_app_data_dir_get());
+ o = evas_object_image_filled_add(evas_object_evas_get(en));
+ evas_object_image_file_set(o, buf, NULL);
+ }
+
+ return o;
+}
+
+static Evas_Object *
+prepend_item_provider(void *images EINA_UNUSED, Evas_Object *en, const char *item)
+{
+ Evas_Object *o = NULL;;
+ char buf[1024];
+
+ if (!strcmp(item, "itemprovider"))
+ {
+ snprintf(buf, sizeof(buf), "%s/images/icon_10.png",
+ elm_app_data_dir_get());
+ o = evas_object_image_filled_add(evas_object_evas_get(en));
+ evas_object_image_file_set(o, buf, NULL);
+ }
+
+ return o;
+}
+
+static void
+prepend_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ en = (Evas_Object *)data;
+
+ elm_entry_item_provider_prepend(en, prepend_item_provider, NULL);
+ elm_object_text_set(en,
+ "Item Provider"
+ "<item size=50x50 vsize=full href=itemprovider></item>"
+ );
+}
+
+static void
+remove_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ en = (Evas_Object *)data;
+
+ elm_entry_item_provider_remove(en, item_provider, NULL);
+ elm_entry_item_provider_remove(en, prepend_item_provider, NULL);
+ elm_object_text_set(en,
+ "Item Provider"
+ "<item size=50x50 vsize=full href=itemprovider></item>"
+ );
+}
+
+static void
+enable_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ en = (Evas_Object*)data;
+
+ elm_entry_context_menu_disabled_set(en, elm_check_state_get(obj));
+}
+
+void
+test_entry7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gd, *bg, *en, *tg, *lb, *sp;
+ Evas_Object *bt, *en2;
+
+ win = elm_win_util_standard_add("entry7", "Entry 7");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ gd = elm_grid_add(win);
+ elm_grid_size_set(gd, 100, 100);
+ evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, gd);
+ evas_object_show(gd);
+
+ /* upper entry group */
+ bg = elm_bg_add(win);
+ elm_bg_color_set(bg, 255, 0, 0);
+ elm_grid_pack(gd, bg, 10, 10, 60, 30);
+ evas_object_show(bg);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en, "Editable, Cursor Position");
+ evas_object_show(en);
+ elm_grid_pack(gd, en, 10, 10, 60, 30);
+
+ tg = elm_check_add(win);
+ evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(tg, "Editable");
+ elm_check_state_set(tg, EINA_TRUE);
+ evas_object_smart_callback_add(tg, "changed", changed_cb, en);
+ elm_grid_pack(gd, tg, 70, 10, 22, 10);
+ evas_object_show(tg);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Cursor position:");
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_grid_pack(gd, lb, 70, 25, 25, 5);
+ evas_object_show(lb);
+
+ sp = elm_spinner_add(win);
+ elm_spinner_label_format_set(sp, "%1.0f");
+ elm_spinner_step_set(sp, 1);
+ elm_spinner_wrap_set(sp, ELM_WRAP_CHAR);
+ elm_spinner_min_max_set(sp, 0, strlen(elm_object_text_get(en)));
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_grid_pack(gd, sp, 70, 30, 25, 10);
+ evas_object_smart_callback_add(en, "changed", en_changed_cb, sp);
+ evas_object_smart_callback_add(sp, "delay,changed", sp_changed_cb, en);
+ evas_object_show(sp);
+
+ /* bottom entry group */
+ bg = elm_bg_add(win);
+ elm_bg_color_set(bg, 0, 255, 0);
+ elm_grid_pack(gd, bg, 10, 50, 45, 30);
+ evas_object_show(bg);
+
+ en2 = elm_entry_add(win);
+ elm_entry_scrollable_set(en2, EINA_TRUE);
+ evas_object_size_hint_weight_set(en2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en2,
+ "Item Provider"
+ "<item size=50x50 vsize=full href=itemprovider></item>"
+ );
+ elm_entry_item_provider_append(en2, item_provider, NULL);
+ elm_entry_context_menu_disabled_set(en2, EINA_TRUE);
+ elm_grid_pack(gd, en2, 10, 50, 45, 30);
+ evas_object_show(en2);
+
+ tg = elm_check_add(win);
+ evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(tg, "Disable Context Menu");
+ elm_check_state_set(tg, EINA_TRUE);
+ evas_object_smart_callback_add(tg, "changed", enable_changed_cb, en2);
+ elm_grid_pack(gd, tg, 55, 50, 40, 10);
+ evas_object_show(tg);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Add Context Menu");
+ elm_grid_pack(gd, bt, 55, 60, 40, 10);
+ evas_object_smart_callback_add(bt, "clicked", add_bt_clicked, en2);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Clear Context Menu");
+ elm_grid_pack(gd, bt, 55, 70, 40, 10);
+ evas_object_smart_callback_add(bt, "clicked", clear_bt_clicked, en2);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Prepend Item Provider");
+ elm_grid_pack(gd, bt, 10, 80, 45, 10);
+ evas_object_smart_callback_add(bt, "clicked", prepend_bt_clicked, en2);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Remove Item Provider");
+ elm_grid_pack(gd, bt, 55, 80, 40, 10);
+ evas_object_smart_callback_add(bt, "clicked", remove_bt_clicked, en2);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+static void
+filter_prepend_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en, *en2;
+ static Elm_Entry_Filter_Accept_Set digits_filter_data;
+
+ en = (Evas_Object *)data;
+ en2 = evas_object_data_get(en, "filter-entry");
+ digits_filter_data.accepted = elm_object_text_get(en2);
+ digits_filter_data.rejected = NULL;
+
+ elm_entry_markup_filter_append(en, elm_entry_filter_accept_set,
+ &digits_filter_data);
+ elm_object_text_set(en, "Markup Filter Prepend Test:");
+}
+
+static void
+filter_remove_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ en = (Evas_Object *)data;
+
+ elm_entry_markup_filter_remove(en, elm_entry_filter_accept_set, NULL);
+ elm_object_text_set(en, "Markup Filter Prepend Test:");
+}
+
+static void
+icon_visible_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ en = (Evas_Object*)data;
+
+ elm_entry_icon_visible_set(en, elm_check_state_get(obj));
+}
+
+static void
+end_visible_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ en = (Evas_Object*)data;
+
+ elm_entry_end_visible_set(en, elm_check_state_get(obj));
+}
+
+static void
+horizontal_bounce_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ Eina_Bool vb;
+ Eina_Bool bounce = elm_check_state_get(obj);
+ en = (Evas_Object*)data;
+
+ elm_scroller_bounce_get(en, NULL, &vb);
+ elm_scroller_bounce_set(en, bounce, bounce);
+}
+
+static void
+vertical_bounce_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ Eina_Bool hb;
+ Eina_Bool bounce = elm_check_state_get(obj);
+ en = (Evas_Object*)data;
+
+ elm_scroller_bounce_get(en, &hb, NULL);
+ elm_scroller_bounce_set(en, hb, bounce);
+}
+
+void
+test_entry8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gd, *rect, *en, *lb;
+ Evas_Object *bt, *en2;
+ Evas_Object *ch, *en3;
+ Evas_Object *en4;
+ static Elm_Entry_Filter_Limit_Size limit_filter_data;
+
+ win = elm_win_util_standard_add("entry8", "Entry 8");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ gd = elm_grid_add(win);
+ elm_grid_size_set(gd, 100, 100);
+ evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, gd);
+ evas_object_show(gd);
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ elm_grid_pack(gd, rect, 5, 5, 90, 10);
+ evas_object_color_set(rect, 125, 125, 255, 255);
+ evas_object_show(rect);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(en, "Markup Filter Prepend Test");
+ elm_grid_pack(gd, en, 5, 5, 90, 10);
+ evas_object_show(en);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Markup Filter (20 Characters):");
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_grid_pack(gd, lb, 5, 15, 50, 10);
+ evas_object_show(lb);
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ elm_grid_pack(gd, rect, 55, 15, 40, 10);
+ evas_object_color_set(rect, 0, 125, 255, 255);
+ evas_object_show(rect);
+
+ en2 = elm_entry_add(win);
+ elm_entry_scrollable_set(en2, EINA_TRUE);
+ elm_scroller_policy_set(en2, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ evas_object_size_hint_weight_set(en2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ limit_filter_data.max_char_count = 20;
+ limit_filter_data.max_byte_count = 0;
+ elm_entry_markup_filter_append(en2, elm_entry_filter_limit_size, &limit_filter_data);
+ evas_object_data_set(en, "filter-entry", en2);
+ evas_object_show(en2);
+ elm_grid_pack(gd, en2, 55, 15, 40, 10);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Markup Filter Prepend");
+ elm_grid_pack(gd, bt, 5, 25, 45, 10);
+ evas_object_smart_callback_add(bt, "clicked", filter_prepend_bt_clicked, en);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Markup Filter Remove");
+ elm_grid_pack(gd, bt, 50, 25, 45, 10);
+ evas_object_smart_callback_add(bt, "clicked", filter_remove_bt_clicked, en);
+ evas_object_show(bt);
+
+ en3 = elm_entry_add(win);
+ elm_entry_scrollable_set(en3, EINA_TRUE);
+ elm_scroller_policy_set(en3, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(en3, EINA_TRUE);
+ evas_object_size_hint_weight_set(en3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en3, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(en3);
+ elm_grid_pack(gd, en3, 5, 35, 90, 20);
+
+ bt = elm_icon_add(win);
+ elm_icon_standard_set(bt, "home");
+ evas_object_size_hint_min_set(bt, 48, 48);
+ evas_object_color_set(bt, 128, 0, 0, 128);
+ evas_object_show(bt);
+ elm_object_part_content_set(en3, "icon", bt);
+
+ bt = elm_icon_add(win);
+ elm_icon_standard_set(bt, "delete");
+ evas_object_color_set(bt, 128, 0, 0, 128);
+ evas_object_size_hint_min_set(bt, 48, 48);
+ evas_object_show(bt);
+ elm_object_part_content_set(en3, "end", bt);
+
+ ch = elm_check_add(win);
+ evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ch, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(ch, "Icon Visible");
+ elm_check_state_set(ch, EINA_TRUE);
+ evas_object_smart_callback_add(ch, "changed", icon_visible_changed_cb, en3);
+ elm_grid_pack(gd, ch, 5, 55, 30, 10);
+ evas_object_show(ch);
+
+ ch = elm_check_add(win);
+ evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ch, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(ch, "End Visible");
+ elm_check_state_set(ch, EINA_TRUE);
+ evas_object_smart_callback_add(ch, "changed", end_visible_changed_cb, en3);
+ elm_grid_pack(gd, ch, 70, 55, 25, 10);
+ evas_object_show(ch);
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ elm_grid_pack(gd, rect, 5, 65, 90, 20);
+ evas_object_color_set(rect, 255, 125, 125, 255);
+ evas_object_show(rect);
+
+ en4 = elm_entry_add(win);
+ elm_object_part_text_set(en4, "guide", "Type in here");
+ elm_entry_scrollable_set(en4, EINA_TRUE);
+ elm_scroller_bounce_set(en4, EINA_TRUE, EINA_TRUE);
+ elm_entry_autocapital_type_set(en4, EINA_TRUE);
+ evas_object_size_hint_weight_set(en4, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en4, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_grid_pack(gd, en4, 5, 65, 90, 20);
+ evas_object_show(en4);
+
+ ch = elm_check_add(win);
+ evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ch, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(ch, "Horizontal Bounce Set");
+ elm_check_state_set(ch, EINA_TRUE);
+ evas_object_smart_callback_add(ch, "changed", horizontal_bounce_changed_cb, en4);
+ elm_grid_pack(gd, ch, 5, 85, 45, 10);
+ evas_object_show(ch);
+
+ ch = elm_check_add(win);
+ evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ch, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(ch, "Vertical Bounce Set");
+ elm_check_state_set(ch, EINA_TRUE);
+ evas_object_smart_callback_add(ch, "changed", vertical_bounce_changed_cb, en4);
+ elm_grid_pack(gd, ch, 50, 85, 45, 10);
+ evas_object_show(ch);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+typedef struct {
+ Evas_Object *en_regex;
+ Evas_Object *lb_regex;
+ Evas_Object *en_single;
+ Evas_Object *en_multi;
+ Elm_Validator_Regexp *re;
+} _test_regex_data_t;
+
+static void
+_test_regex_data_del(void *data,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _test_regex_data_t *test_data = data;
+ if (test_data->re) elm_validator_regexp_free(test_data->re);
+ free(test_data);
+}
+
+static void
+_test_regex_bt_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ int status;
+ _test_regex_data_t *test_data = data;
+ Eina_Strbuf *tmp;
+
+ if (test_data->re)
+ {
+ eo_event_callback_del(test_data->en_single, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re);
+ eo_event_callback_del(test_data->en_multi, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re);
+ elm_validator_regexp_free(test_data->re);
+ }
+ test_data->re = elm_validator_regexp_new(elm_entry_entry_get(test_data->en_regex), NULL);
+
+ status = elm_validator_regexp_status_get(test_data->re);
+ tmp = eina_strbuf_manage_new(strdup("Regex error: "));
+ switch (status)
+ {
+ case ELM_REG_NOERROR:
+ {
+ eina_strbuf_append(tmp, "No error. Regex maches to the Entrys text.");
+ break;
+ }
+ case ELM_REG_BADPAT:
+ {
+ eina_strbuf_append(tmp, "Invalid regular expression.");
+ break;
+ }
+ default:
+ break;
+ }
+ if (!status)
+ {
+ eo_event_callback_add(test_data->en_single, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re);
+ eo_event_callback_add(test_data->en_multi, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re);
+ }
+
+ elm_object_text_set(test_data->lb_regex, eina_strbuf_string_get(tmp));
+ eina_strbuf_free(tmp);
+}
+
+static inline Evas_Object *
+_test_regex_entry_add(Evas_Object *parent, Eina_Bool is_singleline)
+{
+ Evas_Object *entry = elm_entry_add(parent);
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_entry_single_line_set(entry, is_singleline);
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_entry_editable_set(entry, EINA_TRUE);
+ evas_object_show(entry);
+ return entry;
+}
+
+void
+test_entry_regex(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *scr, *box;
+ Evas_Object *item, *label, *bt, *sep;
+ _test_regex_data_t *test_data;
+#define REGEX "^[0-9]*$"
+
+ test_data = malloc(sizeof(_test_regex_data_t));
+
+ win = elm_win_util_standard_add("Entry", "Entry Regex Test");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
+ _test_regex_data_del, test_data);
+
+ scr = elm_scroller_add(win);
+ elm_scroller_bounce_set(scr, EINA_FALSE, EINA_TRUE);
+ elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
+ evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, scr);
+ evas_object_show(scr);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_homogeneous_set(box, EINA_FALSE);
+ elm_object_content_set(scr, box);
+
+ evas_object_show(box);
+
+ label = elm_label_add(box);
+ elm_object_text_set(label, "Regular Expression");
+ elm_box_pack_end(box, label);
+ evas_object_show(label);
+
+ item = elm_box_add(win);
+ evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_horizontal_set(item, EINA_TRUE);
+ elm_box_homogeneous_set(item, EINA_FALSE);
+ evas_object_show(item);
+ elm_box_pack_end(box, item);
+
+ test_data->en_regex = _test_regex_entry_add(item, EINA_TRUE);
+ elm_box_pack_end(item, test_data->en_regex);
+
+ bt = elm_button_add(item);
+ elm_object_text_set(bt, "Set");
+ evas_object_smart_callback_add(bt, "clicked", _test_regex_bt_cb, test_data);
+ evas_object_show(bt);
+ elm_box_pack_end(item, bt);
+
+ test_data->lb_regex = elm_label_add(box);
+ elm_object_text_set(test_data->lb_regex, "Regex error: no error.");
+ elm_box_pack_end(box, test_data->lb_regex);
+ evas_object_show(test_data->lb_regex);
+
+ sep = elm_separator_add(box);
+ elm_separator_horizontal_set(sep, EINA_TRUE);
+ evas_object_show(sep);
+ elm_box_pack_end(box, sep);
+
+ label = elm_label_add(box);
+ elm_object_text_set(label, "Test regex in single line entry");
+ elm_box_pack_end(box, label);
+ evas_object_show(label);
+
+ test_data->en_single = _test_regex_entry_add(box, EINA_TRUE);
+ elm_box_pack_end(box, test_data->en_single);
+
+ label = elm_label_add(box);
+ elm_object_text_set(label, "Test regex in multi line entry");
+ elm_box_pack_end(box, label);
+ evas_object_show(label);
+
+ test_data->en_multi = _test_regex_entry_add(box, EINA_FALSE);
+ elm_box_pack_end(box, test_data->en_multi);
+
+ test_data->re = elm_validator_regexp_new(REGEX, NULL);
+ elm_entry_entry_set(test_data->en_regex, REGEX);
+ eo_event_callback_add(test_data->en_single, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re);
+ eo_event_callback_add(test_data->en_multi, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+
+#undef REGEX
+}
+
+static void
+_scrolled_entry_clear(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_object_text_set(en, "");
+}
+
+static void
+_scrolled_entry_save(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en = data;
+ elm_entry_file_save(en);
+}
+
+static void
+auto_save_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *en;
+ en = (Evas_Object*)data;
+
+ elm_entry_autosave_set(en, elm_check_state_get(obj));
+}
+
+void
+test_entry_notepad(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *bt, *np, *ch;
+
+ win = elm_win_util_standard_add("entry-notepad", "Entry Notepad");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ np = elm_entry_add(win);
+ elm_entry_scrollable_set(np, EINA_TRUE);
+ elm_entry_file_set(np, "note.txt", ELM_TEXT_FORMAT_PLAIN_UTF8);
+ evas_object_size_hint_weight_set(np, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(np, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, np);
+ evas_object_show(np);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Clear");
+ evas_object_smart_callback_add(bt, "clicked", _scrolled_entry_clear, np);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Save");
+ evas_object_smart_callback_add(bt, "clicked", _scrolled_entry_save, np);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ ch = elm_check_add(win);
+ evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ch, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(ch, "Auto Save");
+ elm_check_state_set(ch, EINA_FALSE);
+ evas_object_smart_callback_add(ch, "changed", auto_save_changed_cb, np);
+ elm_box_pack_end(bx2, ch);
+ evas_object_show(ch);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 320, 300);
+
+ elm_object_focus_set(win, EINA_TRUE);
+ evas_object_show(win);
+}
+
+void
+test_entry_emoticon(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *en;
+
+ win = elm_win_util_standard_add("entry-emoticon", "Entry Emoticon");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ en = elm_entry_add(win);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, en);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_object_text_set(en,
+ "angry <item absize=64x64 vsize=ascent href=emoticon/angry></item> <br>"
+ "angry-shout <item absize=64x64 vsize=ascent href=emoticon/angry-shout></item> <br>"
+ "crazy-laugh <item absize=64x64 vsize=ascent href=emoticon/crazy-laugh></item> <br>"
+ "evil-laugh <item absize=64x64 vsize=ascent href=emoticon/evil-laugh></item> <br>"
+ "evil <item absize=64x64 vsize=ascent href=emoticon/evil></item> <br>"
+ "goggle-smile <item absize=64x64 vsize=ascent href=emoticon/goggle-smile></item> <br>"
+ "grumpy <item absize=64x64 vsize=ascent href=emoticon/grumpy></item> <br>"
+ "guilty <item absize=64x64 vsize=ascent href=emoticon/guilty></item> <br>"
+ "haha <item absize=64x64 vsize=ascent href=emoticon/haha></item> <br>"
+ "happy-panting <item absize=64x64 vsize=ascent href=emoticon/happy-panting></item> <br>"
+ "happy <item absize=64x64 vsize=ascent href=emoticon/happy></item> <br>"
+ "indifferent <item absize=64x64 vsize=ascent href=emoticon/indifferent></item> <br>"
+ "kiss <item absize=64x64 vsize=ascent href=emoticon/kiss></item> <br>"
+ "knowing-grin <item absize=64x64 vsize=ascent href=emoticon/knowing-grin></item> <br>"
+ "laugh <item absize=64x64 vsize=ascent href=emoticon/laugh></item> <br>"
+ "little-bit-sorry <item absize=64x64 vsize=ascent href=emoticon/little-bit-sorry></item> <br>"
+ "love-lots <item absize=64x64 vsize=ascent href=emoticon/love-lots></item> <br>"
+ "love <item absize=64x64 vsize=ascent href=emoticon/love></item> <br>"
+ "minimal-smile <item absize=64x64 vsize=ascent href=emoticon/minimal-smile></item> <br>"
+ "not-happy <item absize=64x64 vsize=ascent href=emoticon/not-happy></item> <br>"
+ "not-impressed <item absize=64x64 vsize=ascent href=emoticon/not-impressed></item> <br>"
+ "omg <item absize=64x64 vsize=ascent href=emoticon/omg></item> <br>"
+ "opensmile <item absize=64x64 vsize=ascent href=emoticon/opensmile></item> <br>"
+ "smile <item absize=64x64 vsize=ascent href=emoticon/smile></item> <br>"
+ "sorry <item absize=64x64 vsize=ascent href=emoticon/sorry></item> <br>"
+ "squint-laugh <item absize=64x64 vsize=ascent href=emoticon/squint-laugh></item> <br>"
+ "surprised <item absize=64x64 vsize=ascent href=emoticon/surprised></item> <br>"
+ "suspicious <item absize=64x64 vsize=ascent href=emoticon/suspicious></item> <br>"
+ "tongue-dangling <item absize=64x64 vsize=ascent href=emoticon/tongue-dangling></item> <br>"
+ "tongue-poke <item absize=64x64 vsize=ascent href=emoticon/tongue-poke></item> <br>"
+ "uh <item absize=64x64 vsize=ascent href=emoticon/uh></item> <br>"
+ "unhappy <item absize=64x64 vsize=ascent href=emoticon/unhappy></item> <br>"
+ "very-sorry <item absize=64x64 vsize=ascent href=emoticon/very-sorry></item> <br>"
+ "what <item absize=64x64 vsize=ascent href=emoticon/what></item> <br>"
+ "wink <item absize=64x64 vsize=ascent href=emoticon/wink></item> <br>"
+ "worried <item absize=64x64 vsize=ascent href=emoticon/worried></item> <br>"
+ "wtf <item absize=64x64 vsize=ascent href=emoticon/wtf></item> <br>"
+ );
+ evas_object_show(en);
+ elm_object_focus_set(en, EINA_TRUE);
+
+ evas_object_resize(win, 400, 500);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_entry_anchor.c b/src/bin/elementary/test_entry_anchor.c
new file mode 100644
index 0000000000..c5210b899d
--- /dev/null
+++ b/src/bin/elementary/test_entry_anchor.c
@@ -0,0 +1,236 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_print_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("bubble clicked\n");
+}
+
+static void
+my_entry_anchor_bt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *av = data;
+ elm_entry_anchor_hover_end(av);
+}
+
+static void
+my_entry_anchor(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *av = data;
+ Elm_Entry_Anchor_Hover_Info *ei = event_info;
+ Evas_Object *bt, *bx;
+
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, ei->anchor_info->name);
+ elm_object_part_content_set(ei->hover, "middle", bt);
+ evas_object_show(bt);
+
+ // hints as to where we probably should put hover contents (buttons etc.).
+ if (ei->hover_top)
+ {
+ bx = elm_box_add(obj);
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Top 1");
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Top 2");
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Top 3");
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ elm_object_part_content_set(ei->hover, "top", bx);
+ evas_object_show(bx);
+ }
+ if (ei->hover_bottom)
+ {
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Bot");
+ elm_object_part_content_set(ei->hover, "bottom", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ }
+ if (ei->hover_left)
+ {
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Left");
+ elm_object_part_content_set(ei->hover, "left", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ }
+ if (ei->hover_right)
+ {
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Right");
+ elm_object_part_content_set(ei->hover, "right", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ }
+}
+
+static void
+my_entry_anchor_edge_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("left\n");
+}
+
+static void
+my_entry_anchor_edge_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("right\n");
+}
+
+static void
+my_entry_anchor_edge_top(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("top\n");
+}
+
+static void
+my_entry_anchor_edge_bottom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("bottom\n");
+}
+
+static void
+my_entry_anchor_scroll(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Coord x, y, w, h, vw, vh;
+
+ elm_scroller_region_get(obj, &x, &y, &w, &h);
+ elm_scroller_child_size_get(obj, &vw, &vh);
+ printf("scroll %ix%i +%i+%i in %ix%i\n", w, h, x, y, vw, vh);
+}
+
+void
+test_entry_anchor(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *en, *sc, *bx, *bb, *ic;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("entry_anchor", "Entry Anchor");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, sc);
+
+ evas_object_smart_callback_add(sc, "edge,left", my_entry_anchor_edge_left, NULL);
+ evas_object_smart_callback_add(sc, "edge,right", my_entry_anchor_edge_right, NULL);
+ evas_object_smart_callback_add(sc, "edge,top", my_entry_anchor_edge_top, NULL);
+ evas_object_smart_callback_add(sc, "edge,bottom", my_entry_anchor_edge_bottom, NULL);
+ evas_object_smart_callback_add(sc, "scroll", my_entry_anchor_scroll, NULL);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 3");
+ elm_object_part_text_set(bb, "info", "10:32 4/11/2008");
+ elm_object_part_content_set(bb, "icon", ic);
+ evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ en = elm_entry_add(win);
+ elm_entry_anchor_hover_style_set(en, "popout");
+ elm_entry_anchor_hover_parent_set(en, win);
+ elm_object_text_set(en,
+ "Hi there. This is the most recent message in the "
+ "list of messages. It has one <a href=tel:+614321234>+61 432 1234</a> "
+ "(phone number) to click on.");
+ evas_object_smart_callback_add(en, "anchor,hover,opened",
+ my_entry_anchor, en);
+ elm_object_content_set(bb, en);
+ evas_object_show(en);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 2");
+ elm_object_part_text_set(bb, "info", "7:16 27/10/2008");
+ elm_object_part_content_set(bb, "icon", ic);
+ evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ en = elm_entry_add(win);
+ elm_entry_anchor_hover_style_set(en, "popout");
+ elm_entry_anchor_hover_parent_set(en, win);
+ elm_object_text_set(en,
+ "Hey what are you doing? This is the second last message "
+ "Hi there. This is the most recent message in the "
+ "list. It's a longer one so it can wrap more and "
+ "contains a <a href=contact:john>John</a> contact "
+ "link in it to test popups on links. The idea is that "
+ "all SMS's are scanned for things that look like phone "
+ "numbers or names that are in your contacts list, and "
+ "if they are, they become clickable links that pop up "
+ "a menus of obvious actions to perform on this piece "
+ "of information. This of course can be later explicitly "
+ "done by links maybe running local apps or even being "
+ "web URL's too that launch the web browser and point it "
+ "to that URL. <item relsize=16x16 vsize=full href=emoticon/omg></item>");
+ evas_object_smart_callback_add(en, "anchor,hover,opened", my_entry_anchor, en);
+ elm_object_content_set(bb, en);
+ evas_object_show(en);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 1");
+ elm_object_part_text_set(bb, "info", "20:47 18/6/2008");
+ elm_object_part_content_set(bb, "icon", ic);
+ evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ en = elm_entry_add(win);
+ elm_entry_anchor_hover_style_set(en, "popout");
+ elm_entry_anchor_hover_parent_set(en, win);
+ elm_object_text_set(en, "This is a short message. <item relsize=16x16 vsize=full href=emoticon/haha></item>");
+ evas_object_smart_callback_add(en, "anchor,hover,opened",
+ my_entry_anchor, en);
+ elm_object_content_set(bb, en);
+ evas_object_show(en);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ elm_object_content_set(sc, bx);
+ evas_object_show(bx);
+
+ evas_object_show(sc);
+
+ elm_object_focus_set(win, EINA_TRUE);
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_entry_anchor2.c b/src/bin/elementary/test_entry_anchor2.c
new file mode 100644
index 0000000000..a96bdf9ece
--- /dev/null
+++ b/src/bin/elementary/test_entry_anchor2.c
@@ -0,0 +1,109 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+my_entry_anchor_bt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *av = data;
+ elm_entry_anchor_hover_end(av);
+}
+
+static void
+_anchor_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Entry_Anchor_Info *ev = event_info;
+ printf("anchor click %d: '%s' (%d, %d)\n", ev->button, ev->name, ev->x, ev->y);
+}
+
+static void
+_anchor_hover_opened_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *av = data;
+ Elm_Entry_Anchor_Hover_Info *ei = event_info;
+ Evas_Object *bt, *bx;
+
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, ei->anchor_info->name);
+ elm_object_part_content_set(ei->hover, "middle", bt);
+ evas_object_show(bt);
+
+ // hints as to where we probably should put hover contents (buttons etc.).
+ if (ei->hover_top)
+ {
+ bx = elm_box_add(obj);
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Top 1");
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Top 2");
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Top 3");
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ elm_object_part_content_set(ei->hover, "top", bx);
+ evas_object_show(bx);
+ }
+ if (ei->hover_bottom)
+ {
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Bot");
+ elm_object_part_content_set(ei->hover, "bottom", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ }
+ if (ei->hover_left)
+ {
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Left");
+ elm_object_part_content_set(ei->hover, "left", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ }
+ if (ei->hover_right)
+ {
+ bt = elm_button_add(obj);
+ elm_object_text_set(bt, "Right");
+ elm_object_part_content_set(ei->hover, "right", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av);
+ evas_object_show(bt);
+ }
+}
+
+void
+test_entry_anchor2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *en;
+
+ win = elm_win_util_standard_add("entry_anchor2", "Entry Anchor 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ en = elm_entry_add(win);
+ elm_entry_anchor_hover_style_set(en, "popout");
+ elm_entry_anchor_hover_parent_set(en, win);
+ elm_object_text_set(en,
+ "This is an entry widget in this window that<br/>"
+ "uses markup <b>like this</> for styling and<br/>"
+ "formatting <em>like this</>, as well as<br/>"
+ "<a href=X><link>links in the text</></a>, so enter text<br/>"
+ "in here to edit it. By the way, links are<br/>"
+ "called <a href=anc-02>Anchors</a> so you will need<br/>"
+ "to refer to them this way. <item relsize=16x16 vsize=full href=emoticon/guilty-smile></item>");
+ evas_object_smart_callback_add(en, "anchor,hover,opened", _anchor_hover_opened_cb, en);
+ evas_object_smart_callback_add(en, "anchor,clicked", _anchor_clicked_cb, en);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, en);
+ evas_object_show(en);
+
+ evas_object_resize(win, 320, 300);
+
+ elm_object_focus_set(win, EINA_TRUE);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_explode.c b/src/bin/elementary/test_explode.c
new file mode 100644
index 0000000000..63b1b4608f
--- /dev/null
+++ b/src/bin/elementary/test_explode.c
@@ -0,0 +1,211 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static Evas_Object *target = NULL;
+static Ecore_Animator *anim = NULL;
+
+static Eina_List *mirrors = NULL;
+
+static Eina_Bool
+_cb_anim(void *data EINA_UNUSED, double pos)
+{
+ Eina_List *l;
+ Evas_Object *o;
+ double v = ecore_animator_pos_map(pos, ECORE_POS_MAP_SINUSOIDAL, 0.0, 0.0);
+ Evas_Coord x, y, w, h;
+ Evas_Coord vw, vh;
+ int tot;
+
+ evas_output_viewport_get(evas_object_evas_get(target), NULL, NULL, &vw, &vh);
+ evas_object_geometry_get(target, &x, &y, &w, &h);
+ tot = (eina_list_count(mirrors) + 2) / 2;
+ EINA_LIST_FOREACH(mirrors, l, o)
+ {
+ Evas_Map *m = evas_map_new(4);
+ int n = (int)((unsigned long)evas_object_data_get(o, "stack"));
+ double ang = (((double)(n + 1) * 20.0) / (double)tot);
+ evas_map_util_points_populate_from_object(m, o);
+ evas_map_util_3d_rotate(m, ang * v / 2.0, ang * v, 0,
+ x + w + (w / 2), y + (h / 2), 0);
+ evas_map_util_3d_perspective(m, vw / 2, vh / 2, 0, vw + vh);
+ evas_object_map_set(o, m);
+ evas_map_free(m);
+ evas_object_map_enable_set(o, EINA_TRUE);
+ }
+ if (pos >= 1.0) anim = NULL;
+ return EINA_TRUE;
+}
+
+static int
+explode_obj(Evas_Object *obj, int n)
+{
+ Eina_List *children = NULL;
+ Evas_Object *o;
+ Evas *e;
+
+ e = evas_object_evas_get(obj);
+ children = evas_object_smart_members_get(obj);
+ if (!children)
+ {
+ Evas_Object *m;
+ Evas_Coord x, y, w, h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+ m = evas_object_image_filled_add(e);
+ mirrors = eina_list_append(mirrors, m);
+ evas_object_anti_alias_set(m, EINA_TRUE);
+ evas_object_image_source_clip_set(m, EINA_FALSE);
+ evas_object_pass_events_set(m, EINA_TRUE);
+ evas_object_image_source_set(m, obj);
+ evas_object_image_source_visible_set(m, EINA_FALSE);
+ evas_object_layer_set(m, EVAS_LAYER_MAX - 10);
+ evas_object_move(m, x, y);
+ evas_object_resize(m, w, h);
+ evas_object_show(m);
+ evas_object_color_set(m, 0, 0, 0, 128);
+ evas_object_data_set(m, "stack", (void *)((unsigned long)n));
+
+ n++;
+
+ m = evas_object_image_filled_add(e);
+ mirrors = eina_list_append(mirrors, m);
+ evas_object_anti_alias_set(m, EINA_TRUE);
+ evas_object_image_source_clip_set(m, EINA_FALSE);
+ evas_object_pass_events_set(m, EINA_TRUE);
+ evas_object_image_source_set(m, obj);
+ evas_object_image_source_visible_set(m, EINA_FALSE);
+ evas_object_layer_set(m, EVAS_LAYER_MAX - 10);
+ evas_object_move(m, x, y);
+ evas_object_resize(m, w, h);
+ evas_object_show(m);
+ evas_object_data_set(m, "stack", (void *)((unsigned long)n));
+ }
+ else
+ {
+ EINA_LIST_FREE(children, o)
+ {
+ if (!evas_object_visible_get(o)) continue;
+ if (evas_object_clipees_has(o)) continue;
+
+ n = explode_obj(o, n);
+ }
+ }
+ return n;
+}
+
+static void
+explode(Evas_Object *obj)
+{
+ Evas_Object *o;
+
+ EINA_LIST_FREE(mirrors, o) evas_object_del(o);
+ if (!obj) return;
+
+ explode_obj(obj, 0);
+ if (!anim) anim = ecore_animator_timeline_add(1.0, _cb_anim, NULL);
+}
+
+static void
+_cb_target_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj, void *info EINA_UNUSED)
+{
+ if (obj == target)
+ {
+ if (anim)
+ {
+ ecore_animator_del(anim);
+ anim = NULL;
+ }
+ explode(NULL);
+ target = NULL;
+ }
+}
+
+static void
+_cb_catcher_down(void *data, Evas *e,
+ Evas_Object *obj EINA_UNUSED, void *info)
+{
+ Evas_Event_Mouse_Down *ev = info;
+
+ if (target)
+ {
+ evas_object_event_callback_del_full(target, EVAS_CALLBACK_DEL,
+ _cb_target_del, data);
+ if (anim)
+ {
+ ecore_animator_del(anim);
+ anim = NULL;
+ }
+ explode(NULL);
+ target = NULL;
+ }
+ if ((ev->button == 2) &&
+ (evas_key_modifier_is_set(ev->modifiers, "Control")))
+ {
+ Eina_List *objs;
+
+ objs = evas_tree_objects_at_xy_get(e, NULL, ev->canvas.x, ev->canvas.y);
+ if (objs)
+ {
+ Eina_List *l;
+ Evas_Object *lobj, *parent;
+
+ target = NULL;
+ EINA_LIST_FOREACH(objs, l, lobj)
+ {
+ if (evas_object_data_get(lobj, "::catcher::")) continue;
+ if (evas_object_repeat_events_get(lobj))
+ {
+ int r, g, b, a;
+ evas_object_color_get(lobj, &r, &g, &b, &a);
+ if ((r == 0) && (g == 0) && (b == 0) && (a == 0)) continue;
+ }
+ if (elm_object_widget_check(lobj))
+ {
+ target = lobj;
+ break;
+ }
+ else
+ {
+ for (parent = lobj; parent != NULL;
+ parent = elm_object_parent_widget_get(parent))
+ {
+ if (elm_object_widget_check(parent))
+ {
+ target = parent;
+ break;
+ }
+ }
+ if (target) break;
+ }
+ }
+ if (target)
+ {
+ evas_object_event_callback_add(target, EVAS_CALLBACK_DEL,
+ _cb_target_del, data);
+ eina_list_free(objs);
+ explode(target);
+ }
+ }
+ }
+}
+
+void
+explode_win_enable(Evas_Object *win)
+{
+ Evas *e = evas_object_evas_get(win);
+
+ Evas_Object *catcher = evas_object_rectangle_add(e);
+ evas_object_layer_set(catcher, EVAS_LAYER_MAX);
+ evas_object_color_set(catcher, 0, 0, 0, 0);
+ evas_object_resize(catcher, 99999, 99999);
+ evas_object_repeat_events_set(catcher, EINA_TRUE);
+ evas_object_data_set(catcher, "::catcher::", catcher);
+ evas_object_show(catcher);
+
+ evas_object_event_callback_add(catcher, EVAS_CALLBACK_MOUSE_DOWN,
+ _cb_catcher_down, win);
+}
diff --git a/src/bin/elementary/test_explode.h b/src/bin/elementary/test_explode.h
new file mode 100644
index 0000000000..e91a61511f
--- /dev/null
+++ b/src/bin/elementary/test_explode.h
@@ -0,0 +1 @@
+void explode_win_enable(Evas_Object *win);
diff --git a/src/bin/elementary/test_external.c b/src/bin/elementary/test_external.c
new file mode 100644
index 0000000000..768185aa58
--- /dev/null
+++ b/src/bin/elementary/test_external.c
@@ -0,0 +1,182 @@
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+void
+test_external_button(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *ly;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("ext_button", "Edje External Button");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test_external.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "external/button");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, ly);
+ evas_object_show(ly);
+
+ evas_object_resize(win, 320, 400);
+ evas_object_show(win);
+}
+
+void
+test_external_slider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *ly;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("ext_slider", "Edje External Slider");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test_external.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "external/slider");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, ly);
+ evas_object_show(ly);
+
+ evas_object_resize(win, 320, 400);
+ evas_object_show(win);
+}
+
+void
+test_external_scroller(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *ly;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("ext_scroller", "Edje External Scroller");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test_external.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "external/scroller");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, ly);
+ evas_object_show(ly);
+
+ evas_object_resize(win, 320, 400);
+ evas_object_show(win);
+}
+
+
+static Eina_Bool
+_timer_cb(void *data)
+{
+ Evas_Object *edje = data;
+ Evas_Object *bt1, *bt2, *bt3, *pb1, *pb2, *pb3, *pb4, *pb5, *pb6, *pb7;
+ double progress;
+
+ pb1 = edje_object_part_external_object_get(edje, "ext_pbar1");
+ pb2 = edje_object_part_external_object_get(edje, "ext_pbar2");
+ pb3 = edje_object_part_external_object_get(edje, "ext_pbar3");
+ pb4 = edje_object_part_external_object_get(edje, "ext_pbar4");
+ pb6 = edje_object_part_external_object_get(edje, "ext_pbar6");
+ progress = elm_progressbar_value_get(pb1) + 0.0123;
+
+ elm_progressbar_value_set(pb1, progress);
+ elm_progressbar_value_set(pb2, progress);
+ elm_progressbar_value_set(pb3, progress);
+ elm_progressbar_value_set(pb4, progress);
+ elm_progressbar_value_set(pb6, progress);
+
+ if (progress < 1.0)
+ return ECORE_CALLBACK_RENEW;
+
+ pb5 = edje_object_part_external_object_get(edje, "ext_pbar5");
+ pb7 = edje_object_part_external_object_get(edje, "ext_pbar7");
+ elm_progressbar_pulse(pb2, EINA_FALSE);
+ elm_progressbar_pulse(pb5, EINA_FALSE);
+ elm_progressbar_pulse(pb7, EINA_FALSE);
+
+ bt1 = edje_object_part_external_object_get(edje, "ext_button1");
+ bt2 = edje_object_part_external_object_get(edje, "ext_button2");
+ bt3 = edje_object_part_external_object_get(edje, "ext_button3");
+ elm_object_disabled_set(bt1, EINA_FALSE);
+ elm_object_disabled_set(bt2, EINA_FALSE);
+ elm_object_disabled_set(bt3, EINA_FALSE);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *edje = data;
+ Evas_Object *bt1, *bt2, *bt3, *pb1, *pb2, *pb3, *pb4, *pb5, *pb6, *pb7;
+
+ bt1 = edje_object_part_external_object_get(edje, "ext_button1");
+ bt2 = edje_object_part_external_object_get(edje, "ext_button2");
+ bt3 = edje_object_part_external_object_get(edje, "ext_button3");
+ elm_object_disabled_set(bt1, EINA_TRUE);
+ elm_object_disabled_set(bt2, EINA_TRUE);
+ elm_object_disabled_set(bt3, EINA_TRUE);
+
+ pb1 = edje_object_part_external_object_get(edje, "ext_pbar1");
+ pb2 = edje_object_part_external_object_get(edje, "ext_pbar2");
+ pb3 = edje_object_part_external_object_get(edje, "ext_pbar3");
+ pb4 = edje_object_part_external_object_get(edje, "ext_pbar4");
+ pb5 = edje_object_part_external_object_get(edje, "ext_pbar5");
+ pb6 = edje_object_part_external_object_get(edje, "ext_pbar6");
+ pb7 = edje_object_part_external_object_get(edje, "ext_pbar7");
+
+ elm_progressbar_value_set(pb1, 0.0);
+ elm_progressbar_value_set(pb3, 0.0);
+ elm_progressbar_value_set(pb4, 0.0);
+ elm_progressbar_value_set(pb6, 0.0);
+
+ elm_progressbar_pulse(pb2, EINA_TRUE);
+ elm_progressbar_pulse(pb5, EINA_TRUE);
+ elm_progressbar_pulse(pb7, EINA_TRUE);
+
+ ecore_timer_add(0.1, _timer_cb, edje);
+}
+
+void
+test_external_pbar(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *ly, *edje, *bt;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("ext_pbar", "Edje External ProgressBar");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test_external.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "external/pbar");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, ly);
+ evas_object_show(ly);
+
+ edje = elm_layout_edje_get(ly);
+ bt = edje_object_part_external_object_get(edje, "ext_button3");
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked, edje);
+
+ evas_object_resize(win, 320, 400);
+ evas_object_show(win);
+}
+
+void
+test_external_video(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *ly;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("ext_video", "Edje External Video");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test_external.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "external/video");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, ly);
+ evas_object_show(ly);
+
+ evas_object_resize(win, 320, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_factory.c b/src/bin/elementary/test_factory.c
new file mode 100644
index 0000000000..daae81b63d
--- /dev/null
+++ b/src/bin/elementary/test_factory.c
@@ -0,0 +1,181 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+// 16 ^ 4 = 65k
+#define BLOK 16
+// homogenous layout
+//#define HOMOG 1
+// aligned to top of box
+#define ZEROALIGN 1
+#define DEFSZ 64
+
+static void
+fac_unrealize(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ // setting factory content to null deletes it
+ printf("--------DELETE for factory %p [f: %p]\n", elm_object_content_get(obj), obj);
+ elm_object_content_set(obj, NULL);
+}
+
+static void
+fac_realize_end(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *bx, *bt;
+ int i;
+
+ bx = elm_box_add(win);
+ printf(" ADD lv 3 = %p [%i]\n", bx, (BLOK * (int)(long)evas_object_data_get(obj, "num")));
+#ifdef HOMOG
+ elm_box_homogeneous_set(bx, EINA_TRUE);
+#endif
+#ifdef ZEROALIGN
+ elm_box_align_set(bx, 0.0, 0.0);
+#endif
+
+ for (i = 0; i < BLOK; i++)
+ {
+ char buf[32];
+
+ snprintf(buf, sizeof(buf), "%i",
+ (i + (BLOK * (int)(long)evas_object_data_get(obj, "num"))));
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(bt, buf);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ }
+
+ elm_object_content_set(obj, bx);
+ evas_object_show(bx);
+}
+
+static void
+fac_realize2(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *bx, *fc;
+ int i;
+
+ bx = elm_box_add(win);
+ printf(" ADD lv 2 = %p [%i]\n", bx, (BLOK * (int)(long)evas_object_data_get(obj, "num")));
+#ifdef HOMOG
+ elm_box_homogeneous_set(bx, EINA_TRUE);
+#endif
+#ifdef ZEROALIGN
+ elm_box_align_set(bx, 0.0, 0.0);
+#endif
+
+ for (i = 0; i < BLOK; i++)
+ {
+ fc = elm_factory_add(win);
+ elm_factory_maxmin_mode_set(fc, EINA_TRUE);
+ // initial height per factory of DEFSZ
+ // scrollbar will be wrong until enough
+ // children have been realized and the
+ // real size is known
+ evas_object_data_set(fc, "num", (void *)(long)(i + (BLOK * (int)(long)evas_object_data_get(obj, "num"))));
+ evas_object_size_hint_min_set(fc, 0, DEFSZ);
+ evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(fc, "realize", fac_realize_end, win);
+ evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win);
+ elm_box_pack_end(bx, fc);
+ evas_object_show(fc);
+ }
+
+ elm_object_content_set(obj, bx);
+ evas_object_show(bx);
+}
+
+static void
+fac_realize1(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *bx, *fc;
+ int i;
+
+ bx = elm_box_add(win);
+ printf(" ADD lv 1 = %p [%i]\n", bx, (BLOK * (int)(long)evas_object_data_get(obj, "num")));
+#ifdef HOMOG
+ elm_box_homogeneous_set(bx, EINA_TRUE);
+#endif
+#ifdef ZEROALIGN
+ elm_box_align_set(bx, 0.0, 0.0);
+#endif
+
+ for (i = 0; i < BLOK; i++)
+ {
+ fc = elm_factory_add(win);
+ elm_factory_maxmin_mode_set(fc, EINA_TRUE);
+ // initial height per factory of DEFSZ
+ // scrollbar will be wrong until enough
+ // children have been realized and the
+ // real size is known
+ evas_object_data_set(fc, "num", (void *)(long)(i + (BLOK * (int)(long)evas_object_data_get(obj, "num"))));
+ evas_object_size_hint_min_set(fc, 0, DEFSZ);
+ evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(fc, "realize", fac_realize2, win);
+// evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win);
+ elm_box_pack_end(bx, fc);
+ evas_object_show(fc);
+ }
+
+ elm_object_content_set(obj, bx);
+ evas_object_show(bx);
+}
+
+void
+test_factory(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *sc, *fc;
+ int i;
+
+ win = elm_win_util_standard_add("factory", "Factory");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+#ifdef HOMOG
+ elm_box_homogeneous_set(bx, EINA_TRUE);
+#endif
+#ifdef ZEROALIGN
+ elm_box_align_set(bx, 0.0, 0.0);
+#endif
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+
+ for (i = 0; i < BLOK; i++)
+ {
+ fc = elm_factory_add(win);
+ elm_factory_maxmin_mode_set(fc, EINA_TRUE);
+ // initial height per factory of DEFSZ
+ // scrollbar will be wrong until enough
+ // children have been realized and the
+ // real size is known
+ evas_object_data_set(fc, "num", (void *)(long)i);
+ evas_object_size_hint_min_set(fc, 0, DEFSZ);
+ evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(fc, "realize", fac_realize1, win);
+// evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win);
+ elm_box_pack_end(bx, fc);
+ evas_object_show(fc);
+ }
+
+ sc = elm_scroller_add(win);
+ elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, sc);
+
+ elm_object_content_set(sc, bx);
+ evas_object_show(bx);
+
+ evas_object_show(sc);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_fileselector.c b/src/bin/elementary/test_fileselector.c
new file mode 100644
index 0000000000..3568fcdb57
--- /dev/null
+++ b/src/bin/elementary/test_fileselector.c
@@ -0,0 +1,589 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <Elementary.h>
+#ifndef ENABLE_NLS
+# ifndef setlocale
+# define setlocale(c, l)
+# endif
+# ifndef libintl_setlocale
+# define libintl_setlocale(c, l)
+# endif
+#endif
+
+#include <Elementary.h>
+
+static void
+my_fileselector_done(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ /* event_info conatin the full path of the selected file
+ * or NULL if none is selected or cancel is pressed */
+ const char *selected = event_info;
+
+ if (selected)
+ printf("Selected file: %s\n", selected);
+ else
+ evas_object_del(data); /* delete the test window */
+}
+
+static void
+my_fileselector_selected(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info)
+{
+ /* event_info conatin the full path of the selected file */
+ const char *selected = event_info;
+ printf("Selected file: %s\n", selected);
+
+ /* or you can query the selection */
+ if (elm_fileselector_multi_select_get(obj))
+ {
+ const Eina_List *li;
+ const Eina_List *paths = elm_fileselector_selected_paths_get(obj);
+ char *path;
+ printf("All selected files are:\n");
+ EINA_LIST_FOREACH(paths, li, path)
+ printf(" %s\n", path);
+ }
+ else
+ printf("or: %s\n", elm_fileselector_selected_get(obj));
+}
+
+static void
+_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static void
+my_fileselector_invalid(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Object *popup;
+ Evas_Object *btn;
+ char error_msg[256];
+
+ snprintf(error_msg, 256, "No such file or directory: %s", (char *)event_info);
+
+ popup = elm_popup_add(data);
+ elm_popup_content_text_wrap_type_set(popup, ELM_WRAP_CHAR);
+ elm_object_part_text_set(popup, "title,text", "Error");
+ elm_object_text_set(popup, error_msg);
+
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "OK");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
+
+ evas_object_show(popup);
+}
+
+static void
+my_fileselector_activated(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ printf("Activated file: %s\n", (char *)event_info);
+}
+
+static void
+_is_save_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ printf("Toggle Is save\n");
+ if (elm_fileselector_is_save_get(fs))
+ elm_fileselector_is_save_set(fs, EINA_FALSE);
+ else
+ elm_fileselector_is_save_set(fs, EINA_TRUE);
+}
+
+static void
+_folder_only_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ printf("Toggle Folder only\n");
+ if (elm_fileselector_folder_only_get(fs))
+ elm_fileselector_folder_only_set(fs, EINA_FALSE);
+ else
+ elm_fileselector_folder_only_set(fs, EINA_TRUE);
+}
+
+static void
+_expandable_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ printf("Toggle Expandable\n");
+ if (elm_fileselector_expandable_get(fs))
+ elm_fileselector_expandable_set(fs, EINA_FALSE);
+ else
+ elm_fileselector_expandable_set(fs, EINA_TRUE);
+}
+
+static void
+_multi_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ Eina_Bool enabled = elm_fileselector_multi_select_get(fs);
+ printf("Toggle Multiple selection to: %s\n", !enabled ? "On" : "Off");
+ elm_fileselector_multi_select_set(fs, !enabled);
+}
+
+static void
+_buttons_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ printf("Toggle Buttons\n");
+ if (elm_fileselector_buttons_ok_cancel_get(fs))
+ elm_fileselector_buttons_ok_cancel_set(fs, EINA_FALSE);
+ else
+ elm_fileselector_buttons_ok_cancel_set(fs, EINA_TRUE);
+}
+
+static void
+_hidden_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ printf("Toggle visibility of hidden files/directories\n");
+ if (elm_fileselector_hidden_visible_get(fs))
+ elm_fileselector_hidden_visible_set(fs, EINA_FALSE);
+ else
+ elm_fileselector_hidden_visible_set(fs, EINA_TRUE);
+}
+
+static void
+_sel_get_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ printf("Get Selected: %s\n", elm_fileselector_selected_get(fs));
+}
+
+static void
+_path_get_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ printf("Get Path: %s\n", elm_fileselector_path_get(fs));
+}
+
+static Evas_Object *
+_option_create(Evas_Object *parent, Evas_Object *fs)
+{
+ Evas_Object *frame = NULL, *box = NULL, *hbox = NULL, *bt = NULL;
+
+ frame = elm_frame_add(parent);
+ evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0);
+ elm_object_text_set(frame, "Options");
+ evas_object_show(frame);
+
+ // outer vertical box
+ box = elm_box_add(frame);
+ elm_object_content_set(frame, box);
+ evas_object_show(box);
+
+ // first horizontal box
+ hbox = elm_box_add(frame);
+ evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_box_pack_end(box, hbox);
+ evas_object_show(hbox);
+
+ bt = elm_check_add(hbox);
+ elm_object_text_set(bt, "is save");
+ elm_check_state_set(bt, elm_fileselector_is_save_get(fs));
+ evas_object_smart_callback_add(bt, "changed", _is_save_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_check_add(hbox);
+ elm_object_text_set(bt, "folder only");
+ elm_check_state_set(bt, elm_fileselector_folder_only_get(fs));
+ evas_object_smart_callback_add(bt, "changed", _folder_only_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_check_add(hbox);
+ elm_object_text_set(bt, "expandable");
+ elm_check_state_set(bt, elm_fileselector_expandable_get(fs));
+ evas_object_smart_callback_add(bt, "changed", _expandable_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ // second horizontal box
+ hbox = elm_box_add(frame);
+ evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_box_pack_end(box, hbox);
+ evas_object_show(hbox);
+
+ bt = elm_check_add(hbox);
+ elm_object_text_set(bt, "multiple selection");
+ elm_check_state_set(bt, elm_fileselector_multi_select_get(fs));
+ evas_object_smart_callback_add(bt, "changed", _multi_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_check_add(hbox);
+ elm_object_text_set(bt, "buttons");
+ elm_check_state_set(bt, elm_fileselector_buttons_ok_cancel_get(fs));
+ evas_object_smart_callback_add(bt, "changed", _buttons_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_check_add(hbox);
+ elm_object_text_set(bt, "hidden");
+ elm_check_state_set(bt, elm_fileselector_hidden_visible_get(fs));
+ evas_object_smart_callback_add(bt, "changed", _hidden_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ return frame;
+}
+
+static Evas_Object *
+_getter_option_create(Evas_Object *parent, Evas_Object *fs)
+{
+ Evas_Object *frame = NULL, *hbox = NULL, *bt = NULL;
+
+ frame = elm_frame_add(parent);
+ elm_object_text_set(frame, "Getter Options");
+ evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0);
+ evas_object_show(frame);
+
+ hbox = elm_box_add(frame);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_object_content_set(frame, hbox);
+ evas_object_show(hbox);
+
+ bt = elm_button_add(hbox);
+ elm_object_text_set(bt, "selected get");
+ evas_object_smart_callback_add(bt, "clicked", _sel_get_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(hbox);
+ elm_object_text_set(bt, "path get");
+ evas_object_smart_callback_add(bt, "clicked", _path_get_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ return frame;
+}
+
+static void
+_mode_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ Elm_Fileselector_Mode mode;
+
+ mode = (elm_fileselector_mode_get(fs) + 1) % ELM_FILESELECTOR_LAST;
+ switch (mode)
+ {
+ case ELM_FILESELECTOR_LIST:
+ printf("Setting mode to: List\n");
+ break;
+ case ELM_FILESELECTOR_GRID:
+ default:
+ printf("Setting mode to: Grid\n");
+ break;
+ }
+
+ elm_radio_value_set(obj, mode);
+ elm_fileselector_mode_set(data, mode);
+}
+
+static Evas_Object *
+_mode_option_create(Evas_Object *parent, Evas_Object *fs)
+{
+ Evas_Object *frame = NULL, *hbox = NULL, *rd = NULL, *rdg = NULL;
+
+ frame = elm_frame_add(parent);
+ evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0);
+ elm_object_text_set(frame, "Mode Option");
+ evas_object_show(frame);
+
+ hbox = elm_box_add(frame);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_object_content_set(frame, hbox);
+ evas_object_show(hbox);
+
+ rdg = rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, ELM_FILESELECTOR_LIST);
+ elm_object_text_set(rd, "List");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _mode_changed_cb, fs);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_group_add(rd, rdg);
+ elm_radio_state_value_set(rd, ELM_FILESELECTOR_GRID);
+ elm_object_text_set(rd, "Grid");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _mode_changed_cb, fs);
+
+ return frame;
+}
+
+static void
+_sort_selected_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *fs = evas_object_data_get(obj, "fileselector");
+ const char *selected = elm_object_item_text_get(event_info);
+
+ printf("selected sort method : %s\n", selected);
+ elm_object_text_set(obj, selected);
+ elm_fileselector_sort_method_set(fs, (Elm_Fileselector_Sort)data);
+}
+
+static Evas_Object *
+_sort_option_create(Evas_Object *win, Evas_Object *parent, Evas_Object *fs)
+{
+ Evas_Object *frame = NULL, *hbox = NULL, *hoversel;
+
+ frame = elm_frame_add(parent);
+ evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0);
+ elm_object_text_set(frame, "Sort Option");
+ evas_object_show(frame);
+
+ hbox = elm_box_add(frame);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_object_content_set(frame, hbox);
+ evas_object_show(hbox);
+
+ hoversel = elm_hoversel_add(hbox);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ evas_object_data_set(hoversel, "fileselector", fs);
+ elm_object_text_set(hoversel, "Choose sort method");
+
+ elm_hoversel_item_add(hoversel, "File Name(asc)", NULL, ELM_ICON_NONE,
+ _sort_selected_cb,
+ (const void *)ELM_FILESELECTOR_SORT_BY_FILENAME_ASC);
+ elm_hoversel_item_add(hoversel, "File Name(desc)", NULL, ELM_ICON_NONE,
+ _sort_selected_cb,
+ (const void *) ELM_FILESELECTOR_SORT_BY_FILENAME_DESC);
+ elm_hoversel_item_add(hoversel, "Type(asc)", NULL, ELM_ICON_NONE,
+ _sort_selected_cb,
+ (const void *) ELM_FILESELECTOR_SORT_BY_TYPE_ASC);
+ elm_hoversel_item_add(hoversel, "Type(desc)", NULL, ELM_ICON_NONE,
+ _sort_selected_cb,
+ (const void *) ELM_FILESELECTOR_SORT_BY_TYPE_DESC);
+ elm_hoversel_item_add(hoversel, "Size(asc)", NULL, ELM_ICON_NONE,
+ _sort_selected_cb,
+ (const void *) ELM_FILESELECTOR_SORT_BY_SIZE_ASC);
+ elm_hoversel_item_add(hoversel, "Size(desc)", NULL, ELM_ICON_NONE,
+ _sort_selected_cb,
+ (const void *) ELM_FILESELECTOR_SORT_BY_SIZE_DESC);
+ elm_hoversel_item_add(hoversel, "Modified time(asc)", NULL, ELM_ICON_NONE,
+ _sort_selected_cb,
+ (const void *) ELM_FILESELECTOR_SORT_BY_MODIFIED_ASC);
+ elm_hoversel_item_add(hoversel, "Modified time(desc)", NULL, ELM_ICON_NONE,
+ _sort_selected_cb,
+ (const void *) ELM_FILESELECTOR_SORT_BY_MODIFIED_DESC);
+
+ elm_box_pack_end(hbox, hoversel);
+ evas_object_show(hoversel);
+
+ return frame;
+}
+
+static void
+_small_icon_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ Evas_Coord w, h;
+
+ elm_fileselector_thumbnail_size_get(fs, &w, &h);
+
+ elm_fileselector_thumbnail_size_set(fs, 56, 56);
+ printf("Thumbnail icon was changed from %dx%d to 56x56\n", w, h);
+}
+
+static void
+_middle_icon_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ Evas_Coord w, h;
+
+ elm_fileselector_thumbnail_size_get(fs, &w, &h);
+
+ elm_fileselector_thumbnail_size_set(fs, 78, 78);
+ printf("Thumbnail icon was changed from %dx%d to 78x78\n", w, h);
+}
+
+static void
+_big_icon_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs = data;
+ Evas_Coord w, h;
+
+ elm_fileselector_thumbnail_size_get(fs, &w, &h);
+
+ elm_fileselector_thumbnail_size_set(fs, 131, 131);
+ printf("Thumbnail icon was changed from %dx%d to 131x131\n", w, h);
+}
+
+static Evas_Object *
+_thumbnail_size_option_create(Evas_Object *parent, Evas_Object *fs)
+{
+ Evas_Object *frame = NULL, *hbox = NULL, *bt = NULL;
+
+ frame = elm_frame_add(parent);
+ elm_object_text_set(frame, "Thumbnail Size");
+ evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0);
+ evas_object_show(frame);
+
+ hbox = elm_box_add(frame);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_object_content_set(frame, hbox);
+ evas_object_show(hbox);
+
+ bt = elm_button_add(hbox);
+ elm_object_text_set(bt, "Small icon");
+ evas_object_smart_callback_add(bt, "clicked", _small_icon_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(hbox);
+ elm_object_text_set(bt, "Middle icon");
+ evas_object_smart_callback_add(bt, "clicked", _middle_icon_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(hbox);
+ elm_object_text_set(bt, "Big icon");
+ evas_object_smart_callback_add(bt, "clicked", _big_icon_clicked, fs);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ return frame;
+}
+
+static Eina_Bool
+_all_filter(const char *path EINA_UNUSED,
+ Eina_Bool dir EINA_UNUSED,
+ void *data EINA_UNUSED)
+{
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_edje_filter(const char *path, Eina_Bool dir,
+ void *data EINA_UNUSED)
+{
+ if (dir) return EINA_TRUE;
+
+ if (eina_str_has_extension(path, ".edc") ||
+ eina_str_has_extension(path, ".edj"))
+ return EINA_TRUE;
+ return EINA_FALSE;
+}
+
+void
+test_fileselector(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fs, *box, *vbox, *sep;
+ const char * home_env;
+
+ /* Set the locale according to the system pref.
+ * If you don't do so the file selector will order the files list in
+ * a case sensitive manner
+ */
+ setlocale(LC_ALL, "");
+
+ elm_need_ethumb();
+ elm_need_efreet();
+
+ win = elm_win_util_standard_add("fileselector", "File Selector");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ fs = elm_fileselector_add(box);
+ evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fs, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, fs);
+ evas_object_show(fs);
+
+ /* enable the fs file name entry */
+ elm_fileselector_is_save_set(fs, EINA_TRUE);
+ /* make the file list a tree with dir expandable in place */
+ elm_fileselector_expandable_set(fs, EINA_FALSE);
+ /* start the fileselector in the home dir */
+ home_env = eina_environment_home_get();
+ elm_fileselector_path_set(fs, home_env);
+
+ /* provides suggested name (just for showing) */
+ elm_fileselector_current_name_set(fs, "No name");
+
+ /* add filesters */
+ elm_fileselector_mime_types_filter_append(fs, "text/*", "Text Files");
+ elm_fileselector_mime_types_filter_append(fs, "image/*", "Image Files");
+ elm_fileselector_custom_filter_append(fs, _all_filter, NULL, "All Files");
+ elm_fileselector_custom_filter_append(fs, _edje_filter, NULL, "Edje Files");
+
+ evas_object_smart_callback_add(fs, "done", my_fileselector_done, win);
+ evas_object_smart_callback_add(fs, "selected", my_fileselector_selected,
+ win);
+ evas_object_smart_callback_add(fs, "selected,invalid",
+ my_fileselector_invalid, win);
+ evas_object_smart_callback_add(fs, "activated", my_fileselector_activated,
+ win);
+
+ sep = elm_separator_add(box);
+ elm_box_pack_end(box, sep);
+ evas_object_show(sep);
+
+ vbox = elm_box_add(box);
+ elm_box_pack_end(box, vbox);
+ evas_object_show(vbox);
+
+ /* test options */
+ elm_box_pack_end(vbox, _option_create(vbox, fs));
+ elm_box_pack_end(vbox, _getter_option_create(vbox, fs));
+ elm_box_pack_end(vbox, _mode_option_create(vbox, fs));
+ elm_box_pack_end(vbox, _sort_option_create(win, vbox, fs));
+ elm_box_pack_end(vbox, _thumbnail_size_option_create(vbox, fs));
+
+ evas_object_resize(win, 550, 500);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_fileselector_button.c b/src/bin/elementary/test_fileselector_button.c
new file mode 100644
index 0000000000..f87db9d0e9
--- /dev/null
+++ b/src/bin/elementary/test_fileselector_button.c
@@ -0,0 +1,248 @@
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <Elementary.h>
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ Evas_Object *box; /* Additional data defined by test */
+ Eina_Bool free_data; /* free data on close */
+};
+typedef struct _api_data api_data;
+enum _api_state
+{
+ ICON_UNSET,
+ WINDOW_TITLE_SET,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+ const Eina_List *items = elm_box_children_get(api->box);
+ if (!eina_list_count(items))
+ return;
+
+ /* Get first item of list of vbox children */
+ Evas_Object *fs_bt = eina_list_nth(items, 0);
+
+ /* use elm_box_children_get() to get list of children */
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case ICON_UNSET:
+ elm_object_part_content_unset(fs_bt, NULL);
+ break;
+
+ case WINDOW_TITLE_SET:
+ elm_fileselector_button_window_title_set(fs_bt, "Custom title from API");
+ break;
+
+ case API_STATE_LAST:
+
+ break;
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+create_dir_struct(void)
+{
+ FILE *fp;
+ if (mkdir("/tmp/test_fs_bt", S_IRWXU) < 0)
+ printf("make dir /tmp/test_fs_bt failed!\n");
+ fp = fopen("/tmp/test_fs_bt/a_file.txt", "w");
+ if (fp) fclose(fp);
+ fp = fopen("/tmp/test_fs_bt/k_file.txt", "w");
+ if (fp) fclose(fp);
+ fp = fopen("/tmp/test_fs_bt/m_file.txt", "w");
+ if (fp) fclose(fp);
+
+ if (mkdir("/tmp/test_fs_bt/a_subdir", S_IRWXU) < 0)
+ printf("make dir /tmp/test_fs_bt/a_subdir failed!\n");
+ fp = fopen("/tmp/test_fs_bt/a_subdir/d_sub_file.txt", "w");
+ if (fp) fclose(fp);
+ fp = fopen("/tmp/test_fs_bt/a_subdir/j_sub_file.txt", "w");
+ if (fp) fclose(fp);
+}
+
+static void
+_file_chosen(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Object *entry = data;
+ const char *file = event_info;
+ if (file)
+ {
+ elm_object_text_set(entry, file);
+ printf("File chosen: %s\n", file);
+ }
+ else
+ printf("File selection canceled.\n");
+}
+
+static void
+_inwin_mode_toggle(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs_bt = data;
+ Eina_Bool value = elm_fileselector_button_inwin_mode_get(fs_bt);
+ elm_fileselector_button_inwin_mode_set(fs_bt, !value);
+ printf("Inwin mode set to: %s\n", value ? "false" : "true");
+}
+
+static void
+_current_sel_toggle(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs_bt = data;
+ Eina_Bool value = elm_check_state_get(obj);
+ elm_fileselector_is_save_set(fs_bt, value);
+ printf("Current selection editable entry set to: %s\n",
+ value ? "true" : "false");
+}
+
+static void
+_folder_only_toggle(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs_bt = data;
+ Eina_Bool value = elm_check_state_get(obj);
+ elm_fileselector_folder_only_set(fs_bt, value);
+ printf("Folder only flag set to: %s\n", value ? "true" : "false");
+}
+
+static void
+_expandable_toggle(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs_bt = data;
+ Eina_Bool value = elm_check_state_get(obj);
+ elm_fileselector_expandable_set(fs_bt, value);
+ printf("Expandable flag set to: %s\n", value ? "true" : "false");
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_fileselector_button(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *vbox, *hbox, *ic, *bt, *fs_bt, *en, *lb, *bxx;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("fileselector-button", "File Selector Button");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ vbox = elm_box_add(win);
+ api->box = vbox;
+ evas_object_show(vbox);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, vbox);
+
+ create_dir_struct(); /* Create a dir struct in /tmp */
+ /* file selector button */
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "file");
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ fs_bt = elm_fileselector_button_add(win);
+ elm_object_text_set(fs_bt, "Select a file");
+ elm_object_part_content_set(fs_bt, "icon", ic);
+ elm_fileselector_path_set(fs_bt, "/tmp/test_fs_bt");
+
+ elm_box_pack_end(vbox, fs_bt);
+ evas_object_show(fs_bt);
+ evas_object_show(ic);
+
+ /* attribute setting buttons */
+ hbox = elm_box_add(win);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_box_pack_end(vbox, hbox);
+ evas_object_show(hbox);
+
+ bt = elm_check_add(win);
+ elm_object_style_set(bt, "toggle");
+ elm_object_text_set(bt, "current selection text entry");
+ evas_object_smart_callback_add(bt, "changed", _current_sel_toggle, fs_bt);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_check_add(win);
+ elm_object_style_set(bt, "toggle");
+ elm_object_text_set(bt, "Inwin mode");
+ elm_check_state_set(bt, elm_fileselector_button_inwin_mode_get(fs_bt));
+ evas_object_smart_callback_add(bt, "changed", _inwin_mode_toggle, fs_bt);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_check_add(win);
+ elm_object_style_set(bt, "toggle");
+ elm_object_text_set(bt, "Folder only mode");
+ evas_object_smart_callback_add(bt, "changed", _folder_only_toggle, fs_bt);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_check_add(win);
+ elm_object_style_set(bt, "toggle");
+ elm_object_text_set(bt, "Expandable mode");
+ evas_object_smart_callback_add(bt, "changed", _expandable_toggle, fs_bt);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Last selection:");
+ elm_box_pack_end(vbox, lb);
+ evas_object_show(lb);
+
+ en = elm_entry_add(win);
+ elm_entry_line_wrap_set(en, ELM_WRAP_NONE);
+ elm_entry_editable_set(en, EINA_FALSE);
+ evas_object_smart_callback_add(fs_bt, "file,chosen", _file_chosen, en);
+ elm_box_pack_end(vbox, en);
+ evas_object_show(en);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_fileselector_entry.c b/src/bin/elementary/test_fileselector_entry.c
new file mode 100644
index 0000000000..07d6cf0fba
--- /dev/null
+++ b/src/bin/elementary/test_fileselector_entry.c
@@ -0,0 +1,259 @@
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <Elementary.h>
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ void *box; /* Use this to get box content */
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ ICON_UNSET,
+ WINDOW_TITLE_SET,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+ const Eina_List *items = elm_box_children_get(api->box);
+ if (!eina_list_count(items))
+ return;
+
+ /* Get first item of list of vbox children */
+ Evas_Object *fs_bt = eina_list_nth(items, 0);
+
+ /* use elm_box_children_get() to get list of children */
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case ICON_UNSET:
+ elm_object_part_content_unset(fs_bt, NULL);
+ break;
+
+ case WINDOW_TITLE_SET:
+ elm_fileselector_entry_window_title_set(fs_bt, "Custom title from API");
+ break;
+
+ case API_STATE_LAST:
+
+ break;
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+create_dir_struct(void)
+{
+ FILE *fp;
+ int ret = 0;
+
+ ret = mkdir("/tmp/test_fs_bt", S_IRWXU);
+ if (ret < 0) return;
+ fp = fopen("/tmp/test_fs_bt/a_file.txt", "w");
+ if (fp) fclose(fp);
+ fp = fopen("/tmp/test_fs_bt/k_file.txt", "w");
+ if (fp) fclose(fp);
+ fp = fopen("/tmp/test_fs_bt/m_file.txt", "w");
+ if (fp) fclose(fp);
+
+ ret = mkdir("/tmp/test_fs_bt/a_subdir", S_IRWXU);
+ if (ret < 0) return;
+ fp = fopen("/tmp/test_fs_bt/a_subdir/d_sub_file.txt", "w");
+ if (fp) fclose(fp);
+ fp = fopen("/tmp/test_fs_bt/a_subdir/j_sub_file.txt", "w");
+ if (fp) fclose(fp);
+}
+
+static void
+_file_chosen(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Object *entry = data;
+ char *file = event_info;
+ elm_object_text_set(entry, file);
+ printf("File chosen: %s\n", file);
+}
+
+static void
+_inwin_mode_toggle(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs_en = data;
+ Eina_Bool value = elm_fileselector_entry_inwin_mode_get(fs_en);
+ elm_fileselector_entry_inwin_mode_set(fs_en, !value);
+ printf("Inwin mode set to: %s\n", value ? "false" : "true");
+}
+
+static void
+_folder_only_toggle(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs_en = data;
+ Evas_Object *ic = elm_object_part_content_get(fs_en, "button icon");
+ Eina_Bool value = elm_fileselector_folder_only_get(fs_en);
+ elm_fileselector_folder_only_set(fs_en, !value);
+ printf("Folder only flag set to: %s\n", value ? "false" : "true");
+ if (!value)
+ {
+ if (ic) elm_icon_standard_set(ic, "folder");
+ elm_object_text_set(fs_en, "Select a folder");
+ }
+ else
+ {
+ if (ic) elm_icon_standard_set(ic, "file");
+ elm_object_text_set(fs_en, "Select a file");
+ }
+}
+
+static void
+_expandable_toggle(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs_en = data;
+ Eina_Bool value = elm_fileselector_expandable_get(fs_en);
+ elm_fileselector_expandable_set(fs_en, !value);
+ printf("Expandable flag set to: %s\n", value ? "false" : "true");
+}
+
+static void
+_disabled_toggle(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs_en = data;
+ Eina_Bool value = elm_object_disabled_get(fs_en);
+ elm_object_disabled_set(fs_en, !value);
+ printf("Disabled flag set to: %s\n", value ? "false" : "true");
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_fileselector_entry(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *vbox, *hbox, *ic, *bt, *fs_en, *en, *lb, *bxx;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("fileselector-entry", "File Selector Entry");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ vbox = elm_box_add(win);
+ evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->box = vbox;
+ evas_object_show(vbox);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, vbox);
+
+ create_dir_struct(); /* Create a dir struct in /tmp */
+
+ /* file selector entry */
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "file");
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ fs_en = elm_fileselector_entry_add(win);
+ elm_fileselector_path_set(fs_en, "/tmp/test_fs_bt");
+ elm_object_text_set(fs_en, "Select a file");
+ elm_object_part_content_set(fs_en, "button icon", ic);
+ evas_object_size_hint_weight_set(fs_en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fs_en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ elm_box_pack_end(vbox, fs_en);
+ evas_object_show(fs_en);
+ evas_object_show(ic);
+
+ /* attribute setting buttons */
+ hbox = elm_box_add(win);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_box_pack_end(vbox, hbox);
+ evas_object_show(hbox);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Toggle inwin mode");
+ evas_object_smart_callback_add(bt, "clicked", _inwin_mode_toggle, fs_en);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Toggle folder only mode");
+ evas_object_smart_callback_add(bt, "clicked", _folder_only_toggle, fs_en);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Toggle expandable mode");
+ evas_object_smart_callback_add(bt, "clicked", _expandable_toggle, fs_en);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Last selection:");
+ elm_box_pack_end(vbox, lb);
+ evas_object_show(lb);
+
+ hbox = elm_box_add(win);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_box_pack_end(vbox, hbox);
+ evas_object_show(hbox);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Toggle disabled");
+ evas_object_smart_callback_add(bt, "clicked", _disabled_toggle, fs_en);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ en = elm_entry_add(win);
+ elm_entry_line_wrap_set(en, ELM_WRAP_NONE);
+ elm_entry_editable_set(en, EINA_FALSE);
+ evas_object_smart_callback_add(fs_en, "file,chosen", _file_chosen, en);
+ elm_box_pack_end(vbox, en);
+ evas_object_show(en);
+
+ evas_object_resize(win, 400, 500);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_flip.c b/src/bin/elementary/test_flip.c
new file mode 100644
index 0000000000..d885a7bd5b
--- /dev/null
+++ b/src/bin/elementary/test_flip.c
@@ -0,0 +1,711 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+void
+my_fl_1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = data;
+ elm_flip_go(fl, ELM_FLIP_ROTATE_Y_CENTER_AXIS);
+}
+
+void
+my_fl_2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = data;
+ elm_flip_go(fl, ELM_FLIP_ROTATE_X_CENTER_AXIS);
+}
+
+void
+my_fl_3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = data;
+ elm_flip_go(fl, ELM_FLIP_ROTATE_XZ_CENTER_AXIS);
+}
+
+void
+my_fl_4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = data;
+ elm_flip_go(fl, ELM_FLIP_ROTATE_YZ_CENTER_AXIS);
+}
+
+void
+my_fl_5(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = data;
+ elm_flip_go(fl, ELM_FLIP_CUBE_LEFT);
+}
+
+void
+my_fl_6(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = data;
+ elm_flip_go(fl, ELM_FLIP_CUBE_RIGHT);
+}
+
+void
+my_fl_7(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = data;
+ elm_flip_go(fl, ELM_FLIP_CUBE_UP);
+}
+
+void
+my_fl_8(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = data;
+ elm_flip_go(fl, ELM_FLIP_CUBE_DOWN);
+}
+
+void
+my_fl_front(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = data;
+ elm_flip_go_to(fl, EINA_TRUE, ELM_FLIP_ROTATE_X_CENTER_AXIS);
+}
+
+void
+my_fl_back(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = data;
+ elm_flip_go_to(fl, EINA_FALSE, ELM_FLIP_ROTATE_X_CENTER_AXIS);
+}
+
+void
+test_flip(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *fl, *o, *bt, *ly;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("flip", "Flip");
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fl = elm_flip_add(win);
+ evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, fl);
+
+ o = elm_bg_add(win);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg");
+ elm_bg_file_set(o, buf, NULL);
+ elm_object_part_content_set(fl, "front", o);
+ evas_object_show(o);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "layout");
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_part_content_set(fl, "back", ly);
+ evas_object_show(ly);
+
+ bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 1");
+ elm_object_part_content_set(ly, "element1", bt);
+
+ bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 2");
+ elm_object_part_content_set(ly, "element2", bt);
+
+ bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 3");
+ elm_object_part_content_set(ly, "element3", bt);
+
+ evas_object_show(fl);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "1");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "2");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_2, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "3");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_3, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "4");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_4, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "5");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_5, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "6");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "7");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_7, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "8");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_8, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+void
+test_flip2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *bx, *bx2, *fl, *o, *bt, *tb, *li, *en;
+ char buf[PATH_MAX];
+
+ win = elm_win_add(NULL, "flip2", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Flip 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg");
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fl = elm_flip_add(win);
+ evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, fl);
+
+ o = elm_box_add(win);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ tb = elm_toolbar_add(win);
+ elm_toolbar_homogeneous_set(tb, EINA_FALSE);
+ evas_object_size_hint_weight_set(tb, 0.0, 0.0);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0);
+
+ elm_toolbar_item_append(tb, "arrow_left", "Hello", NULL, NULL);
+ elm_toolbar_item_append(tb, "arrow_right", "Out", NULL, NULL);
+ elm_toolbar_item_append(tb, "home", "There", NULL, NULL);
+ elm_toolbar_item_append(tb, "refresh", "World", NULL, NULL);
+
+ elm_box_pack_end(o, tb);
+ evas_object_show(tb);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ elm_list_item_append(li, "This is a list", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Second item", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "3rd", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Fourth", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Number five is alive!", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "The quick brown fox jumps over the lazy dog", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Booyah", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "And another item", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "More of them", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Get with it", NULL, NULL, NULL, NULL);
+
+ elm_list_go(li);
+
+ elm_box_pack_end(o, li);
+ evas_object_show(li);
+
+ elm_object_part_content_set(fl, "front", o);
+ evas_object_show(o);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_line_wrap_set(en, ELM_WRAP_NONE);
+ snprintf(buf, sizeof(buf),
+ "This is an entry widget in this window that<br/>"
+ "uses markup <b>like this</> for styling and<br/>"
+ "formatting <em>like this</>, as well as<br/>"
+ "<a href=X><link>links in the text</></a>, so enter text<br/>"
+ "in here to edit it. By the way, links are<br/>"
+ "called <a href=anc-02>Anchors</a> so you will need<br/>"
+ "to refer to them this way.<br/>"
+ "<br/>"
+
+ "Also you can stick in items with (relsize + ascent): "
+ "<item relsize=16x16 vsize=ascent href=emoticon/evil-laugh></item>"
+ " (full) "
+ "<item relsize=16x16 vsize=full href=emoticon/guilty-smile></item>"
+ " (to the left)<br/>"
+
+ "Also (size + ascent): "
+ "<item size=16x16 vsize=ascent href=emoticon/haha></item>"
+ " (full) "
+ "<item size=16x16 vsize=full href=emoticon/happy-panting></item>"
+ " (before this)<br/>"
+
+ "And as well (absize + ascent): "
+ "<item absize=64x64 vsize=ascent href=emoticon/knowing-grin></item>"
+ " (full) "
+ "<item absize=64x64 vsize=full href=emoticon/not-impressed></item>"
+ " or even paths to image files on disk too like: "
+ "<item absize=96x128 vsize=full href=file://%s/images/sky_01.jpg></item>"
+ " ... end."
+ , elm_app_data_dir_get()
+ );
+ elm_object_text_set(en, buf);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ elm_object_part_content_set(fl, "back", en);
+ evas_object_show(en);
+
+ evas_object_show(fl);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "1");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "2");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_2, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "3");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_3, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "4");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_4, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "5");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_5, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "6");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+void
+test_flip3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *fl, *fl_f, *fl_b, *o, *bt, *fr;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("flip3", "Flip Flip");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fl = elm_flip_add(win);
+ evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, fl);
+ evas_object_show(fl);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Front");
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_part_content_set(fl, "front", fr);
+ evas_object_show(fr);
+
+ fl_f = elm_flip_add(win);
+ evas_object_size_hint_align_set(fl_f, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(fl_f, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(fr, fl_f);
+ evas_object_show(fl_f);
+
+ o = elm_bg_add(win);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg");
+ elm_bg_file_set(o, buf, NULL);
+ elm_object_part_content_set(fl_f, "front", o);
+ evas_object_show(o);
+
+ o = elm_bg_add(win);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_02.jpg");
+ elm_bg_file_set(o, buf, NULL);
+ elm_object_part_content_set(fl_f, "back", o);
+ evas_object_show(o);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Back");
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_part_content_set(fl, "back", fr);
+ evas_object_show(fr);
+
+ fl_b = elm_flip_add(win);
+ evas_object_size_hint_align_set(fl_b, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(fl_b, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(fr, fl_b);
+ evas_object_show(fl_b);
+
+ o = elm_bg_add(win);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_03.jpg");
+ elm_bg_file_set(o, buf, NULL);
+ elm_object_part_content_set(fl_b, "front", o);
+ evas_object_show(o);
+
+ o = elm_bg_add(win);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_04.jpg");
+ elm_bg_file_set(o, buf, NULL);
+ elm_object_part_content_set(fl_b, "back", o);
+ evas_object_show(o);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Main Flip");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Front Flip");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl_f);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Back Flip");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl_b);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+static void
+my_fl_go(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+
+ Evas_Object *rdg = evas_object_data_get(win, "rdg");
+ Evas_Object *rd = elm_radio_selected_object_get(rdg);
+ Evas_Object *fl = evas_object_data_get(win, "fl");
+
+ const char *text = elm_object_text_get(rd);
+ if (!text) return;
+
+ if (!strcmp(text, "Rotate"))
+ elm_flip_go(fl, ELM_FLIP_ROTATE_Y_CENTER_AXIS);
+ else if (!strcmp(text, "Cube"))
+ elm_flip_go(fl, ELM_FLIP_CUBE_RIGHT);
+ else if (!strcmp(text, "Page"))
+ elm_flip_go(fl, ELM_FLIP_PAGE_RIGHT);
+}
+
+static void
+my_fl_ch(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *fl = evas_object_data_get(win, "fl");
+ Evas_Object *rdg = evas_object_data_get(win, "rdg");
+ elm_flip_interaction_set(fl, elm_radio_value_get(rdg));
+}
+
+void
+test_flip_interactive(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *fl, *im, *li, *bt, *rd, *rdg;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("flip-interactive", "Flip Interactive");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fl = elm_flip_add(win);
+ evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, fl);
+ evas_object_data_set(win, "fl", fl);
+
+ elm_flip_interaction_set(fl, ELM_FLIP_INTERACTION_NONE);
+ elm_flip_interaction_direction_enabled_set(fl, ELM_FLIP_DIRECTION_UP, EINA_TRUE);
+ elm_flip_interaction_direction_enabled_set(fl, ELM_FLIP_DIRECTION_DOWN, EINA_TRUE);
+ elm_flip_interaction_direction_enabled_set(fl, ELM_FLIP_DIRECTION_LEFT, EINA_TRUE);
+ elm_flip_interaction_direction_enabled_set(fl, ELM_FLIP_DIRECTION_RIGHT, EINA_TRUE);
+ elm_flip_interaction_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_UP, 0.25);
+ elm_flip_interaction_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_DOWN, 0.25);
+ elm_flip_interaction_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_LEFT, 0.25);
+ elm_flip_interaction_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_RIGHT, 0.25);
+ evas_object_show(fl);
+
+ im = evas_object_image_filled_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ snprintf(buf, sizeof(buf), "%s/images/%s",
+ elm_app_data_dir_get(), "twofish.jpg");
+ evas_object_image_file_set(im, buf, NULL);
+ elm_object_part_content_set(fl, "front", im);
+ evas_object_show(im);
+
+#if 0
+ im = evas_object_image_filled_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ snprintf(buf, sizeof(buf), "%s/images/%s",
+ elm_app_data_dir_get(), "sky_04.jpg");
+ evas_object_image_file_set(im, buf, NULL);
+ elm_object_part_content_set(fl, "back", im);
+ evas_object_show(im);
+#else
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_list_item_append(li, "Item 0", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Item 1", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Item 2", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Item 3 (Which is very long just for testing purposes)", NULL, NULL, NULL, NULL);
+ elm_list_go(li);
+ elm_object_part_content_set(fl, "back", li);
+ evas_object_show(li);
+#endif
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_NONE);
+ elm_object_text_set(rd, "None");
+ elm_box_pack_end(bx, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", my_fl_ch, win);
+ rdg = rd;
+ evas_object_data_set(win, "rdg", rdg);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_ROTATE);
+ elm_object_text_set(rd, "Rotate");
+ elm_radio_group_add(rd, rdg);
+ elm_box_pack_end(bx, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", my_fl_ch, win);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_CUBE);
+ elm_object_text_set(rd, "Cube");
+ elm_radio_group_add(rd, rdg);
+ elm_box_pack_end(bx, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", my_fl_ch, win);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_PAGE);
+ elm_object_text_set(rd, "Page");
+ elm_radio_group_add(rd, rdg);
+ elm_box_pack_end(bx, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", my_fl_ch, win);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Flip Go");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_go, win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+void
+test_flip_to(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *fl, *o, *bt, *ly;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("flip-to", "Flip To");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fl = elm_flip_add(win);
+ evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, fl);
+
+ o = elm_bg_add(win);
+ evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg");
+ elm_bg_file_set(o, buf, NULL);
+ elm_object_part_content_set(fl, "front", o);
+ evas_object_show(o);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "layout");
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_part_content_set(fl, "back", ly);
+ evas_object_show(ly);
+
+ bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 1");
+ elm_object_part_content_set(ly, "element1", bt);
+
+ bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 2");
+ elm_object_part_content_set(ly, "element2", bt);
+
+ bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 3");
+ elm_object_part_content_set(ly, "element3", bt);
+
+ evas_object_show(fl);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Show Front");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_front, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Show Back");
+ evas_object_smart_callback_add(bt, "clicked", my_fl_back, fl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_flip_page.c b/src/bin/elementary/test_flip_page.c
new file mode 100644
index 0000000000..5fbb9dfb3a
--- /dev/null
+++ b/src/bin/elementary/test_flip_page.c
@@ -0,0 +1,909 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct _State State;
+typedef struct _Slice Slice;
+
+typedef struct _Vertex2 Vertex2;
+typedef struct _Vertex3 Vertex3;
+
+struct _State
+{
+ Evas_Object *front, *back;
+ Evas_Coord down_x, down_y, x, y;
+ Eina_Bool down : 1;
+ Eina_Bool backflip : 1;
+
+ Ecore_Animator *anim;
+ Ecore_Job *job;
+ Evas_Coord ox, oy, w, h;
+ int slices_w, slices_h;
+ Slice **slices, **slices2;
+ int dir; // 0 == left, 1 == right, 2 == up, 3 == down
+ int finish;
+};
+
+struct _Slice
+{
+ Evas_Object *obj;
+ // (0)---(1)
+ // | |
+ // | |
+ // (3)---(2)
+ double u[4], v[4], x[4], y[4], z[4];
+};
+
+struct _Vertex2
+{
+ double x, y;
+};
+
+struct _Vertex3
+{
+ double x, y, z;
+};
+
+static State state =
+{
+ NULL, NULL,
+ 0, 0, 0, 0,
+ 0,
+ 0,
+
+ NULL,
+ NULL,
+ 0, 0, 0, 0,
+ 0, 0,
+ NULL, NULL,
+ -1,
+ 0
+};
+
+static Slice *
+_slice_new(State *st EINA_UNUSED, Evas_Object *obj)
+{
+ Slice *sl;
+
+ sl = calloc(1, sizeof(Slice));
+ if (!sl) return NULL;
+ sl->obj = evas_object_image_add(evas_object_evas_get(obj));
+ evas_object_image_smooth_scale_set(sl->obj, EINA_FALSE);
+ evas_object_pass_events_set(sl->obj, EINA_TRUE);
+ evas_object_image_source_set(sl->obj, obj);
+ return sl;
+}
+
+static void
+_slice_free(Slice *sl)
+{
+ evas_object_del(sl->obj);
+ free(sl);
+}
+
+static void
+_slice_apply(State *st, Slice *sl,
+ Evas_Coord x EINA_UNUSED, Evas_Coord y EINA_UNUSED, Evas_Coord w, Evas_Coord h EINA_UNUSED,
+ Evas_Coord ox, Evas_Coord oy, Evas_Coord ow, Evas_Coord oh)
+{
+ Evas_Map *m;
+ int i;
+
+ m = evas_map_new(4);
+ if (!m) return;
+ evas_map_smooth_set(m, EINA_FALSE);
+ for (i = 0; i < 4; i++)
+ {
+ evas_map_point_color_set(m, i, 255, 255, 255, 255);
+ if (st->dir == 0)
+ {
+ int p[4] = { 0, 1, 2, 3 };
+ evas_map_point_coord_set(m, i, ox + sl->x[p[i]], oy + sl->y[p[i]], sl->z[p[i]]);
+ evas_map_point_image_uv_set(m, i, sl->u[p[i]] , sl->v[p[i]]);
+ }
+ else if (st->dir == 1)
+ {
+ int p[4] = { 1, 0, 3, 2 };
+ evas_map_point_coord_set(m, i, ox + (w - sl->x[p[i]]), oy + sl->y[p[i]], sl->z[p[i]]);
+ evas_map_point_image_uv_set(m, i, ow - sl->u[p[i]] , sl->v[p[i]]);
+ }
+ else if (st->dir == 2)
+ {
+ int p[4] = { 1, 0, 3, 2 };
+ evas_map_point_coord_set(m, i, ox + sl->y[p[i]], oy + sl->x[p[i]], sl->z[p[i]]);
+ evas_map_point_image_uv_set(m, i, sl->v[p[i]] , sl->u[p[i]]);
+ }
+ else if (st->dir == 3)
+ {
+ int p[4] = { 0, 1, 2, 3 };
+ evas_map_point_coord_set(m, i, ox + sl->y[p[i]], oy + (w - sl->x[p[i]]), sl->z[p[i]]);
+ evas_map_point_image_uv_set(m, i, sl->v[p[i]] , oh - sl->u[p[i]]);
+ }
+ }
+ evas_object_map_enable_set(sl->obj, EINA_TRUE);
+ evas_object_image_fill_set(sl->obj, 0, 0, ow, oh);
+ evas_object_map_set(sl->obj, m);
+ evas_map_free(m);
+}
+
+static void
+_slice_3d(State *st EINA_UNUSED, Slice *sl, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
+{
+ Evas_Map *m = (Evas_Map *)evas_object_map_get(sl->obj);
+ int i;
+
+ if (!m) return;
+ // vanishing point is center of page, and focal dist is 1024
+ evas_map_util_3d_perspective(m, x + (w / 2), y + (h / 2), 0, 1024);
+ for (i = 0; i < 4; i++)
+ {
+ Evas_Coord xx, yy, zz;
+ evas_map_point_coord_get(m, i, &xx, &yy, &zz);
+ evas_map_point_coord_set(m, i, xx, yy, 0);
+ }
+ if (evas_map_util_clockwise_get(m)) evas_object_show(sl->obj);
+ else evas_object_hide(sl->obj);
+ evas_object_map_set(sl->obj, m);
+}
+
+static void
+_slice_light(State *st EINA_UNUSED, Slice *sl, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
+{
+ Evas_Map *m = (Evas_Map *)evas_object_map_get(sl->obj);
+ int i;
+
+ if (!m) return;
+ evas_map_util_3d_lighting(m,
+ // light position
+ // (centered over page 10 * h toward camera)
+ x + (w / 2) , y + (h / 2) , -10000,
+ 255, 255, 255, // light color
+ 0 , 0 , 0); // ambient minimum
+ // multiply brightness by 1.2 to make lightish bits all white so we dont
+ // add shading where we could otherwise be pure white
+ for (i = 0; i < 4; i++)
+ {
+ int r, g, b, a;
+
+ evas_map_point_color_get(m, i, &r, &g, &b, &a);
+ r = (double)r * 1.2; if (r > 255) r = 255;
+ g = (double)g * 1.2; if (g > 255) g = 255;
+ b = (double)b * 1.2; if (b > 255) b = 255;
+ evas_map_point_color_set(m, i, r, g, b, a);
+ }
+ evas_object_map_set(sl->obj, m);
+}
+
+static void
+_slice_xyz(State *st EINA_UNUSED, Slice *sl,
+ double xx1, double yy1, double zz1,
+ double xx2, double yy2, double zz2,
+ double xx3, double yy3, double zz3,
+ double xx4, double yy4, double zz4)
+{
+ sl->x[0] = xx1; sl->y[0] = yy1; sl->z[0] = zz1;
+ sl->x[1] = xx2; sl->y[1] = yy2; sl->z[1] = zz2;
+ sl->x[2] = xx3; sl->y[2] = yy3; sl->z[2] = zz3;
+ sl->x[3] = xx4; sl->y[3] = yy4; sl->z[3] = zz4;
+}
+
+static void
+_slice_uv(State *st EINA_UNUSED, Slice *sl,
+ double u1, double v1,
+ double u2, double v2,
+ double u3, double v3,
+ double u4, double v4)
+{
+ sl->u[0] = u1; sl->v[0] = v1;
+ sl->u[1] = u2; sl->v[1] = v2;
+ sl->u[2] = u3; sl->v[2] = v3;
+ sl->u[3] = u4; sl->v[3] = v4;
+}
+
+static void
+_deform_point(Vertex2 *vi, Vertex3 *vo, double rho, double theta, double A)
+{
+ // ^Y
+ // |
+ // | X
+ // +---->
+ // theta == cone angle (0 -> PI/2)
+ // A == distance of cone apex from origin
+ // rho == angle of cone from vertical axis (...-PI/2 to PI/2...)
+ Vertex3 v1;
+ double d, r, b;
+
+ d = sqrt((vi->x * vi->x) + pow(vi->y - A, 2));
+ r = d * sin(theta);
+ b = asin(vi->x / d) / sin(theta);
+
+ v1.x = r * sin(b);
+ v1.y = d + A - (r * (1 - cos(b)) * sin(theta));
+ v1.z = r * (1 - cos(b)) * cos(theta);
+
+ vo->x = (v1.x * cos(rho)) - (v1.z * sin(rho));
+ vo->y = v1.y;
+ vo->z = (v1.x * sin(rho)) + (v1.z * cos(rho));
+}
+
+static void
+_interp_point(Vertex3 *vi1, Vertex3 *vi2, Vertex3 *vo, double v)
+{
+ vo->x = (v * vi2->x) + ((1.0 - v) * vi1->x);
+ vo->y = (v * vi2->y) + ((1.0 - v) * vi1->y);
+ vo->z = (v * vi2->z) + ((1.0 - v) * vi1->z);
+}
+
+static void
+_state_slices_clear(State *st)
+{
+ int i, j, num;
+
+ if (st->slices)
+ {
+ num = 0;
+ for (j = 0; j < st->slices_h; j++)
+ {
+ for (i = 0; i < st->slices_w; i++)
+ {
+ if (st->slices[num]) _slice_free(st->slices[num]);
+ if (st->slices2[num]) _slice_free(st->slices2[num]);
+ num++;
+ }
+ }
+ free(st->slices);
+ free(st->slices2);
+ st->slices = NULL;
+ st->slices2 = NULL;
+ }
+ st->slices_w = 0;
+ st->slices_h = 0;
+}
+
+static int
+_slice_obj_color_sum(Slice *s, int p, int *r, int *g, int *b, int *a)
+{
+ Evas_Map *m;
+ int rr = 0, gg = 0, bb = 0, aa = 0;
+
+ if (!s) return 0;
+ m = (Evas_Map *)evas_object_map_get(s->obj);
+ if (!m) return 0;
+ evas_map_point_color_get(m, p, &rr, &gg, &bb, &aa);
+ *r += rr; *g += gg; *b += bb; *a += aa;
+ return 1;
+}
+
+static void
+_slice_obj_color_set(Slice *s, int p, int r, int g, int b, int a)
+{
+ Evas_Map *m;
+
+ if (!s) return;
+ m = (Evas_Map *)evas_object_map_get(s->obj);
+ if (!m) return;
+ evas_map_point_color_set(m, p, r, g, b, a);
+ evas_object_map_set(s->obj, m);
+}
+
+static void
+_slice_obj_vert_color_merge(Slice *s1, int p1, Slice *s2, int p2,
+ Slice *s3, int p3, Slice *s4, int p4)
+{
+ int r = 0, g = 0, b = 0, a = 0, n = 0;
+
+ n += _slice_obj_color_sum(s1, p1, &r, &g, &b, &a);
+ n += _slice_obj_color_sum(s2, p2, &r, &g, &b, &a);
+ n += _slice_obj_color_sum(s3, p3, &r, &g, &b, &a);
+ n += _slice_obj_color_sum(s4, p4, &r, &g, &b, &a);
+
+ if (n < 1) return;
+ r /= n; g /= n; b /= n; a /= n;
+
+ _slice_obj_color_set(s1, p1, r, g, b, a);
+ _slice_obj_color_set(s2, p2, r, g, b, a);
+ _slice_obj_color_set(s3, p3, r, g, b, a);
+ _slice_obj_color_set(s4, p4, r, g, b, a);
+}
+
+static int
+_state_update(State *st)
+{
+ Evas_Coord xx1, yy1, xx2, yy2, mx, my, dst, dx, dy;
+ Evas_Coord x, y, w, h, ox, oy, ow, oh;
+ int i, j, num, nn, jump, num2;
+ Slice *sl;
+ double b, minv = 0.0, minva, mgrad;
+ int gx, gy, gszw, gszh, gw, gh, col, row, nw, nh;
+ double rho, A, theta, perc, n, rhol, Al, thetal;
+ Vertex3 *tvo, *tvol;
+
+ st->backflip = 0;
+
+ evas_object_geometry_get(st->front, &x, &y, &w, &h);
+ ox = x; oy = y; ow = w; oh = h;
+ xx1 = st->down_x;
+ yy1 = st->down_y;
+ xx2 = st->x;
+ yy2 = st->y;
+
+ dx = xx2 - xx1;
+ dy = yy2 - yy1;
+ dst = sqrt((dx * dx) + (dy * dy));
+ if (st->dir == -1)
+ {
+ if (dst < 20) // MAGIC: 20 == drag hysterisis
+ return 0;
+ }
+ if (st->dir == -1)
+ {
+ if ((xx1 > (w / 2)) && (dx < 0) && (abs(dx) > abs(dy))) st->dir = 0; // left
+ else if ((xx1 < (w / 2)) && (dx >= 0) && (abs(dx) > abs(dy))) st->dir = 1; // right
+ else if ((yy1 > (h / 2)) && (dy < 0) && (abs(dy) >= abs(dx))) st->dir = 2; // up
+ else if ((yy1 < (h / 2)) && (dy >= 0) && (abs(dy) >= abs(dx))) st->dir = 3; // down
+ if (st->dir == -1) return 0;
+ }
+ if (st->dir == 0)
+ {
+ // no nothing. left drag is standard
+ }
+ else if (st->dir == 1)
+ {
+ xx1 = (w - 1) - xx1;
+ xx2 = (w - 1) - xx2;
+ }
+ else if (st->dir == 2)
+ {
+ Evas_Coord tmp;
+
+ tmp = xx1; xx1 = yy1; yy1 = tmp;
+ tmp = xx2; xx2 = yy2; yy2 = tmp;
+ tmp = w; w = h; h = tmp;
+ }
+ else if (st->dir == 3)
+ {
+ Evas_Coord tmp;
+
+ tmp = xx1; xx1 = yy1; yy1 = tmp;
+ tmp = xx2; xx2 = yy2; yy2 = tmp;
+ tmp = w; w = h; h = tmp;
+ xx1 = (w - 1) - xx1;
+ xx2 = (w - 1) - xx2;
+ }
+
+ if (xx2 >= xx1) xx2 = xx1 - 1;
+ mx = (xx1 + xx2) / 2;
+ my = (yy1 + yy2) / 2;
+
+ if (mx < 0) mx = 0;
+ else if (mx >= w) mx = w - 1;
+ if (my < 0) my = 0;
+ else if (my >= h) my = h - 1;
+
+ mgrad = (double)(yy1 - yy2) / (double)(xx1 - xx2);
+
+ if (mx < 1) mx = 1; // quick hack to keep curl line visible
+
+ if (mgrad == 0.0) // special horizontal case
+ mgrad = 0.001; // quick dirty hack for now
+ // else
+ {
+ minv = 1.0 / mgrad;
+ // y = (m * x) + b
+ b = my + (minv * mx);
+ }
+ if ((b >= -5) && (b <= (h + 5)))
+ {
+ if (minv > 0.0) // clamp to h
+ {
+ minv = (double)(h + 5 - my) / (double)(mx);
+ b = my + (minv * mx);
+ }
+ else // clamp to 0
+ {
+ minv = (double)(-5 - my) / (double)(mx);
+ b = my + (minv * mx);
+ }
+ }
+
+ perc = (double)xx2 / (double)xx1;
+ if (perc < 0.0) perc = 0.0;
+ else if (perc > 1.0) perc = 1.0;
+
+ minva = atan(minv) / (M_PI / 2);
+ if (minva < 0.0) minva = -minva;
+
+ // A = apex of cone
+ if (b <= 0) A = b;
+ else A = h - b;
+ if (A < -(h * 20)) A = -h * 20;
+ //--//
+ Al = -5;
+
+ // rho = is how much the page is turned
+ n = 1.0 - perc;
+ n = 1.0 - cos(n * M_PI / 2.0);
+ n = n * n;
+ rho = -(n * M_PI);
+ //--//
+ rhol = -(n * M_PI);
+
+ // theta == curliness (how much page culrs in on itself
+ n = sin((1.0 - perc) * M_PI);
+ n = n * 1.2;
+ theta = 7.86 + n;
+ //--//
+ n = sin((1.0 - perc) * M_PI);
+ n = 1.0 - n;
+ n = n * n;
+ n = 1.0 - n;
+ thetal = 7.86 + n;
+
+ nw = 16;
+ nh = 16;
+ gszw = w / nw;
+ gszh = h / nh;
+ if (gszw < 4) gszw = 4;
+ if (gszh < 4) gszh = 4;
+
+ nw = (w + gszw - 1) / gszw;
+ nh = (h + gszh - 1) / gszh;
+ if ((st->slices_w != nw) || (st->slices_h != nh)) _state_slices_clear(st);
+ st->slices_w = nw;
+ st->slices_h = nh;
+ if (!st->slices)
+ {
+ st->slices = calloc(st->slices_w * st->slices_h, sizeof(Slice *));
+ if (!st->slices) return 0;
+ st->slices2 = calloc(st->slices_w * st->slices_h, sizeof(Slice *));
+ if (!st->slices2)
+ {
+ free(st->slices);
+ st->slices = NULL;
+ return 0;
+ }
+ }
+
+ num = (st->slices_w + 1) * (st->slices_h + 1);
+
+ tvo = alloca(sizeof(Vertex3) * num);
+ tvol = alloca(sizeof(Vertex3) * (st->slices_w + 1));
+
+ for (col = 0, gx = 0; gx <= (w + gszw - 1); gx += gszw, col++)
+ {
+ Vertex2 vil;
+
+ vil.x = gx;
+ vil.y = h - gx;
+ _deform_point(&vil, &(tvol[col]), rhol, thetal, Al);
+ }
+
+ n = minva * sin(perc * M_PI);
+ n = n * n;
+
+ num = 0;
+ for (col = 0, gx = 0; gx <= (w + gszw - 1); gx += gszw, col++)
+ {
+ for (gy = 0; gy <= (h + gszh - 1); gy += gszh)
+ {
+ Vertex2 vi;
+ Vertex3 vo, tvo1;
+
+ if (gx > w) vi.x = w;
+ else vi.x = gx;
+ if (gy > h) vi.y = h;
+ else vi.y = gy;
+ _deform_point(&vi, &vo, rho, theta, A);
+ tvo1 = tvol[col];
+ if (gy > h) tvo1.y = h;
+ else tvo1.y = gy;
+ _interp_point(&vo, &tvo1, &(tvo[num]), n);
+ num++;
+ }
+ }
+
+ jump = st->slices_h + 1;
+ for (col = 0, gx = 0; gx < w; gx += gszw, col++)
+ {
+ num = st->slices_h * col;
+ num2 = jump * col;
+
+ gw = gszw;
+ if ((gx + gw) > w) gw = w - gx;
+
+ for (row = 0, gy = 0; gy < h; gy += gszh, row++)
+ {
+ Vertex3 vo[4];
+
+ memset(vo, 0, sizeof(vo));
+
+ if (b > 0) nn = num + st->slices_h - row - 1;
+ else nn = num + row;
+
+ gh = gszh;
+ if ((gy + gh) > h) gh = h - gy;
+
+ vo[0] = tvo[num2 + row];
+ vo[1] = tvo[num2 + row + jump];
+ vo[2] = tvo[num2 + row + jump + 1];
+ vo[3] = tvo[num2 + row + 1];
+#define SWP(a, b) do {typeof(a) vt; vt = (a); (a) = (b); (b) = vt;} while (0)
+ if (b > 0)
+ {
+ SWP(vo[0], vo[3]);
+ SWP(vo[1], vo[2]);
+ vo[0].y = h - vo[0].y;
+ vo[1].y = h - vo[1].y;
+ vo[2].y = h - vo[2].y;
+ vo[3].y = h - vo[3].y;
+ }
+
+ // FRONT
+ sl = st->slices[nn];
+ if (!sl)
+ {
+ sl = _slice_new(st, st->front);
+ st->slices[nn] = sl;
+ }
+ _slice_xyz(st, sl,
+ vo[0].x, vo[0].y, vo[0].z,
+ vo[1].x, vo[1].y, vo[1].z,
+ vo[2].x, vo[2].y, vo[2].z,
+ vo[3].x, vo[3].y, vo[3].z);
+ if (b <= 0)
+ _slice_uv(st, sl,
+ gx, gy, gx + gw, gy,
+ gx + gw, gy + gh, gx, gy + gh);
+ else
+ _slice_uv(st, sl,
+ gx, h - (gy + gh), gx + gw, h - (gy + gh),
+ gx + gw, h - gy, gx, h - gy);
+
+ // BACK
+ sl = st->slices2[nn];
+ if (!sl)
+ {
+ sl = _slice_new(st, st->back);
+ st->slices2[nn] = sl;
+ }
+
+ _slice_xyz(st, sl,
+ vo[1].x, vo[1].y, vo[1].z,
+ vo[0].x, vo[0].y, vo[0].z,
+ vo[3].x, vo[3].y, vo[3].z,
+ vo[2].x, vo[2].y, vo[2].z);
+ if (st->backflip)
+ {
+ if (b <= 0)
+ _slice_uv(st, sl,
+ gx + gw, gy, gx, gy,
+ gx, gy + gh, gx + gw, gy + gh);
+ else
+ _slice_uv(st, sl,
+ gx + gw, h - (gy + gh), gx, h - (gy + gh),
+ gx, h - gy, gx + gw, h - gy);
+ }
+ else
+ {
+ if (b <= 0)
+ _slice_uv(st, sl,
+ w - (gx + gw), gy, w - (gx), gy,
+ w - (gx), gy + gh, w - (gx + gw), gy + gh);
+ else
+ _slice_uv(st, sl,
+ w - (gx + gw), h - (gy + gh), w - (gx), h - (gy + gh),
+ w - (gx), h - gy, w - (gx + gw), h - gy);
+ }
+ }
+ }
+
+ num = 0;
+ for (j = 0; j < st->slices_h; j++)
+ {
+ for (i = 0; i < st->slices_w; i++)
+ {
+ _slice_apply(st, st->slices[num], x, y, w, h, ox, oy, ow, oh);
+ _slice_apply(st, st->slices2[num], x, y, w, h, ox, oy, ow, oh);
+ _slice_light(st, st->slices[num], ox, oy, ow, oh);
+ _slice_light(st, st->slices2[num], ox, oy, ow, oh);
+ num++;
+ }
+ }
+
+ for (i = 0; i <= st->slices_w; i++)
+ {
+ num = i * st->slices_h;
+ for (j = 0; j <= st->slices_h; j++)
+ {
+ Slice *s[4];
+
+ s[0] = s[1] = s[2] = s[3] = NULL;
+ if ((i > 0) && (j > 0))
+ s[0] = st->slices[num - 1 - st->slices_h];
+ if ((i < st->slices_w) && (j > 0))
+ s[1] = st->slices[num - 1];
+ if ((i > 0) && (j < st->slices_h))
+ s[2] = st->slices[num - st->slices_h];
+ if ((i < st->slices_w) && (j < st->slices_h))
+ s[3] = st->slices[num];
+ if (st->dir == 0)
+ _slice_obj_vert_color_merge(s[0], 2, s[1], 3,
+ s[2], 1, s[3], 0);
+ else if (st->dir == 1)
+ _slice_obj_vert_color_merge(s[0], 3, s[1], 2,
+ s[2], 0, s[3], 1);
+ else if (st->dir == 2)
+ _slice_obj_vert_color_merge(s[0], 3, s[1], 2,
+ s[2], 0, s[3], 1);
+ else if (st->dir == 3)
+ _slice_obj_vert_color_merge(s[0], 2, s[1], 3,
+ s[2], 1, s[3], 0);
+ s[0] = s[1] = s[2] = s[3] = NULL;
+ if ((i > 0) && (j > 0))
+ s[0] = st->slices2[num - 1 - st->slices_h];
+ if ((i < st->slices_w) && (j > 0))
+ s[1] = st->slices2[num - 1];
+ if ((i > 0) && (j < st->slices_h))
+ s[2] = st->slices2[num - st->slices_h];
+ if ((i < st->slices_w) && (j < st->slices_h))
+ s[3] = st->slices2[num];
+ if (st->dir == 0)
+ _slice_obj_vert_color_merge(s[0], 3, s[1], 2,
+ s[2], 0, s[3], 1);
+ else if (st->dir == 1)
+ _slice_obj_vert_color_merge(s[0], 2, s[1], 3,
+ s[2], 1, s[3], 0);
+ else if (st->dir == 2)
+ _slice_obj_vert_color_merge(s[0], 2, s[1], 3,
+ s[2], 1, s[3], 0);
+ else if (st->dir == 3)
+ _slice_obj_vert_color_merge(s[0], 3, s[1], 2,
+ s[2], 0, s[3], 1);
+ num++;
+ }
+ }
+
+ num = 0;
+ for (i = 0; i < st->slices_w; i++)
+ {
+ for (j = 0; j < st->slices_h; j++)
+ {
+ _slice_3d(st, st->slices[num], ox, oy, ow, oh);
+ _slice_3d(st, st->slices2[num], ox, oy, ow, oh);
+ num++;
+ }
+ }
+
+ return 1;
+}
+
+static void
+_state_end(State *st)
+{
+ _state_slices_clear(st);
+}
+
+static Eina_Bool
+_state_anim(void *data, double pos)
+{
+ State *st = data;
+ double p;
+
+ p = ecore_animator_pos_map(pos, ECORE_POS_MAP_ACCELERATE, 0.0, 0.0);
+ if (st->finish)
+ {
+ if (st->dir == 0)
+ st->x = st->ox * (1.0 - p);
+ else if (st->dir == 1)
+ st->x = st->ox + ((st->w - st->ox) * p);
+ else if (st->dir == 2)
+ st->y = st->oy * (1.0 - p);
+ else if (st->dir == 3)
+ st->y = st->oy + ((st->h - st->oy) * p);
+ }
+ else
+ {
+ if (st->dir == 0)
+ st->x = st->ox + ((st->w - st->ox) * p);
+ else if (st->dir == 1)
+ st->x = st->ox * (1.0 - p);
+ else if (st->dir == 2)
+ st->y = st->oy + ((st->h - st->oy) * p);
+ else if (st->dir == 3)
+ st->y = st->oy * (1.0 - p);
+ }
+ _state_update(st);
+ if (pos < 1.0) return EINA_TRUE;
+ evas_object_show(st->front);
+ evas_object_show(st->back);
+ _state_end(st);
+ st->anim = NULL;
+ return EINA_FALSE;
+}
+
+static void
+_update_curl_job(void *data)
+{
+ State *st = data;
+ st->job = NULL;
+ if (_state_update(st))
+ {
+ evas_object_hide(st->front);
+ evas_object_hide(st->back);
+ }
+}
+
+static void
+im_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ State *st = &state;
+ Evas_Event_Mouse_Down *ev = event_info;
+ Evas_Coord x, y, w, h;
+
+ if (ev->button != 1) return;
+ st->front = data;
+ st->back = evas_object_data_get(data, "im2");
+ st->backflip = 1;
+ st->down = 1;
+ evas_object_geometry_get(st->front, &x, &y, &w, &h);
+ st->x = ev->canvas.x - x;
+ st->y = ev->canvas.y - y;
+ st->w = w;
+ st->h = h;
+ st->down_x = st->x;
+ st->down_y = st->y;
+ st->dir = -1;
+ if (_state_update(st))
+ {
+ evas_object_hide(st->front);
+ evas_object_hide(st->back);
+ }
+}
+
+static void
+im_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ State *st = &state;
+ Evas_Event_Mouse_Up *ev = event_info;
+ Evas_Coord x, y, w, h;
+ double tm = 0.5;
+
+ if (ev->button != 1) return;
+ st->down = 0;
+ evas_object_geometry_get(st->front, &x, &y, &w, &h);
+ st->x = ev->canvas.x - x;
+ st->y = ev->canvas.y - y;
+ st->w = w;
+ st->h = h;
+ st->ox = st->x;
+ st->oy = st->y;
+ if (st->job)
+ {
+ ecore_job_del(st->job);
+ st->job = NULL;
+ }
+ if (st->anim) ecore_animator_del(st->anim);
+ st->finish = 0;
+ if (st->dir == 0)
+ {
+ tm = (double)st->x / (double)st->w;
+ if (st->x < (st->w / 2)) st->finish = 1;
+ }
+ else if (st->dir == 1)
+ {
+ if (st->x > (st->w / 2)) st->finish = 1;
+ tm = 1.0 - ((double)st->x / (double)st->w);
+ }
+ else if (st->dir == 2)
+ {
+ if (st->y < (st->h / 2)) st->finish = 1;
+ tm = (double)st->y / (double)st->h;
+ }
+ else if (st->dir == 3)
+ {
+ if (st->y > (st->h / 2)) st->finish = 1;
+ tm = 1.0 - ((double)st->y / (double)st->h);
+ }
+ if (tm < 0.01) tm = 0.01;
+ else if (tm > 0.99) tm = 0.99;
+ if (!st->finish) tm = 1.0 - tm;
+ tm *= 0.5;
+ st->anim = ecore_animator_timeline_add(tm, _state_anim, st);
+ _state_anim(st, 0.0);
+}
+
+static void
+im_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ State *st = &state;
+ Evas_Event_Mouse_Move *ev = event_info;
+ Evas_Coord x, y, w, h;
+
+ if (!st->down) return;
+ evas_object_geometry_get(st->front, &x, &y, &w, &h);
+ st->x = ev->cur.canvas.x - x;
+ st->y = ev->cur.canvas.y - y;
+ st->w = w;
+ st->h = h;
+ if (st->job) ecore_job_del(st->job);
+ st->job = ecore_job_add(_update_curl_job, st);
+}
+
+void
+test_flip_page(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *im, *im2, *rc;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("flip-page", "Flip Page");
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ im2 = evas_object_image_filled_add(evas_object_evas_get(win));
+ snprintf(buf, sizeof(buf), "%s/images/%s",
+ elm_app_data_dir_get(), "sky_04.jpg");
+ evas_object_image_file_set(im2, buf, NULL);
+ evas_object_move(im2, 40, 40);
+ evas_object_resize(im2, 400, 400);
+ evas_object_show(im2);
+
+#if 0
+ im = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(im, buf, "layout");
+#else
+ im = evas_object_image_filled_add(evas_object_evas_get(win));
+ snprintf(buf, sizeof(buf), "%s/images/%s",
+ elm_app_data_dir_get(), "twofish.jpg");
+ evas_object_image_file_set(im, buf, NULL);
+#endif
+ evas_object_move(im, 40, 40);
+ evas_object_resize(im, 400, 400);
+ evas_object_show(im);
+
+ evas_object_data_set(im, "im2", im2);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rc, 0, 0, 0, 0);
+ evas_object_move(rc, 40, 340);
+ evas_object_resize(rc, 400, 100);
+ evas_object_show(rc);
+
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im);
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im);
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rc, 0, 0, 0, 0);
+ evas_object_move(rc, 40, 40);
+ evas_object_resize(rc, 400, 100);
+ evas_object_show(rc);
+
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im);
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im);
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rc, 0, 0, 0, 0);
+ evas_object_move(rc, 340, 40);
+ evas_object_resize(rc, 100, 400);
+ evas_object_show(rc);
+
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im);
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im);
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rc, 0, 0, 0, 0);
+ evas_object_move(rc, 40, 40);
+ evas_object_resize(rc, 100, 400);
+ evas_object_show(rc);
+
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im);
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im);
+ evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im);
+
+ evas_object_resize(win, 480, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_flipselector.c b/src/bin/elementary/test_flipselector.c
new file mode 100644
index 0000000000..62a67cff09
--- /dev/null
+++ b/src/bin/elementary/test_flipselector.c
@@ -0,0 +1,188 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+void
+_sel_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *it;
+
+ it = event_info;
+ printf("label of selected item is: %s\n", elm_object_item_text_get(it));
+}
+
+void
+_unsel_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *it;
+ Evas_Object *fp = data;
+ it = elm_flipselector_selected_item_get(fp);
+ elm_flipselector_item_selected_set(it, EINA_FALSE);
+}
+
+void
+_last_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *it;
+ Evas_Object *fp = data;
+ it = elm_flipselector_last_item_get(fp);
+ elm_flipselector_item_selected_set(it, EINA_TRUE);
+}
+
+void
+_third_from_end_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *it;
+ Evas_Object *fp = data;
+ it = elm_flipselector_last_item_get(fp);
+ it = elm_flipselector_item_prev_get(it);
+ it = elm_flipselector_item_prev_get(it);
+ elm_flipselector_item_selected_set(it, EINA_TRUE);
+}
+
+void
+_underflow_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("underflow!\n");
+}
+
+void
+_overflow_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("overflow!\n");
+}
+
+void
+slider_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fl = (Evas_Object *)data;
+
+ double val = elm_slider_value_get(obj);
+ elm_flipselector_first_interval_set(fl, val);
+}
+
+void
+flip_next_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fp = data;
+ elm_flipselector_flip_next(fp);
+}
+
+void
+flip_prev_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fp = data;
+ elm_flipselector_flip_prev(fp);
+}
+
+void
+test_flipselector(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[8];
+ unsigned int i;
+ Evas_Object *win, *bx, *fp, *fpd, *bt, *bx2, *sl;
+ Elm_Object_Item *it;
+ static const char *lbl[] = {
+ "Elementary",
+ "Evas",
+ "Eina",
+ "Edje",
+ "Eet",
+ "Ecore",
+ "Efreet",
+ "Eldbus"
+ };
+
+ win = elm_win_util_standard_add("flipselector", "Flip Selector");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fp = elm_flipselector_add(bx);
+ evas_object_size_hint_weight_set(fp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_smart_callback_add(fp, "selected", _sel_cb, NULL);
+ evas_object_smart_callback_add(fp, "underflowed", _overflow_cb, NULL);
+ evas_object_smart_callback_add(fp, "overflowed", _underflow_cb, NULL);
+ for (i = 0; i < sizeof(lbl)/sizeof(char *); i++)
+ {
+ it = elm_flipselector_item_append(fp, lbl[i], NULL, NULL);
+ if (i == 3)
+ elm_flipselector_item_selected_set(it, EINA_TRUE);
+ }
+ elm_box_pack_end(bx, fp);
+ evas_object_show(fp);
+
+ bx2 = elm_box_add(bx);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ fp = elm_flipselector_add(bx2);
+ evas_object_smart_callback_add(fp, "underflowed", _overflow_cb, NULL);
+ evas_object_smart_callback_add(fp, "overflowed", _underflow_cb, NULL);
+ evas_object_size_hint_weight_set(fp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ for (i = 1990; i <= 2099; i++)
+ {
+ snprintf(buf, 8, "%u", i);
+ elm_flipselector_item_append(fp, buf, _sel_cb, NULL);
+ }
+
+ bt = elm_button_add(bx2);
+ elm_object_text_set(bt, "Flip Prev");
+ evas_object_smart_callback_add(bt, "clicked", flip_prev_cb, fp);
+
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx2, fp);
+ evas_object_show(fp);
+
+ bt = elm_button_add(bx2);
+ elm_object_text_set(bt, "Flip Next");
+ evas_object_smart_callback_add(bt, "clicked", flip_next_cb, fp);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ fpd = elm_flipselector_add(bx);
+ evas_object_size_hint_weight_set(fpd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_flipselector_item_append(fpd, "disabled", NULL, NULL);
+ elm_object_disabled_set(fpd, EINA_TRUE);
+ elm_box_pack_end(bx, fpd);
+ evas_object_show(fpd);
+
+ sl = elm_slider_add(bx);
+ elm_object_text_set(sl, "Flip Interval:");
+ elm_slider_unit_format_set(sl, "%1.2f");
+ elm_slider_min_max_set(sl, 0, 3.0);
+ elm_slider_value_set(sl, 0.85);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+ evas_object_smart_callback_add(sl, "changed", slider_change_cb, fp);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Select Last");
+ evas_object_smart_callback_add(bt, "clicked", _last_cb, fp);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Select 2097");
+ evas_object_smart_callback_add(bt, "clicked", _third_from_end_cb, fp);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Unselect year");
+ evas_object_smart_callback_add(bt, "clicked", _unsel_cb, fp);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_floating.c b/src/bin/elementary/test_floating.c
new file mode 100644
index 0000000000..b74cd4a762
--- /dev/null
+++ b/src/bin/elementary/test_floating.c
@@ -0,0 +1,101 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct _Testitem
+{
+ Elm_Object_Item *item;
+ int mode;
+ int onoff;
+} Testitem;
+
+static Elm_Genlist_Item_Class itc1;
+static char *glf_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
+ return strdup(buf);
+}
+
+static Evas_Object *glf_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ Evas_Object *ic = elm_icon_add(obj);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return ic;
+}
+static Eina_Bool glf_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+static void glf_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
+{
+}
+
+static void
+gl_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ printf("sel item data [%p] on genlist obj [%p], item pointer [%p]\n", data, obj, event_info);
+}
+
+static Eina_Bool
+anim(void *data)
+{
+ Evas_Object *gl = data;
+ Evas_Coord x, y;
+
+ y = 0;
+ x = (sin(ecore_loop_time_get()) * 500);
+ evas_object_move(gl, x, y);
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_del(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Ecore_Animator *ani = data;
+
+ ecore_animator_del(ani);
+}
+
+void
+test_floating(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl;
+ int i;
+ Ecore_Animator *ani;
+
+ win = elm_win_util_standard_add("floating", "Floating");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_move(gl, 800, 0);
+ evas_object_resize(gl, 480, 800);
+ evas_object_show(gl);
+
+ itc1.item_style = "default";
+ itc1.func.text_get = glf_text_get;
+ itc1.func.content_get = glf_content_get;
+ itc1.func.state_get = glf_state_get;
+ itc1.func.del = glf_del;
+
+ for (i = 0; i < 20; i++)
+ {
+ elm_genlist_item_append(gl, &itc1,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */,
+ (void *)(uintptr_t)(i * 10)/* func data */);
+ }
+ evas_object_resize(win, 480, 800);
+ evas_object_show(win);
+
+ ani = ecore_animator_add(anim, gl);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _del, ani);
+}
diff --git a/src/bin/elementary/test_focus.c b/src/bin/elementary/test_focus.c
new file mode 100644
index 0000000000..88e223fd43
--- /dev/null
+++ b/src/bin/elementary/test_focus.c
@@ -0,0 +1,902 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+Evas_Object * _focus_autoscroll_mode_frame_create(Evas_Object *parent);
+
+/**** focus 1 ****/
+
+static Eina_Bool
+_event(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, Evas_Object *src EINA_UNUSED, Evas_Callback_Type type, void *event_info)
+{
+ if (type == EVAS_CALLBACK_KEY_DOWN)
+ printf ("Key Down:");
+ else if (type == EVAS_CALLBACK_KEY_UP)
+ printf ("Key Up:");
+ else
+ return EINA_FALSE;
+ Evas_Event_Key_Down *ev = event_info;
+ printf("%s\n", ev->key);
+
+ ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+ return EINA_TRUE;
+}
+
+static void
+_on_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *einfo EINA_UNUSED)
+{
+ //Evas_Event_Key_Down *event = einfo;
+ //printf("%s %p Key %s Parent %p\n", evas_object_type_get(obj),
+ // obj, event->key, evas_object_smart_parent_get(obj));
+}
+
+static void
+my_disable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt = data;
+ elm_object_disabled_set(bt, EINA_TRUE);
+}
+
+static void
+my_enable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt = data;
+ elm_object_disabled_set(bt, EINA_FALSE);
+}
+
+static inline void
+my_show(Evas_Object *obj)
+{
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN,
+ _on_key_down, NULL);
+ evas_object_show(obj);
+}
+
+static void
+_tb_sel(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ printf("tb sel %p\n", obj);
+}
+
+static void
+_focus_highlight_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (elm_check_state_get(obj))
+ elm_win_focus_highlight_enabled_set(data, EINA_TRUE);
+ else
+ elm_win_focus_highlight_enabled_set(data, EINA_FALSE);
+}
+
+static void
+_focus_anim_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (elm_check_state_get(obj))
+ elm_win_focus_highlight_animate_set(data, EINA_TRUE);
+ else
+ elm_win_focus_highlight_animate_set(data, EINA_FALSE);
+}
+
+static void
+_rd_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ int value = elm_radio_state_value_get(obj);
+
+ if (value == 0)
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK);
+ else if (value == 1)
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN);
+ else
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_KEY_ONLY);
+}
+
+void
+test_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *tbx, *tbar, *mainbx, *menu, *ttb;
+ Elm_Object_Item *tb_it;
+ Elm_Object_Item *menu_it;
+ unsigned int i, j;
+
+ win = elm_win_util_standard_add("focus", "Focus");
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ evas_object_resize(win, 800, 600);
+ elm_object_event_callback_add(win, _event, NULL);
+ elm_win_autodel_set(win, EINA_TRUE);
+ my_show(win);
+
+ tbx = elm_box_add(win);
+ evas_object_size_hint_weight_set(tbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tbx);
+ evas_object_show(tbx);
+
+ tbar = elm_toolbar_add(win);
+ elm_toolbar_shrink_mode_set(tbar, ELM_TOOLBAR_SHRINK_MENU);
+ evas_object_size_hint_weight_set(tbar, 0.0, 0.0);
+ evas_object_size_hint_align_set(tbar, EVAS_HINT_FILL, 0.0);
+ tb_it = elm_toolbar_item_append(tbar, "document-print", "Hello", _tb_sel, NULL);
+ elm_object_item_disabled_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, 100);
+
+ tb_it = elm_toolbar_item_append(tbar, "folder-new", "World", _tb_sel, NULL);
+ elm_toolbar_item_priority_set(tb_it, -100);
+
+ tb_it = elm_toolbar_item_append(tbar, "object-rotate-right", "H", _tb_sel, NULL);
+ elm_toolbar_item_priority_set(tb_it, 150);
+
+ tb_it = elm_toolbar_item_append(tbar, "mail-send", "Comes", _tb_sel, NULL);
+ elm_toolbar_item_priority_set(tb_it, 0);
+
+ tb_it = elm_toolbar_item_append(tbar, "clock", "Elementary", _tb_sel, NULL);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ tb_it = elm_toolbar_item_append(tbar, "refresh", "Menu", NULL, NULL);
+ elm_toolbar_item_menu_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, -9999);
+ elm_toolbar_menu_parent_set(tbar, win);
+
+ menu = elm_toolbar_item_menu_get(tb_it);
+ elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel, NULL);
+ menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel, NULL);
+ elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel, NULL);
+ elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel, NULL);
+
+ elm_box_pack_end(tbx, tbar);
+ evas_object_show(tbar);
+
+ mainbx = elm_box_add(win);
+ elm_box_horizontal_set(mainbx, EINA_TRUE);
+ evas_object_size_hint_weight_set(mainbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(tbx, mainbx);
+ my_show(mainbx);
+
+ { //First Col
+ Evas_Object *bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_box_pack_end(mainbx, bx);
+ my_show(bx);
+
+ {
+ Evas_Object *lb = elm_label_add(win);
+ elm_object_text_set(lb, "<b>Use Tab or Shift+Tab<br/>or Arrow keys</b>");
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ my_show(lb);
+ }
+
+ {
+ Evas_Object *tg = elm_check_add(win);
+ elm_object_style_set(tg, "toggle");
+ elm_object_part_text_set(tg, "on", "Yes");
+ elm_object_part_text_set(tg, "off", "No");
+ elm_box_pack_end(bx, tg);
+ my_show(tg);
+ }
+
+ {
+ Evas_Object *en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(en, "This is a single line");
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_box_pack_end(bx, en);
+ my_show(en);
+ }
+
+ {
+ Evas_Object *bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, 0.0, 0.0);
+ elm_box_pack_end(bx, bx2);
+
+ for (i = 2; i; i--)
+ {
+ Evas_Object *bt;
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Box");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ if (i%2)
+ elm_object_disabled_set(bt, EINA_TRUE);
+ elm_box_pack_end(bx2, bt);
+ my_show(bt);
+ }
+
+ {
+ Evas_Object *sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sc, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ elm_scroller_bounce_set(sc, EINA_TRUE, EINA_TRUE);
+ elm_scroller_content_min_limit(sc, 1, 1);
+ elm_box_pack_end(bx2, sc);
+ my_show(sc);
+
+ {
+ Evas_Object *bt;
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Scroller");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ elm_object_event_callback_add(bt, _event, NULL);
+ elm_object_content_set(sc, bt);
+ my_show(bt);
+ elm_object_event_callback_del(bt, _event, NULL);
+ }
+ }
+
+ my_show(bx2);
+ }
+
+ {
+ Evas_Object *bt;
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Box");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ elm_box_pack_end(bx, bt);
+ my_show(bt);
+ }
+
+ {
+ Evas_Object *bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, 0.0, 0.0);
+ elm_box_pack_end(bx, bx2);
+ my_show(bx2);
+
+ for (i = 2; i; i--)
+ {
+ Evas_Object *bx3 = elm_box_add(win);
+ evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx3, 0.0, 0.0);
+ elm_box_pack_end(bx2, bx3);
+ my_show(bx3);
+
+ for (j = 3; j; j--)
+ {
+ Evas_Object *bt;
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Box");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ elm_box_pack_end(bx3, bt);
+ my_show(bt);
+ }
+ }
+
+ {
+ Evas_Object *sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sc, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
+ elm_scroller_content_min_limit(sc, 1, 0);
+ elm_box_pack_end(bx2, sc);
+ my_show(sc);
+
+ Evas_Object *bx3 = elm_box_add(win);
+ evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx3, 0.0, 0.0);
+ elm_object_content_set(sc, bx3);
+ my_show(bx3);
+
+ for (i = 5; i; i--)
+ {
+ Evas_Object *bt;
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "BX Scroller");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ elm_box_pack_end(bx3, bt);
+ my_show(bt);
+ }
+ }
+ }
+ }
+
+ {//Second Col
+ char buf[PATH_MAX];
+ Evas_Object *ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "twolines");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(mainbx, ly);
+ my_show(ly);
+
+ {
+ Evas_Object *bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, 0.0, 0.0);
+ elm_object_part_content_set(ly, "element1", bx2);
+ my_show(bx2);
+
+ for (i = 3; i; i--)
+ {
+ Evas_Object *bt;
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Layout");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ elm_box_pack_end(bx2, bt);
+ my_show(bt);
+ elm_object_focus_custom_chain_prepend(bx2, bt, NULL);
+ }
+ }
+
+ {
+ Evas_Object *bx2 = elm_box_add(win);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, 0.0, 0.0);
+ elm_object_part_content_set(ly, "element2", bx2);
+ my_show(bx2);
+
+ {
+ Evas_Object *bt;
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Disable");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_smart_callback_add(bt, "clicked", my_disable, bt);
+ my_show(bt);
+ elm_object_focus_custom_chain_prepend(bx2, bt, NULL);
+
+ Evas_Object *bt2;
+ bt2 = elm_button_add(win);
+ elm_object_text_set(bt2, "Enable");
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt2, 0.0, 0.0);
+ elm_box_pack_end(bx2, bt2);
+ evas_object_smart_callback_add(bt2, "clicked", my_enable, bt);
+ my_show(bt2);
+ elm_object_focus_custom_chain_append(bx2, bt2, NULL);
+
+ Evas_Object *bt3;
+ bt3 = elm_button_add(win);
+ elm_object_text_set(bt3, "KeyOnly with Auto");
+ elm_object_focus_move_policy_set(bt3, ELM_FOCUS_MOVE_POLICY_KEY_ONLY);
+ elm_object_focus_move_policy_automatic_set(bt, EINA_TRUE); // EINA_TURE is default
+ evas_object_size_hint_align_set(bt3, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt3, 0.0, 0.0);
+ elm_box_pack_end(bx2, bt3);
+ my_show(bt3);
+ elm_object_focus_custom_chain_append(bx2, bt3, NULL);
+
+ Evas_Object *bt4;
+ bt4 = elm_button_add(win);
+ elm_object_text_set(bt4, "KeyOnly without Auto");
+ elm_object_focus_move_policy_set(bt4, ELM_FOCUS_MOVE_POLICY_KEY_ONLY);
+ elm_object_focus_move_policy_automatic_set(bt4, EINA_FALSE);
+ evas_object_size_hint_align_set(bt4, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt4, 0.0, 0.0);
+ elm_box_pack_end(bx2, bt4);
+ my_show(bt4);
+ elm_object_focus_custom_chain_append(bx2, bt4, NULL);
+ }
+
+ }
+ }
+
+ {//Third Col
+ Evas_Object *bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_box_pack_end(mainbx, bx);
+ my_show(bx);
+
+ {
+ Evas_Object *fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Frame");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ {
+ Evas_Object *tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(fr, tb);
+ my_show(tb);
+ for (j = 0; j < 1; j++)
+ for (i = 0; i < 2; i++)
+ {
+ Evas_Object *bt;
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Table");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_table_pack(tb, bt, i, j, 1, 1);
+ my_show(bt);
+ }
+ }
+ }
+
+ {
+ Evas_Object *fr = elm_bubble_add(win);
+ elm_object_text_set(fr, "Bubble");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ {
+ Evas_Object *tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(fr, tb);
+ my_show(tb);
+ for (j = 0; j < 2; j++)
+ for (i = 0; i < 1; i++)
+ {
+ Evas_Object *bt;
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Table");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_table_pack(tb, bt, i, j, 1, 1);
+ my_show(bt);
+ }
+ }
+ }
+ }
+
+ ttb = elm_table_add(win);
+ evas_object_size_hint_weight_set(ttb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(tbx, ttb);
+ my_show(ttb);
+
+ {
+ Evas_Object *ck;
+
+ ck = elm_check_add(ttb);
+ elm_object_text_set(ck, "Focus Highlight Enable");
+ elm_check_state_set(ck, elm_win_focus_highlight_enabled_get(win));
+ evas_object_size_hint_align_set(ck, 0.0, EVAS_HINT_FILL);
+ elm_table_pack(ttb, ck, 0, 0, 1, 1);
+ my_show(ck);
+ evas_object_smart_callback_add(ck, "changed",
+ _focus_highlight_changed,
+ win);
+
+ ck = elm_check_add(ttb);
+ elm_object_text_set(ck, "Focus Highlight Animation Enable");
+ elm_check_state_set(ck, elm_win_focus_highlight_animate_get(win));
+ evas_object_size_hint_align_set(ck, 0.0, EVAS_HINT_FILL);
+ elm_table_pack(ttb, ck, 0, 1, 1, 1);
+ my_show(ck);
+ evas_object_smart_callback_add(ck, "changed",
+ _focus_anim_changed,
+ win);
+ }
+
+ {
+ Evas_Object *rd, *rdg;
+
+ for (i = 0; i < 3; i++)
+ {
+ rd = elm_radio_add(ttb);
+ elm_radio_state_value_set(rd, i);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
+ elm_table_pack(ttb, rd, 1, i, 1, 1);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL);
+
+ if (i == 0)
+ {
+ rdg = rd;
+ elm_object_text_set(rd, "Move Policy: Key+Click(Default)");
+ }
+ else if (i == 1)
+ {
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "Move Policy: Key+Click+In");
+ }
+ else
+ {
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "Move Policy: Key Only");
+ }
+ }
+ }
+}
+
+/**** focus 2 ****/
+
+static void
+_focus_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info)
+{
+ const char *type = evas_object_type_get(event_info);
+ if ((type) && (!strcmp(type, "elm_widget")))
+ type = elm_object_widget_type_get(event_info);
+ printf("Evas_Object focus in: %p %s\n", event_info, type);
+}
+
+static void
+_focus_out(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info)
+{
+ const char *type = evas_object_type_get(event_info);
+ if ((type) && (!strcmp(type, "elm_widget")))
+ type = elm_object_widget_type_get(event_info);
+ printf("Evas_Object focus out: %p %s\n", event_info, type);
+}
+
+static void
+_focus_obj(void *data, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *newfocus = data;
+ const char *type = evas_object_type_get(newfocus);
+ if ((type) && (!strcmp(type, "elm_widget")))
+ type = elm_object_widget_type_get(newfocus);
+ printf("elm_object_focus_set(%p, EINA_TRUE) %s\n", newfocus, type);
+ elm_object_focus_set(newfocus, EINA_TRUE);
+}
+
+static void
+_focus_layout_part(void *data, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ed = elm_layout_edje_get(data);
+
+ Evas_Object *newfocus = (Evas_Object *)edje_object_part_object_get(ed, "sky");
+ const char *type = evas_object_type_get(newfocus);
+ printf("evas_object_focus_set(%p, EINA_TRUE) %s\n", newfocus, type);
+ evas_object_focus_set(newfocus, EINA_TRUE);;
+}
+
+void
+test_focus2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *ly, *bt, *en, *en1, *bt1, *bt2;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("focus2", "Focus 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+
+ evas_event_callback_add
+ (evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN,
+ _focus_in, NULL);
+ evas_event_callback_add
+ (evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT,
+ _focus_out, NULL);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+#define PARENT bx /* this is broken, but should work */
+//#define PARENT win
+
+ en = elm_entry_add(PARENT);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_object_text_set(en, "Entry that should get focus");
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ bt = elm_button_add(PARENT);
+ elm_object_text_set(bt, "Give focus to entry");
+ evas_object_smart_callback_add(bt, "clicked", _focus_obj, en);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ ly = elm_layout_add(PARENT);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "layout");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, ly);
+ evas_object_show(ly);
+
+ bt1 = bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 1");
+ elm_object_part_content_set(ly, "element1", bt);
+
+ en1 = elm_entry_add(ly);
+ elm_entry_scrollable_set(en1, EINA_TRUE);
+ evas_object_size_hint_weight_set(en1, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en1, EVAS_HINT_FILL, 0.5);
+ elm_scroller_policy_set(en1, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_object_text_set(en1, "Scrolled Entry that should get focus");
+ elm_entry_single_line_set(en1, EINA_TRUE);
+ elm_object_part_content_set(ly, "element2", en1);
+
+ bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 2");
+ elm_object_part_content_set(ly, "element3", bt);
+
+ bt = elm_button_add(PARENT);
+ elm_object_text_set(bt, "Give focus to layout");
+ evas_object_smart_callback_add(bt, "clicked", _focus_obj, ly);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(PARENT);
+ elm_object_text_set(bt, "Give focus to layout part");
+ evas_object_smart_callback_add(bt, "clicked", _focus_layout_part, ly);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(PARENT);
+ elm_object_text_set(bt, "Give focus to layout 'Button 1'");
+ evas_object_smart_callback_add(bt, "clicked", _focus_obj, bt1);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt2 = elm_button_add(PARENT);
+ elm_object_text_set(bt2, "Give focus to layout 'Entry'");
+ evas_object_smart_callback_add(bt2, "clicked", _focus_obj, en1);
+ evas_object_size_hint_weight_set(bt2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, bt2);
+ evas_object_show(bt2);
+
+ elm_object_focus_next_object_set(bt2, en, ELM_FOCUS_DOWN);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
+
+/**** focus hide/del ****/
+
+static Evas_Object *foc = NULL;
+
+static void
+_foc(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ foc = obj;
+ printf("foc -> %p\n", foc);
+}
+
+static void
+_unfoc(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ foc = NULL;
+ printf("foc -> %p\n", foc);
+}
+
+static void
+_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bx = data, *en;
+
+ en = elm_entry_add(elm_object_top_widget_get(bx));
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_object_text_set(en, "An entry");
+ evas_object_smart_callback_add(en, "focused", _foc, NULL);
+ evas_object_smart_callback_add(en, "unfocused", _unfoc, NULL);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_box_pack_start(bx, en);
+ evas_object_show(en);
+}
+
+static void
+_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (foc) evas_object_del(foc);
+}
+
+static void
+_hide(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (foc) evas_object_hide(foc);
+}
+
+void
+test_focus_hide_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt, *en;
+
+ win = elm_win_util_standard_add("focus-hide-del", "Focus Hide/Del");
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_object_text_set(en, "An entry");
+ evas_object_smart_callback_add(en, "focused", _foc, NULL);
+ evas_object_smart_callback_add(en, "unfocused", _unfoc, NULL);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+
+ bt = elm_button_add(win);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ elm_object_text_set(bt, "Add");
+ evas_object_smart_callback_add(bt, "clicked", _add, bx);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ elm_object_text_set(bt, "Del");
+ evas_object_smart_callback_add(bt, "clicked", _del, NULL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_focus_allow_set(bt, EINA_FALSE);
+ elm_object_text_set(bt, "Hide");
+ evas_object_smart_callback_add(bt, "clicked", _hide, NULL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+/**** focus 3 ****/
+
+static Evas_Object *
+create_button(Evas_Object *parent, const char *text, Eina_Bool expand)
+{
+ Evas_Object *btn = elm_button_add(parent);
+ elm_object_text_set(btn, text);
+ if (expand)
+ {
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ }
+
+ evas_object_show(btn);
+
+ return btn;
+}
+
+static void
+_focus_highlight_clip_disable_changed_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool disable = elm_check_state_get(obj);
+ elm_config_focus_highlight_clip_disabled_set(disable);
+}
+
+static void
+_horizontal_btn(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *box_btn = data;
+ elm_box_horizontal_set(box_btn, elm_check_state_get(obj));
+}
+
+void
+test_focus3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *sc, *btn_top, *btn_down, *btn[20], *box_btn, *lb, *fr, *ck;
+
+ char win_focus_theme[PATH_MAX] = { 0 };
+ char item_name[PATH_MAX];
+ int i;
+
+ snprintf(win_focus_theme, sizeof(win_focus_theme), "%s/objects/test_focus_custom.edj", elm_app_data_dir_get());
+
+ elm_theme_extension_add(NULL, win_focus_theme);
+
+ win = elm_win_util_standard_add("focus3", "Focus 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_focus_highlight_animate_set(win, EINA_TRUE);
+ elm_win_focus_highlight_style_set(win, "glow");
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ fr = elm_frame_add(box);
+ elm_object_text_set(fr, "Focus Check Points");
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ lb = elm_label_add(fr);
+ elm_object_text_set(lb, "<align=left>This test cases list down the"
+ " focus related check points for regression test.<br/>"
+ " 1. Focus cut for the first/last item by scroller<br/>"
+ " 2. Focus animation on the last item<br/>"
+ " 3. Focus goes out of view port while scrolling<br/>"
+ " 4. Sometimes focus moves but the area of focus does not change<br/>"
+ " e.g if focus is on 'top' and with down key it comes on Item1 <br/>"
+ " but the area is same as of top <br/>"
+ " </align>");
+ elm_object_content_set(fr, lb);
+ evas_object_show(lb);
+
+ btn_top = create_button(box, "top", EINA_FALSE);
+ elm_box_pack_end(box, btn_top);
+
+ sc = elm_scroller_add(box);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, sc);
+
+ box_btn = elm_box_add(sc);
+ evas_object_size_hint_weight_set(box_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(sc, box_btn);
+ evas_object_show(box_btn);
+ evas_object_show(sc);
+
+ for (i = 0; i < 20; i++)
+ {
+ sprintf(item_name, "Item %d", i);
+ btn[i] = create_button(box_btn, item_name, EINA_TRUE);
+ elm_box_pack_end(box_btn, btn[i]);
+ }
+
+ btn_down = create_button(box, "down", EINA_FALSE);
+ evas_object_show(btn_down);
+ elm_box_pack_end(box, btn_down);
+
+ ck = elm_check_add(box);
+ elm_object_text_set(ck, "Focus Highlight Clip Disable");
+ elm_check_state_set(ck, elm_config_focus_highlight_clip_disabled_get());
+ elm_box_pack_end(box, ck);
+ evas_object_show(ck);
+ evas_object_smart_callback_add(ck, "changed",
+ _focus_highlight_clip_disable_changed_cb,
+ NULL);
+
+ // Focus Autoscroll Mode
+ fr = _focus_autoscroll_mode_frame_create(box);
+ elm_box_pack_end(box, fr);
+
+ ck = elm_check_add(box);
+ elm_object_text_set(ck, "Horizontal Mode");
+ evas_object_smart_callback_add(ck, "changed", _horizontal_btn, box_btn);
+ elm_box_pack_end(box, ck);
+ evas_object_show(ck);
+
+ evas_object_resize(win, 320, 500);
+ evas_object_show(win);
+}
+
diff --git a/src/bin/elementary/test_focus_custom_chain.c b/src/bin/elementary/test_focus_custom_chain.c
new file mode 100644
index 0000000000..c9d982b9c9
--- /dev/null
+++ b/src/bin/elementary/test_focus_custom_chain.c
@@ -0,0 +1,243 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+highlight_enabled_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_config_focus_highlight_enabled_set(elm_check_state_get(obj));
+}
+
+static void
+highlight_animate_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_config_focus_highlight_animate_set(elm_check_state_get(obj));
+}
+
+static void
+win_highlight_enabled_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_enabled_set((Evas_Object *)data,
+ elm_check_state_get(obj));
+}
+
+static void
+win_highlight_animate_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_animate_set((Evas_Object *)data,
+ elm_check_state_get(obj));
+}
+
+static void
+custom_chain_unset_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *c, *child = NULL;
+ Evas_Object *bx = (Evas_Object *)data;
+ Eina_List *l, *children = NULL, *custom_chain = NULL;
+ int i = 0;
+
+ if (elm_check_state_get(obj))
+ {
+ children = elm_box_children_get(bx);
+ EINA_LIST_FOREACH(children, l, c)
+ {
+ if (i == 0)
+ {
+ child = c;
+ custom_chain = eina_list_append(custom_chain, c);
+ elm_object_focus_custom_chain_set(bx, custom_chain);
+ }
+ else if (i == 1) elm_object_focus_custom_chain_prepend(bx, c, child);
+ else if (i == 2)
+ {
+ elm_object_focus_custom_chain_append(bx, c, child);
+ child = c;
+ }
+ else if (i == 3) elm_object_focus_custom_chain_prepend(bx, c, child);
+ i++;
+ }
+ }
+ else
+ {
+ if (!elm_object_focus_custom_chain_get(bx)) return;
+ elm_object_focus_custom_chain_unset(bx);
+ }
+}
+
+static void
+create_win_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gd, *bt;
+
+ win = elm_win_util_standard_add("test focus", "Test Focus");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ gd = elm_grid_add(win);
+ elm_grid_size_set(gd, 100, 100);
+ evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, gd);
+ evas_object_show(gd);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 1");
+ elm_grid_pack(gd, bt, 10, 10, 80, 20);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 2");
+ elm_grid_pack(gd, bt, 10, 30, 80, 20);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 3");
+ elm_grid_pack(gd, bt, 10, 50, 80, 20);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 4");
+ elm_grid_pack(gd, bt, 10, 70, 80, 20);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 160, 160);
+ evas_object_show(win);
+}
+
+void
+test_focus_custom_chain(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fr, *bx, *bx2, *tg, *bt, *sp;
+ Evas_Object *lb, *bt1, *bt2, *bt3, *bt4;
+ Eina_List *custom_chain = NULL;
+
+ elm_config_focus_highlight_enabled_set(EINA_TRUE);
+ elm_config_focus_highlight_animate_set(EINA_TRUE);
+
+ win = elm_win_util_standard_add("focus-custom-chain", "Focus Custom Chain");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_focus_highlight_animate_set(win, EINA_TRUE);
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, fr);
+ elm_object_style_set(fr, "pad_large");
+ evas_object_show(fr);
+
+ /* First Example - Using Focus Highlight */
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ tg = elm_check_add(bx);
+ evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(tg, "Focus Highlight Enabled (Config)");
+ elm_check_state_set(tg, elm_config_focus_highlight_enabled_get());
+ evas_object_smart_callback_add(tg, "changed", highlight_enabled_cb, NULL);
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+
+ tg = elm_check_add(bx);
+ evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(tg, "Focus Highlight Animate (Config)");
+ elm_check_state_set(tg, elm_config_focus_highlight_animate_get());
+ evas_object_smart_callback_add(tg, "changed", highlight_animate_cb, NULL);
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+
+ tg = elm_check_add(bx);
+ evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(tg, "Focus Highlight Enabled (Win)");
+ elm_check_state_set(tg, elm_win_focus_highlight_enabled_get(win));
+ evas_object_smart_callback_add(tg, "changed", win_highlight_enabled_cb, win);
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+
+ tg = elm_check_add(bx);
+ evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(tg, "Focus Highlight Animate (Win)");
+ elm_check_state_set(tg, elm_win_focus_highlight_enabled_get(win));
+ evas_object_smart_callback_add(tg, "changed", win_highlight_animate_cb, win);
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Create Window");
+ evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", create_win_bt_clicked, NULL);
+ evas_object_show(bt);
+
+ sp = elm_separator_add(bx);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ /* Second Example - Using Custom Chain */
+ lb = elm_label_add(bx);
+ elm_object_text_set(lb, "Custom Chain: Please use tab key to check");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bx2 = elm_box_add(bx);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bt1 = elm_button_add(bx2);
+ elm_object_text_set(bt1, "Button 1");
+ evas_object_size_hint_weight_set(bt1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt1, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, bt1);
+ evas_object_show(bt1);
+
+ bt2 = elm_button_add(bx2);
+ elm_object_text_set(bt2, "Button 2");
+ evas_object_size_hint_weight_set(bt2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, bt2);
+ evas_object_show(bt2);
+
+ bt3 = elm_button_add(bx2);
+ elm_object_text_set(bt3, "Button 3");
+ evas_object_size_hint_weight_set(bt3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt3, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, bt3);
+ evas_object_show(bt3);
+
+ bt4 = elm_button_add(bx2);
+ elm_object_text_set(bt4, "Button 4");
+ evas_object_size_hint_weight_set(bt4, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt4, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, bt4);
+ evas_object_show(bt4);
+
+ custom_chain = eina_list_append(custom_chain, bt2);
+ custom_chain = eina_list_append(custom_chain, bt1);
+ custom_chain = eina_list_append(custom_chain, bt4);
+ custom_chain = eina_list_append(custom_chain, bt3);
+ elm_object_focus_custom_chain_set(bx2, custom_chain);
+
+ tg = elm_check_add(bx);
+ elm_object_text_set(tg, "Custom Chain");
+ evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_check_state_set(tg, EINA_TRUE);
+ evas_object_smart_callback_add(tg, "changed", custom_chain_unset_cb, bx2);
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_focus_policy.c b/src/bin/elementary/test_focus_policy.c
new file mode 100644
index 0000000000..66a424453a
--- /dev/null
+++ b/src/bin/elementary/test_focus_policy.c
@@ -0,0 +1,150 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_rdg_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt = data;
+ int value = elm_radio_value_get(obj);
+
+ // set focus move policy to the test button
+ switch (value)
+ {
+ case 0:
+ elm_object_text_set(bt, "Test Button (MOUSE CLICK or KEY)");
+ elm_object_focus_move_policy_set(bt, ELM_FOCUS_MOVE_POLICY_CLICK);
+ break;
+ case 1:
+ elm_object_text_set(bt, "Test Button (MOUSE IN or KEY)");
+ elm_object_focus_move_policy_set(bt, ELM_FOCUS_MOVE_POLICY_IN);
+ break;
+ case 2:
+ elm_object_text_set(bt, "Test Button (KEY ONLY)");
+ elm_object_focus_move_policy_set(bt, ELM_FOCUS_MOVE_POLICY_KEY_ONLY);
+ break;
+ default:
+ break;
+ }
+}
+
+void
+test_focus_object_policy(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fr, *fr2, *bx, *fr_bx, *bt, *test_bt, *lbl, *rdg, *rd;
+
+ win = elm_win_util_standard_add("focus-object-policy", "Focus Object Policy");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_focus_highlight_animate_set(win, EINA_TRUE);
+ elm_win_focus_highlight_style_set(win, "glow");
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, fr);
+ elm_object_style_set(fr, "pad_large");
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ /* frame 1 for normal buttons */
+ {
+ fr2 = elm_frame_add(bx);
+ evas_object_size_hint_weight_set(fr2, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(fr2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr2, "Focusable Buttons");
+ elm_box_pack_end(bx, fr2);
+ evas_object_show(fr2);
+
+ fr_bx = elm_box_add(fr2);
+ elm_object_content_set(fr2, fr_bx);
+ evas_object_show(fr_bx);
+
+ bt = elm_button_add(fr_bx);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(fr_bx, bt);
+ evas_object_show(bt);
+ elm_object_focus_set(bt, EINA_TRUE);
+
+ bt = elm_button_add(fr_bx);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(fr_bx, bt);
+ evas_object_show(bt);
+
+ // a button to test focus object policy
+ test_bt = elm_button_add(fr_bx);
+ elm_object_text_set(test_bt, "Test Button (MOUSE CLICK or KEY)");
+ evas_object_size_hint_weight_set(test_bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(test_bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(fr_bx, test_bt);
+ evas_object_show(test_bt);
+
+ elm_object_focus_move_policy_set(bt, ELM_FOCUS_MOVE_POLICY_CLICK);
+ bt = elm_button_add(fr_bx);
+ elm_object_text_set(bt, "Button 4");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(fr_bx, bt);
+ evas_object_show(bt);
+ }
+
+ /* a frame 2 for the test button */
+ {
+ fr2 = elm_frame_add(bx);
+ evas_object_size_hint_weight_set(fr2, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(fr2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr2, "Focus Options for a TEST button");
+ elm_box_pack_end(bx, fr2);
+ evas_object_show(fr2);
+
+ fr_bx = elm_box_add(fr2);
+ elm_object_content_set(fr2, fr_bx);
+ evas_object_show(fr_bx);
+
+ lbl = elm_label_add(fr_bx);
+ evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, 0);
+ elm_object_text_set(lbl, "This focus option will be applied only for a TEST button. <br/>The focus policies of other buttons will be remain in MOUSE CLICK status.");
+ elm_box_pack_end(fr_bx, lbl);
+ evas_object_show(lbl);
+
+ // radios to select focus object policy
+ rd = elm_radio_add(fr_bx);
+ elm_radio_state_value_set(rd, 0);
+ evas_object_size_hint_align_set(rd, 0.0, 0.5);
+ elm_object_text_set(rd, "Focus Move Pollicy Mouse Click");
+ elm_box_pack_end(fr_bx, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, test_bt);
+
+ rdg = rd;
+
+ rd = elm_radio_add(fr_bx);
+ elm_radio_state_value_set(rd, 1);
+ elm_radio_group_add(rd, rdg);
+ evas_object_size_hint_align_set(rd, 0.0, 0.5);
+ elm_object_text_set(rd, "Focus Move Policy Mouse In");
+ elm_box_pack_end(fr_bx, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, test_bt);
+
+ rd = elm_radio_add(fr_bx);
+ elm_radio_state_value_set(rd, 2);
+ elm_radio_group_add(rd, rdg);
+ evas_object_size_hint_align_set(rd, 0.0, 0.5);
+ elm_object_text_set(rd, "Focus Move Pollicy Key Only");
+ elm_box_pack_end(fr_bx, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, test_bt);
+ }
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_focus_style.c b/src/bin/elementary/test_focus_style.c
new file mode 100644
index 0000000000..62f632ab14
--- /dev/null
+++ b/src/bin/elementary/test_focus_style.c
@@ -0,0 +1,234 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+glow_effect_on_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *chk = evas_object_data_get(obj, "glow_is_enable");
+
+ if (elm_check_state_get(chk)) elm_win_focus_highlight_style_set(data, "glow_effect");
+}
+
+static void
+glow_effect_off_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *chk = evas_object_data_get(obj, "glow_is_enable");
+
+ if (elm_check_state_get(chk)) elm_win_focus_highlight_style_set(data, "glow");
+}
+
+void
+test_focus_style(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fr, *bx, *bx2, *bt, *spinner, *sp, *chk;
+ char win_focus_theme[PATH_MAX] = { 0 };
+
+ sprintf(win_focus_theme, "%s/objects/test_focus_style.edj", elm_app_data_dir_get());
+ elm_theme_extension_add(NULL, win_focus_theme);
+
+ win = elm_win_util_standard_add("focus-style", "Focus Style");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_focus_highlight_animate_set(win, EINA_TRUE);
+ elm_win_focus_highlight_style_set(win, "glow");
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, fr);
+ elm_object_style_set(fr, "pad_large");
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ chk = elm_check_add(bx);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(chk, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(chk, "Enable glow effect on \"Glow\" Button");
+ elm_check_state_set(chk, EINA_TRUE);
+ elm_box_pack_end(bx, chk);
+ evas_object_show(chk);
+
+ spinner = elm_spinner_add(bx);
+ evas_object_size_hint_weight_set(spinner, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(spinner, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, spinner);
+ evas_object_show(spinner);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Glow Button");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "focused", glow_effect_on_cb, win);
+ evas_object_smart_callback_add(bt, "unfocused", glow_effect_off_cb, win);
+ evas_object_data_set(bt, "glow_is_enable", chk);
+ evas_object_show(bt);
+
+ sp = elm_separator_add(bx);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ bx2 = elm_box_add(bx);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bt = elm_button_add(bx2);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx2);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx2);
+ elm_object_text_set(bt, "Button 3");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx2);
+ elm_object_text_set(bt, "Button 4");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+void
+test_focus_part(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fr, *bx, *chk, *layout, *ic, *btn;
+ char win_focus_theme[PATH_MAX] = {0}, buf[PATH_MAX] = {0};
+
+ sprintf(win_focus_theme, "%s/objects/test_focus_style.edj", elm_app_data_dir_get());
+ elm_theme_extension_add(NULL, win_focus_theme);
+
+ win = elm_win_util_standard_add("focus_part", "Focus On Part");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_focus_highlight_animate_set(win, EINA_TRUE);
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, fr);
+ elm_object_style_set(fr, "pad_large");
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ chk = elm_check_add(bx);
+ elm_object_style_set(chk, "focus_text");
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(chk, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(chk, "Focus highlight on text part only");
+ elm_check_state_set(chk, EINA_TRUE);
+ elm_box_pack_end(bx, chk);
+ evas_object_show(chk);
+
+ layout = elm_layout_add(bx);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(chk, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ if (!elm_layout_theme_set(layout, "layout", "focus", "example"))
+ printf("error setting focus example layout\n");
+ elm_box_pack_end(bx, layout);
+ elm_object_focus_allow_set(layout, EINA_TRUE);
+ evas_object_show(layout);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ btn = elm_button_add(win);
+ elm_object_style_set(btn, "focus_icon");
+ elm_object_text_set(btn, "Focus highlight on icon part only");
+ elm_object_part_content_set(btn, "icon", ic);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "Button");
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+void
+test_focus_object_style(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fr, *bx, *bt;
+ char win_focus_theme[PATH_MAX] = { 0 };
+
+ snprintf(win_focus_theme, sizeof(win_focus_theme), "%s/objects/test_focus_custom.edj", elm_app_data_dir_get());
+ elm_theme_extension_add(NULL, win_focus_theme);
+
+ win = elm_win_util_standard_add("object-focus-style", "Object Focus Style");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_focus_highlight_animate_set(win, EINA_TRUE);
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, fr);
+ elm_object_style_set(fr, "pad_large");
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Button Glow In Focus Style");
+ elm_object_focus_highlight_style_set(bt, "glow");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Button 4");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_gengrid.c b/src/bin/elementary/test_gengrid.c
new file mode 100644
index 0000000000..4a106d53c4
--- /dev/null
+++ b/src/bin/elementary/test_gengrid.c
@@ -0,0 +1,2231 @@
+#include <Elementary_Cursor.h>
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+Evas_Object * _focus_autoscroll_mode_frame_create(Evas_Object *parent);
+
+static Elm_Gengrid_Item_Class *gic, *ggic;
+
+Evas_Object *grid_content_get(void *data, Evas_Object *obj, const char *part);
+char *grid_text_get(void *data, Evas_Object *obj EINA_UNUSED,
+ const char *part EINA_UNUSED);
+Eina_Bool grid_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ const char *part EINA_UNUSED);
+void grid_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED);
+
+typedef struct _Item_Data
+{
+ Elm_Object_Item *item;
+ const char *path;
+ int mode;
+ int onoff;
+} Item_Data;
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ Evas_Object *box; /* Use this to get box content */
+ Evas_Object *grid;
+ Evas_Object *grid2;
+ Elm_Gengrid_Item_Field_Type field_type;
+};
+typedef struct _api_data api_data;
+
+struct _Show_Data
+{
+ int scrollto;
+ Evas_Object *grid;
+};
+typedef struct _Show_Data Show_Data;
+
+enum _api_state
+{
+ GRID_ALIGN_SET,
+ GRID_BRING_IN,
+ GRID_NO_SELECT_MODE,
+ GRID_NO_BOUNCE,
+ GRID_PAGE_RELATIVE,
+ GRID_PAGE_SIZE,
+ GRID_TOOLTIP_SET_TEXT,
+ GRID_TOOLTIP_UNSET,
+ GRID_ITEM_CLASS_SET,
+ GRID_ITEM_UPDATE_SET,
+ GRID_PAGE_BRING_IN,
+ GRID_PAGE_SHOW,
+ GRID_TOOLTIP_CONTENT_CB,
+ GRID_TOOLTIP_STYLE_SET,
+ GRID_TOOLTIP_WINDOW_MODE_SET,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+ Evas_Object *grid = api->grid;
+
+ /* use elm_box_children_get() to get list of children */
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case GRID_ALIGN_SET: /* 0 */
+ elm_gengrid_align_set(grid, 0.2, 0.8);
+ break;
+
+ case GRID_BRING_IN: /* 1 */
+ elm_gengrid_item_bring_in(elm_gengrid_first_item_get(grid), ELM_GENGRID_ITEM_SCROLLTO_IN);
+ break;
+
+ case GRID_NO_SELECT_MODE: /* 2 */
+ elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_NONE);
+ break;
+
+ case GRID_NO_BOUNCE: /* 3 */
+ elm_scroller_bounce_set(grid, EINA_TRUE, EINA_FALSE);
+ break;
+
+ case GRID_PAGE_RELATIVE: /* 4 */
+ elm_scroller_bounce_set(grid, EINA_TRUE, EINA_TRUE);
+ elm_scroller_page_relative_set(grid, 0.5, 0.5);
+ break;
+
+ case GRID_PAGE_SIZE: /* 5 */
+ elm_scroller_page_size_set(grid, 50, 25);
+ break;
+
+ case GRID_TOOLTIP_SET_TEXT: /* 6 */
+ {
+ Elm_Object_Item *item = elm_gengrid_first_item_get(grid);
+ elm_gengrid_item_tooltip_text_set(item, "This is the first item");
+ }
+ break;
+
+ case GRID_TOOLTIP_UNSET: /* 7 */
+ {
+ Elm_Object_Item *item = elm_gengrid_first_item_get(grid);
+ elm_gengrid_item_tooltip_unset(item);
+ }
+ break;
+
+ case API_STATE_LAST:
+ break;
+
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static const char *img[9] =
+{
+ "panel_01.jpg",
+ "plant_01.jpg",
+ "rock_01.jpg",
+ "rock_02.jpg",
+ "sky_01.jpg",
+ "sky_02.jpg",
+ "sky_03.jpg",
+ "sky_04.jpg",
+ "wood_01.jpg",
+};
+
+static const char *cur[4] =
+{
+ ELM_CURSOR_CIRCLE,
+ ELM_CURSOR_CLOCK,
+ ELM_CURSOR_COFFEE_MUG,
+ ELM_CURSOR_CROSS,
+};
+
+static int n_current_pic = 0;
+static void
+_horizontal_grid(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *grid = data;
+ elm_gengrid_horizontal_set(grid, elm_check_state_get(obj));
+}
+
+static void
+_item_loop_enable_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *grid = data;
+ elm_object_scroll_item_loop_enabled_set(grid, elm_check_state_get(obj));
+}
+
+static void
+_focus_highlight_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_enabled_set(data, elm_check_state_get(obj));
+}
+
+static void
+grid_drag_up(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("Drag up: %p\n", event_info);
+}
+
+static void
+grid_drag_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("Drag right: %p\n", event_info);
+}
+
+static void
+grid_drag_down(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("Drag down: %p\n", event_info);
+}
+
+static void
+grid_drag_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("Drag left: %p\n", event_info);
+}
+
+static void
+grid_drag_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("Drag stop: %p\n", event_info);
+}
+
+static void
+grid_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("Selected: %p\n", event_info);
+}
+
+static void
+grid_unselected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("Unselected: %p\n", event_info);
+}
+
+static void
+grid_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("Double clicked: %p\n", event_info);
+}
+
+static void
+grid_right_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("Right clicked: %p\n", event_info);
+}
+
+static void
+grid_longpressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("longpressed %p\n", event_info);
+}
+
+static void
+grid_pressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("pressed %p\n", event_info);
+}
+
+static void
+grid_released(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("released %p\n", event_info);
+}
+
+static void
+grid_moved(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("moved %p\n", event_info);
+}
+
+static void
+grid_item_check_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Item_Data *id = data;
+ id->onoff = elm_check_state_get(obj);
+ printf("item %p onoff = %i\n", id, id->onoff);
+}
+
+char *
+grid_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ const Item_Data *id = data;
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Photo %s", id->path);
+ return strdup(buf);
+}
+
+Evas_Object *
+grid_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ const Item_Data *id = data;
+ if (!strcmp(part, "elm.swallow.icon"))
+ {
+ Evas_Object *image = elm_image_add(obj);
+ elm_image_file_set(image, id->path, NULL);
+ elm_image_aspect_fixed_set(image, EINA_FALSE);
+ evas_object_show(image);
+ return image;
+ }
+ else if (!strcmp(part, "elm.swallow.end"))
+ {
+ Evas_Object *ck = elm_check_add(obj);
+ evas_object_propagate_events_set(ck, EINA_FALSE);
+ elm_check_state_set(ck, id->onoff);
+ evas_object_smart_callback_add(ck, "changed", grid_item_check_changed, data);
+ evas_object_show(ck);
+ return ck;
+ }
+ return NULL;
+}
+
+Eina_Bool
+grid_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+void
+grid_del(void *data, Evas_Object *obj EINA_UNUSED)
+{
+ free(data);
+}
+
+static void
+grid_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ printf("sel item data [%p] on grid obj [%p], pointer [%p], position [%d]\n", data, obj, event_info, elm_gengrid_item_index_get(event_info));
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+static void
+reorder_mode_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_gengrid_reorder_mode_set(data, elm_check_state_get(obj));
+}
+
+static void
+always_select_mode_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (elm_check_state_get(obj))
+ elm_gengrid_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ else
+ elm_gengrid_select_mode_set(data, ELM_OBJECT_SELECT_MODE_DEFAULT);
+}
+
+static void
+multi_select_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_gengrid_multi_select_set(data, elm_check_state_get(obj));
+}
+
+static void
+wheel_disable_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_gengrid_wheel_disabled_set(data, elm_check_state_get(obj));
+}
+
+static void
+clear_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ elm_gengrid_clear(api->grid);
+}
+
+static Evas_Object *
+create_gengrid(Evas_Object *obj, int items)
+{
+ Evas_Object *grid = NULL;
+ Item_Data *id = NULL;
+ int i, n;
+ char buf[PATH_MAX];
+
+ grid = elm_gengrid_add(obj);
+ elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(200), ELM_SCALE_SIZE(150));
+ evas_object_smart_callback_add(grid, "selected", grid_selected, NULL);
+ evas_object_smart_callback_add(grid, "unselected", grid_unselected, NULL);
+ evas_object_smart_callback_add(grid, "clicked,double", grid_double_clicked, NULL);
+ evas_object_smart_callback_add(grid, "clicked,right", grid_right_clicked, NULL);
+ evas_object_smart_callback_add(grid, "longpressed", grid_longpressed, NULL);
+ evas_object_smart_callback_add(grid, "pressed", grid_pressed, NULL);
+ evas_object_smart_callback_add(grid, "released", grid_released, NULL);
+ evas_object_smart_callback_add(grid, "moved", grid_moved, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,up", grid_drag_up, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,right", grid_drag_right, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,down", grid_drag_down, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,left", grid_drag_left, NULL);
+ evas_object_smart_callback_add(grid, "drag,stop", grid_drag_stop, NULL);
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ gic = elm_gengrid_item_class_new();
+ gic->item_style = "default";
+ gic->func.text_get = grid_text_get;
+ gic->func.content_get = grid_content_get;
+ gic->func.state_get = grid_state_get;
+ gic->func.del = grid_del;
+
+ n = 0;
+ for (i = 0; i < items; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
+ n = (n + 1) % 9;
+ id = calloc(1, sizeof(Item_Data));
+ id->mode = i;
+ id->path = eina_stringshare_add(buf);
+ id->item = elm_gengrid_item_append(grid, gic, id, grid_sel, NULL);
+ if (!(i % 5))
+ elm_gengrid_item_selected_set(id->item, EINA_TRUE);
+ }
+ elm_gengrid_item_class_free(gic);
+
+ return grid;
+}
+
+static void
+restore_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ elm_box_clear(api->box);
+ api->grid = create_gengrid(obj, (12 * 12));
+ elm_box_pack_end(api->box, api->grid);
+ evas_object_show(api->grid);
+}
+
+static void
+filled_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *box = (Evas_Object *)data;
+ Evas_Object *grid;
+
+ elm_box_clear(box);
+ grid = create_gengrid(box, 1);
+ elm_gengrid_filled_set(grid, elm_check_state_get(obj));
+ elm_box_pack_end(box, grid);
+ evas_object_show(grid);
+}
+
+static void
+filled_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *content_box, *grid, *tg;
+
+ win = elm_win_util_standard_add("test filled", "Test Filled");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ content_box = elm_box_add(win);
+ evas_object_size_hint_weight_set(content_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, content_box);
+ elm_box_pack_end(box, content_box);
+ evas_object_show(content_box);
+
+ grid = create_gengrid(win, 1);
+ elm_box_pack_end(content_box, grid);
+ evas_object_show(grid);
+
+ tg = elm_check_add(win);
+ elm_object_text_set(tg, "Filled");
+ evas_object_smart_callback_add(tg, "changed", filled_cb, content_box);
+ elm_box_pack_end(box, tg);
+ evas_object_show(tg);
+
+ evas_object_resize(win, 450, 200);
+ evas_object_show(win);
+}
+
+static void
+cursor_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *grid = (Evas_Object *)data;
+ Elm_Object_Item *item = NULL;
+ int i = 0;
+
+ for ((item = elm_gengrid_first_item_get(grid)); item;
+ (item = elm_gengrid_item_next_get(item)))
+ {
+ if (!elm_check_state_get(obj))
+ {
+ elm_gengrid_item_cursor_unset(item);
+ continue;
+ }
+
+ elm_gengrid_item_cursor_set(item, cur[i]);
+ elm_gengrid_item_cursor_engine_only_set(item, EINA_FALSE);
+ i++;
+ }
+}
+
+static void
+cursor_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *content_box, *hbox, *grid, *tg;
+
+ win = elm_win_util_standard_add("test cursor", "Test Cursor");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ content_box = elm_box_add(win);
+ evas_object_size_hint_weight_set(content_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, content_box);
+ elm_box_pack_end(box, content_box);
+ evas_object_show(content_box);
+
+ grid = create_gengrid(win, 4);
+ elm_box_pack_end(content_box, grid);
+ evas_object_show(grid);
+
+ hbox = elm_box_add(win);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+
+ tg = elm_check_add(win);
+ elm_object_text_set(tg, "Cursor");
+ evas_object_smart_callback_add(tg, "changed", cursor_cb, grid);
+ elm_box_pack_end(hbox, tg);
+ evas_object_show(tg);
+
+ elm_box_pack_end(box, hbox);
+ evas_object_show(hbox);
+
+ evas_object_resize(win, 450, 450);
+ evas_object_show(win);
+}
+
+static void
+_btn_bring_in_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (!data) return;
+ Elm_Object_Item *it = elm_gengrid_selected_item_get(data);
+ if (!it) return;
+ elm_gengrid_item_bring_in(it, ELM_GENGRID_ITEM_SCROLLTO_IN);
+}
+
+static void
+_btn_show_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (!data) return;
+ Elm_Object_Item *it = elm_gengrid_selected_item_get(data);
+ if (!it) return;
+ elm_gengrid_item_show(it, ELM_GENGRID_ITEM_SCROLLTO_IN);
+}
+
+void
+test_gengrid(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *bxx, *bx, *ck;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("gengrid", "GenGrid");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ api->box = bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *)api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ /* Create GenGrid */
+ api->grid = create_gengrid(win, (12 * 12));
+ elm_box_pack_end(bxx, api->grid);
+ evas_object_show(api->grid);
+
+ /* Gengrid Options 1 */
+ bx = elm_box_add(win);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ elm_box_pack_end(bxx, bx);
+ evas_object_show(bx);
+
+ ck = elm_check_add(win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(ck, "Reorder mode enable");
+ evas_object_smart_callback_add(ck, "changed", reorder_mode_cb,
+ api->grid);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(ck, "Always Select Mode");
+ evas_object_smart_callback_add(ck, "changed", always_select_mode_cb,
+ api->grid);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(ck, "Multi Select Mode");
+ elm_check_state_set(ck, EINA_TRUE);
+ elm_gengrid_multi_select_set(api->grid, EINA_TRUE);
+ evas_object_smart_callback_add(ck, "changed", multi_select_cb,
+ api->grid);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(ck, "Wheel Disable");
+ evas_object_smart_callback_add(ck, "changed", wheel_disable_cb,
+ api->grid);
+ elm_box_pack_end(bx, ck);
+ evas_object_show(ck);
+
+ /* Gengrid Options 2 */
+ bx = elm_box_add(win);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ elm_box_pack_end(bxx, bx);
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Clear");
+ evas_object_smart_callback_add(bt, "clicked", clear_bt_clicked,
+ (void *)api);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Restore");
+ evas_object_smart_callback_add(bt, "clicked", restore_bt_clicked,
+ (void *) api);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Check Filled");
+ evas_object_smart_callback_add(bt, "clicked", filled_bt_clicked, NULL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Check Cursor");
+ evas_object_smart_callback_add(bt, "clicked", cursor_bt_clicked,
+ (void *) api);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Bring in");
+ evas_object_smart_callback_add(bt, "clicked", _btn_bring_in_clicked_cb, api->grid);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Show");
+ evas_object_smart_callback_add(bt, "clicked", _btn_show_clicked_cb, api->grid);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 600, 600);
+ evas_object_show(win);
+}
+
+static void
+_before_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Item_Data *id;
+ Evas_Object *grid = data;
+ Elm_Object_Item *sel;
+ char buf[PATH_MAX];
+
+ sel = elm_gengrid_selected_item_get(grid);
+ if (!sel)
+ return;
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n_current_pic]);
+ n_current_pic = ((n_current_pic +1) % 9);
+ id = calloc(1, sizeof(*id));
+ id->mode = 0;
+ id->path = eina_stringshare_add(buf);
+ id->item = elm_gengrid_item_insert_before(grid, gic, id, sel, grid_sel,
+ NULL);
+}
+
+static int
+compare_cb(const void *data1, const void *data2)
+{
+ Item_Data *ti1 = elm_object_item_data_get(data1);
+ Item_Data *ti2 = elm_object_item_data_get(data2);
+ return strlen(ti1->path) - strlen(ti2->path);
+}
+
+static void
+_sorted_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Item_Data *id;
+ Evas_Object *grid = data;
+ char buf[PATH_MAX];
+
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n_current_pic]);
+ n_current_pic = ((n_current_pic +1) % 9);
+ id = calloc(1, sizeof(*id));
+ id->mode = 0;
+ id->path = eina_stringshare_add(buf);
+ id->item = elm_gengrid_item_sorted_insert(grid, gic, id, compare_cb, grid_sel,
+ NULL);
+}
+
+static void
+_after_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Item_Data *id;
+ Evas_Object *grid = data;
+ Elm_Object_Item *sel;
+ char buf[PATH_MAX];
+
+ sel = elm_gengrid_selected_item_get(grid);
+ if (!sel)
+ return;
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n_current_pic]);
+ n_current_pic = ((n_current_pic +1) % 9);
+ id = calloc(1, sizeof(*id));
+ id->mode = 0;
+ id->path = eina_stringshare_add(buf);
+ id->item = elm_gengrid_item_insert_after(grid, gic, id, sel, grid_sel,
+ NULL);
+}
+
+static void
+_delete_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *grid = data;
+ Eina_List *l, *l2, *l3;
+ Elm_Object_Item *gg_it;
+
+ l = (Eina_List*)elm_gengrid_selected_items_get(grid);
+ if (!l) return;
+ EINA_LIST_FOREACH_SAFE(l, l2, l3, gg_it)
+ elm_object_item_del(gg_it);
+}
+
+static void
+_prepend_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Item_Data *id;
+ Evas_Object *grid = data;
+ char buf[PATH_MAX];
+
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n_current_pic]);
+ n_current_pic = ((n_current_pic +1) % 9);
+ id = calloc(1, sizeof(*id));
+ id->mode = 0;
+ id->path = eina_stringshare_add(buf);
+ id->item = elm_gengrid_item_prepend(grid, gic, id, grid_sel, NULL);
+ if (id->item) elm_gengrid_item_show(id->item, ELM_GENGRID_ITEM_SCROLLTO_IN);
+}
+
+static void
+_append_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Item_Data *id;
+ Evas_Object *grid = data;
+ char buf[PATH_MAX];
+
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n_current_pic]);
+ n_current_pic = ((n_current_pic +1) % 9);
+ id = calloc(1, sizeof(*id));
+ id->mode = 0;
+ id->path = eina_stringshare_add(buf);
+ id->item = elm_gengrid_item_append(grid, gic, id, grid_sel, NULL);
+ if (id->item) elm_gengrid_item_show(id->item, ELM_GENGRID_ITEM_SCROLLTO_IN);
+}
+
+static void
+_size_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *grid = data;
+ int size = elm_spinner_value_get(obj);
+ elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(size), ELM_SCALE_SIZE(size));
+}
+
+static void
+_gg_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info
+ EINA_UNUSED)
+{
+ elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj));
+}
+
+static void
+_grid_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj, void *event_info)
+{
+ Elm_Object_Item *it;
+ Evas_Event_Mouse_Down *m_info = event_info;
+
+ if (m_info->button == 1)
+ {
+ printf("mouse at (%d, %d), ", m_info->canvas.x, m_info->canvas.y);
+ it = elm_gengrid_at_xy_item_get(obj, m_info->canvas.x, m_info->canvas.y, NULL, NULL);
+ printf("Item found : %p\n", it);
+ }
+}
+
+void
+test_gengrid2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *grid, *bx, *hbx, *bt, *ck;
+
+ win = elm_win_util_standard_add("gengrid2", "GenGrid 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ grid = elm_gengrid_add(win);
+ elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150));
+ elm_gengrid_multi_select_set(grid, EINA_FALSE);
+ evas_object_smart_callback_add(grid, "selected", grid_selected, NULL);
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(grid, 600, 500);
+ elm_box_pack_end(bx, grid);
+ evas_object_event_callback_add(grid, EVAS_CALLBACK_MOUSE_DOWN,
+ _grid_mouse_down_cb, NULL);
+ evas_object_show(grid);
+
+ hbx = elm_box_add(win);
+ evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_horizontal_set(hbx, EINA_TRUE);
+ elm_box_pack_end(bx, hbx);
+ evas_object_show(hbx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Append");
+ evas_object_smart_callback_add(bt, "clicked", _append_bt_clicked, grid);
+ elm_box_pack_end(hbx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Prepend");
+ evas_object_smart_callback_add(bt, "clicked", _prepend_bt_clicked, grid);
+ elm_box_pack_end(hbx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Insert before");
+ evas_object_smart_callback_add(bt, "clicked", _before_bt_clicked, grid);
+ elm_box_pack_end(hbx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Insert after");
+ evas_object_smart_callback_add(bt, "clicked", _after_bt_clicked, grid);
+ elm_box_pack_end(hbx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Sorted insert");
+ evas_object_smart_callback_add(bt, "clicked", _sorted_bt_clicked, grid);
+ elm_box_pack_end(hbx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Delete");
+ evas_object_smart_callback_add(bt, "clicked", _delete_bt_clicked, grid);
+ elm_box_pack_end(hbx, bt);
+ evas_object_show(bt);
+
+ bt = elm_spinner_add(win);
+ elm_spinner_min_max_set(bt, 10, 1024);
+ elm_spinner_value_set(bt, 150);
+ elm_spinner_label_format_set(bt, "Item size: %.0f");
+ evas_object_smart_callback_add(bt, "changed", _size_changed, grid);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(hbx, bt);
+ evas_object_show(bt);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Reorder mode enable");
+ evas_object_smart_callback_add(ck, "changed", reorder_mode_cb, grid);
+ elm_box_pack_end(hbx, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Horizontal Mode");
+ evas_object_smart_callback_add(ck, "changed", _horizontal_grid, grid);
+ elm_box_pack_end(hbx, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Item loop enable");
+ evas_object_smart_callback_add(ck, "changed", _item_loop_enable_changed_cb, grid);
+ elm_box_pack_end(hbx, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Focus Highlight Set");
+ evas_object_smart_callback_add(ck, "changed", _focus_highlight_changed_cb, win);
+ elm_box_pack_end(hbx, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(hbx);
+ elm_object_text_set(ck, "Item Select on Focus disable");
+ elm_check_state_set(ck, elm_config_item_select_on_focus_disabled_get());
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_focus_item_select_on_focus_disable_changed_cb,
+ NULL);
+ elm_box_pack_end(hbx, ck);
+ evas_object_show(ck);
+
+
+ gic = elm_gengrid_item_class_new();
+ gic->item_style = "default";
+ gic->func.text_get = grid_text_get;
+ gic->func.content_get = grid_content_get;
+ gic->func.state_get = grid_state_get;
+ gic->func.del = grid_del;
+
+ /* item_class_ref is needed for gic. some items can be added in callbacks */
+ elm_gengrid_item_class_ref(gic);
+ elm_gengrid_item_class_free(gic);
+
+ evas_object_resize(win, 600, 600);
+ evas_object_show(win);
+}
+
+void
+test_gengrid3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *grid;
+ static Item_Data id[144];
+ int i, n;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("gengrid_group", "GenGrid Group");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ grid = elm_gengrid_add(win);
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, grid);
+ elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150));
+ elm_gengrid_group_item_size_set(grid, ELM_SCALE_SIZE(31), ELM_SCALE_SIZE(31));
+ elm_gengrid_multi_select_set(grid, EINA_TRUE);
+ evas_object_smart_callback_add(grid, "selected", grid_selected, NULL);
+ evas_object_smart_callback_add(grid, "clicked,double", grid_double_clicked, NULL);
+ evas_object_smart_callback_add(grid, "longpressed", grid_longpressed, NULL);
+ evas_object_smart_callback_add(grid, "moved", grid_moved, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,up", grid_drag_up, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,right", grid_drag_right, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,down", grid_drag_down, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,left", grid_drag_left, NULL);
+ evas_object_smart_callback_add(grid, "drag,stop", grid_drag_stop, NULL);
+
+ gic = elm_gengrid_item_class_new();
+ gic->item_style = "default";
+ gic->func.text_get = grid_text_get;
+ gic->func.content_get = grid_content_get;
+ gic->func.state_get = grid_state_get;
+ gic->func.del = NULL;
+
+ ggic = elm_gengrid_item_class_new();
+ ggic->item_style = "group_index";
+ ggic->func.text_get = grid_text_get;
+ ggic->func.content_get = NULL;
+ ggic->func.state_get = NULL;
+ ggic->func.del = NULL;
+
+ n = 0;
+ for (i = 0; i < 12 * 12; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
+ n = (n + 1) % 9;
+ id[i].mode = i;
+ id[i].path = eina_stringshare_add(buf);
+ if (i == 0 || i == 18 || i == 53 || i == 100)
+ //if (i == 0 || i == 18)
+ id[i].item = elm_gengrid_item_append(grid, ggic, &(id[i]), grid_sel, NULL);
+ else
+ id[i].item = elm_gengrid_item_append(grid, gic, &(id[i]), grid_sel, NULL);
+ if (!(i % 5))
+ elm_gengrid_item_selected_set(id[i].item, EINA_TRUE);
+ }
+ elm_gengrid_item_class_free(gic);
+ elm_gengrid_item_class_free(ggic);
+
+ evas_object_show(grid);
+
+ evas_object_resize(win, 600, 600);
+ evas_object_show(win);
+}
+
+/* test gengrid item styles */
+
+static Evas_Object *
+_gengrid_create(Evas_Object *obj, int items, const char *style)
+{
+ static Evas_Object *grid = NULL;
+ Elm_Gengrid_Item_Class *ic;
+ Item_Data *id;
+ int i, n;
+ char buf[PATH_MAX];
+
+ if (grid)
+ elm_gengrid_clear(grid);
+ else
+ {
+ if (!obj) return NULL;
+ grid = elm_gengrid_add(obj);
+ elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150));
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ }
+
+ ic = elm_gengrid_item_class_new();
+ if (style) ic->item_style = style;
+ else ic->item_style = "default";
+ ic->func.text_get = grid_text_get;
+ ic->func.content_get = grid_content_get;
+ ic->func.state_get = NULL;
+ ic->func.del = grid_del;
+
+ n = 0;
+ for (i = 0; i < items; i++)
+ {
+ id = calloc(1, sizeof(Item_Data));
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
+ n = (n + 1) % 9;
+ id->mode = i;
+ id->path = eina_stringshare_add(buf);
+ id->item = elm_gengrid_item_append(grid, ic, id, NULL, NULL);
+ }
+ elm_gengrid_item_class_free(ic);
+
+ return grid;
+}
+
+static void
+_item_style_sel_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _gengrid_create(NULL, (12*12), data);
+}
+
+static Evas_Object *
+_item_styles_list_create(Evas_Object *parent)
+{
+ Evas_Object *list;
+
+ list = elm_list_add(parent);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_list_item_append(list, "default", NULL, NULL,
+ _item_style_sel_cb, "default");
+ elm_list_item_append(list, "default_style", NULL, NULL,
+ _item_style_sel_cb, "default_style");
+ elm_list_item_append(list, "up", NULL, NULL,
+ _item_style_sel_cb, "up");
+ elm_list_item_append(list, "album-preview", NULL, NULL,
+ _item_style_sel_cb, "album-preview");
+ elm_list_item_append(list, "thumb", NULL, NULL,
+ _item_style_sel_cb, "thumb");
+ elm_list_go(list);
+
+ return list;
+}
+
+/* Set elementary widget's min size.
+ * We should not set min size hint to elementary widgets because elementary has
+ * its own size policy/logic. This is an official trick from raster.
+ * @param obj the actual object that you want to set the min size
+ * @param parent parent object for elm_table_add
+ * @param w min width
+ * @param h min height
+ */
+Evas_Object *
+_elm_min_set(Evas_Object *obj, Evas_Object *parent, Evas_Coord w, Evas_Coord h)
+{
+ Evas_Object *table, *rect;
+
+ table = elm_table_add(parent);
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(table));
+ evas_object_size_hint_min_set(rect, w, h);
+ evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(rect, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(table, rect, 0, 0, 1, 1);
+
+ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(table, obj, 0, 0, 1, 1);
+
+ return table;
+}
+
+void
+test_gengrid_item_styles(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *gengrid, *list, *table;
+
+ win = elm_win_util_standard_add("gengrid-styles", "Gengrid Item Styles");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ list = _item_styles_list_create(box);
+ evas_object_show(list);
+
+ table = _elm_min_set(list, box, 100, 0);
+ evas_object_size_hint_weight_set(table, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, table);
+ evas_object_show(table);
+
+ gengrid = _gengrid_create(win, (12 * 12), NULL);
+ elm_box_pack_end(box, gengrid);
+ evas_object_show(gengrid);
+
+ evas_object_resize(win, 600, 600);
+ evas_object_show(win);
+}
+
+static void
+_rd1_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Show_Data *sd = data;
+ int winmode = elm_radio_state_value_get(obj);
+ if (winmode == 0)
+ elm_gengrid_horizontal_set(sd->grid, EINA_TRUE);
+ else if (winmode == 1)
+ elm_gengrid_horizontal_set(sd->grid, EINA_FALSE);
+}
+
+static void
+_rd2_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Show_Data *sd = data;
+ sd->scrollto = elm_radio_state_value_get(obj);
+}
+
+static void
+_bring_in_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Show_Data *sd = data;
+ Elm_Object_Item *item = elm_gengrid_selected_item_get(sd->grid);
+ elm_gengrid_item_bring_in(item, sd->scrollto);
+ elm_gengrid_item_selected_set(item, EINA_TRUE);
+}
+
+static void
+_show_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Show_Data *sd = data;
+ Elm_Object_Item *item = elm_gengrid_selected_item_get(sd->grid);
+ elm_gengrid_item_show(item, sd->scrollto);
+ elm_gengrid_item_selected_set(item, EINA_TRUE);
+}
+
+static Evas_Object *
+_window_mode_frame_new(Evas_Object *win, void *data)
+{
+ Evas_Object *fr, *bx, *rd, *rdg;
+ Show_Data *sd = data;
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Direction");
+ evas_object_show(fr);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 0);
+ elm_object_text_set(rd, "horizontal");
+ evas_object_smart_callback_add(rd, "changed", _rd1_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+ rdg = rd;
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 1);
+ elm_object_text_set(rd, "vertical");
+ elm_radio_group_add(rd, rdg);
+ evas_object_smart_callback_add(rd, "changed", _rd1_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+ return fr;
+}
+
+static Evas_Object *
+_scrollto_mode_frame_new(Evas_Object *win, void *data)
+{
+ Evas_Object *fr, *bx, *rd, *rdg;
+ Show_Data *sd = data;
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Scrollto Mode");
+ evas_object_show(fr);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 0);
+ elm_object_text_set(rd, "SCROLLTO_NONE");
+ evas_object_smart_callback_add(rd, "changed", _rd2_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+ rdg = rd;
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 1);
+ elm_object_text_set(rd, "SCROLLTO_IN");
+ elm_radio_group_add(rd, rdg);
+ evas_object_smart_callback_add(rd, "changed", _rd2_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 2);
+ elm_object_text_set(rd, "SCROLLTO_TOP");
+ elm_radio_group_add(rd, rdg);
+ evas_object_smart_callback_add(rd, "changed", _rd2_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 4);
+ elm_object_text_set(rd, "SCROLLTO_MIDDLE");
+ elm_radio_group_add(rd, rdg);
+ evas_object_smart_callback_add(rd, "changed", _rd2_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 8);
+ elm_object_text_set(rd, "SCROLLTO_BOTTOM");
+ elm_radio_group_add(rd, rdg);
+ evas_object_smart_callback_add(rd, "changed", _rd2_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+ return fr;
+}
+
+void
+test_gengrid4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *bx, *bx2, *fr, *grid;
+ Show_Data *sd = calloc(1, sizeof(Show_Data));
+ char buf[PATH_MAX];
+ int i, n;
+ static Item_Data ti[10000];
+
+ win = elm_win_util_standard_add("gengrid-show-bringin", "GenGrid Show/Bring_in");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, sd);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ grid = elm_gengrid_add(win);
+ elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150));
+ elm_gengrid_group_item_size_set(grid, ELM_SCALE_SIZE(31), ELM_SCALE_SIZE(31));
+ elm_gengrid_align_set(grid, 0.1, 0.1);
+ elm_gengrid_horizontal_set(grid, EINA_TRUE);
+
+ gic = elm_gengrid_item_class_new();
+ gic->item_style = "default";
+ gic->func.text_get = grid_text_get;
+ gic->func.content_get = grid_content_get;
+ gic->func.state_get = grid_state_get;
+ gic->func.del = NULL;
+
+ for (i = 0, n = 0; i < 10000; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
+ n = (n + 1) % 9;
+ ti[i].mode = i;
+ ti[i].path = eina_stringshare_add(buf);
+ ti[i].item = elm_gengrid_item_append(grid, gic, &(ti[i]), grid_sel, NULL);
+ if (i == 2579)
+ elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE);
+ }
+
+ elm_gengrid_item_class_free(gic);
+ elm_gengrid_item_show(ti[2579].item, sd->scrollto);
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_min_set(grid, 600, 400);
+ evas_object_show(grid);
+ sd->grid = grid;
+ elm_box_pack_end(bx, grid);
+
+ bx2 = elm_box_add(bx);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ fr = _window_mode_frame_new(bx2, sd);
+ elm_box_pack_end(bx2, fr);
+
+ fr = _scrollto_mode_frame_new(bx2, sd);
+ elm_box_pack_end(bx2, fr);
+
+ bx2 = elm_box_add(bx);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bt = elm_button_add(bx2);
+ elm_object_text_set(bt, "Show");
+ evas_object_smart_callback_add(bt, "clicked", _show_clicked_cb, sd);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx2);
+ elm_object_text_set(bt, "Bring In");
+ evas_object_smart_callback_add(bt, "clicked", _bring_in_clicked_cb, sd);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
+
+typedef struct _grid5_Event_Data grid5_Event_Data;
+struct _grid5_Event_Data
+{
+ Evas_Object *grid_obj;
+ Evas_Object *en_obj;
+ Elm_Object_Item *last_item_found;
+};
+
+static const char *_grid5_items_text[] = {
+ "Albany", "Annapolis",
+ "Atlanta", "Augusta",
+ "Austin", "Baton Rouge",
+ "Bismarck", "Boise",
+ "Boston", "Carson City",
+ "Charleston", "Cheyenne",
+ "Columbia", "Columbus",
+ "Concord", "Denver",
+ "Des Moines", "Dover",
+ "Frankfort", "Harrisburg",
+ "Hartford", "Helena",
+ "Honolulu", "Indianapolis",
+ "Jackson", "Jefferson City",
+ "Juneau", "Lansing",
+ "Lincoln", "Little Rock",
+ "Madison", "Montgomery",
+ "Montpelier", "Nashville",
+ "Oklahoma City", "Olympia",
+ "Phoenix", "Pierre",
+ "Providence", "Raleigh",
+ "Richmond", "Sacramento",
+ "Saint Paul", "Salem",
+ "Salt Lake City", "Santa Fe",
+ "Springfield", "Tallahassee",
+ "Topeka", "Trenton"
+};
+
+static char *
+_grid5_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ Item_Data *id = data;
+ char buf[64];
+ snprintf(buf, sizeof(buf), "%s", _grid5_items_text[id->mode]);
+ return strdup(buf);
+}
+
+static void
+_grid5_search_item(grid5_Event_Data *event_data, Elm_Object_Item * it)
+{
+ const char *str = elm_entry_entry_get(event_data->en_obj);
+ if (!str || !strlen(str)) return;
+
+ printf("Looking for \"%s\". ", str);
+ event_data->last_item_found = elm_gengrid_search_by_text_item_get
+ (event_data->grid_obj, it, NULL, str, 0);
+
+ if (event_data->last_item_found)
+ {
+ printf("Found.\n");
+ elm_gengrid_item_selected_set(event_data->last_item_found, EINA_TRUE);
+ elm_gengrid_item_bring_in(event_data->last_item_found, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE);
+ elm_object_focus_set(event_data->en_obj, EINA_TRUE);
+ }
+ else
+ printf("Not Found.\n");
+}
+
+static void
+_grid5_search_settings_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *einfo EINA_UNUSED)
+{
+ _grid5_search_item(data, NULL);
+}
+
+static void
+_grid5_on_keydown(void *data, Evas *evas EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ grid5_Event_Data * event_data = (grid5_Event_Data *)data;
+
+ if (!strcmp(ev->key, "Return"))
+ {
+ printf("Looking for next item\n");
+ _grid5_search_item(data, event_data->last_item_found);
+ }
+}
+
+static Elm_Gengrid_Item_Class *
+_grid5_item_class_create(const char *item_style)
+{
+ Elm_Gengrid_Item_Class * itc = elm_gengrid_item_class_new();
+ itc->item_style = item_style;
+ itc->func.text_get = _grid5_text_get;
+ itc->func.content_get = grid_content_get;
+ itc->func.state_get = grid_state_get;
+ itc->func.del = NULL;
+ return itc;
+}
+
+void
+test_gengrid5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *grid;
+ Evas_Object *fr, *lb_frame;
+ Evas_Object *en, *bx_entry, *lb_entry;
+ grid5_Event_Data *event_data;
+ Elm_Gengrid_Item_Class *itc = NULL;
+ static Item_Data id[50];
+ char buf[PATH_MAX];
+ int i, n;
+
+ win = elm_win_util_standard_add("gengrid-item-search-by-text", "Gengrid Item Search By Text");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fr = elm_frame_add(bx);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0);
+ elm_object_text_set(fr, "Information");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ lb_frame = elm_label_add(fr);
+ elm_object_text_set(lb_frame,
+ "<align=left>This is an example of elm_gengrid_search_by_text_item_get() usage.<br>"
+ "Enter search string to the entry and press Enter to show next search result.<br>");
+ elm_object_content_set(fr, lb_frame);
+ evas_object_show(lb_frame);
+
+ bx_entry = elm_box_add(win);
+ elm_box_horizontal_set(bx_entry, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx_entry, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx_entry, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(bx, bx_entry);
+ evas_object_show(bx_entry);
+
+ lb_entry = elm_label_add(win);
+ elm_object_text_set(lb_entry, " Search:");
+ evas_object_size_hint_weight_set(lb_entry, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lb_entry, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_entry, lb_entry);
+ evas_object_show(lb_entry);
+
+ en = elm_entry_add(win);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_object_part_text_set(en, "guide", "Type item's name here to search.");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_entry, en);
+ evas_object_show(en);
+ elm_object_focus_set(en, EINA_TRUE);
+
+ grid = elm_gengrid_add(bx);
+ elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(200), ELM_SCALE_SIZE(150));
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ elm_box_pack_end(bx, grid);
+ evas_object_show(grid);
+
+ event_data = calloc(1, sizeof(grid5_Event_Data));
+ event_data->en_obj = en;
+ event_data->grid_obj = grid;
+ event_data->last_item_found = NULL;
+
+ evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_DOWN, _grid5_on_keydown, (void*)event_data);
+ evas_object_smart_callback_add(en, "changed,user", _grid5_search_settings_changed_cb, (void*)event_data);
+ evas_object_event_callback_add(grid, EVAS_CALLBACK_FREE, _cleanup_cb, (void*)event_data);
+
+ itc = _grid5_item_class_create("default");
+
+ for (i = 0, n = 0; i < 50; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
+ n = (n + 1) % 9;
+ id[i].mode = i;
+ id[i].path = eina_stringshare_add(buf);
+ id[i].item = elm_gengrid_item_append(grid, itc, &(id[i]), grid_sel, NULL);
+ if (!(i % 5))
+ elm_gengrid_item_selected_set(id[i].item, EINA_TRUE);
+ }
+ elm_gengrid_item_class_free(itc);
+
+ evas_object_resize(win, 320, 500);
+ evas_object_show(win);
+}
+
+void
+test_gengrid_speed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fr, *bx;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("gengrid", "Gengrid");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ api->box = bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
+ elm_frame_autocollapse_set(fr, EINA_TRUE);
+ elm_object_text_set(fr, "Collapse me!");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ api->grid = create_gengrid(win, 5000);
+ evas_object_size_hint_min_set(api->grid, 600, 600);
+ elm_gengrid_item_size_set(api->grid,
+ ELM_SCALE_SIZE(30),
+ ELM_SCALE_SIZE(36));
+ elm_object_content_set(fr, api->grid);
+ evas_object_show(api->grid);
+ evas_object_resize(win, 600, 600);
+ evas_object_show(win);
+}
+
+
+/*** Gengrid Focus *********************************************************/
+static void
+_gengrid_focus_item_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ printf("%s: %p\n", (char *)data, event_info);
+}
+
+static void
+_gengrid_focus_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static void
+_gengrid_focus_item_activated_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup, *btn;
+
+ popup = elm_popup_add(data);
+ elm_object_text_set(popup, "This Popup must have the focus");
+
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Close");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _gengrid_focus_popup_close_cb, popup);
+
+ evas_object_show(popup);
+}
+
+static void
+_gengrid_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ printf("\n=== Key Down : %s ===\n", ev->keyname);
+}
+
+static void
+_gg_focus_focus_move_policy_changed_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ int val = elm_radio_value_get(obj);
+
+ if (val == 0)
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK);
+ else if (val == 1)
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN);
+}
+
+static void
+_gg_focus_win_auto_focus_enable_changed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_window_auto_focus_enable_set(elm_check_state_get(obj));
+}
+
+static void
+_gg_focus_win_auto_focus_animate_changed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_window_auto_focus_animate_set(elm_check_state_get(obj));
+}
+
+static void
+_gg_focus_focus_highlight_changed_cb(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_enabled_set((Evas_Object *)data,
+ elm_check_state_get(obj));
+}
+
+static void
+_gg_focus_focus_animate_changed_cb(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_animate_set((Evas_Object *)data,
+ elm_check_state_get(obj));
+}
+
+static void
+_gg_focus_region_show_item_cb(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ if (elm_check_state_get(obj))
+ elm_object_focus_region_show_mode_set((Evas_Object *)data,
+ ELM_FOCUS_REGION_SHOW_ITEM);
+ else
+ elm_object_focus_region_show_mode_set((Evas_Object *)data,
+ ELM_FOCUS_REGION_SHOW_WIDGET);
+}
+
+static void
+_grid_reorder_mode(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ if (elm_check_state_get(obj))
+ elm_gengrid_reorder_mode_start((Evas_Object *)data,
+ ECORE_POS_MAP_LINEAR);
+ else
+ elm_gengrid_reorder_mode_stop((Evas_Object *)data);
+}
+
+static void
+_gg_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
+}
+
+void
+test_gengrid_focus(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx_horiz, *in_bx, *scr, *gengrid, *gengrid2, *btn, *fr, *bx_mv, *bx_opt, *ck, *rdg, *rd;
+ Elm_Gengrid_Item_Class *ic;
+ Item_Data *id;
+ char buf[PATH_MAX];
+ int i, n;
+
+ win = elm_win_util_standard_add("gengrid-focus", "Gengrid Focus");
+ elm_config_window_auto_focus_enable_set(EINA_TRUE);
+ elm_config_window_auto_focus_animate_set(EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_FALSE);
+ elm_win_focus_highlight_animate_set(win, EINA_FALSE);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx_horiz = elm_box_add(win);
+ elm_box_horizontal_set(bx_horiz, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx_horiz, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx_horiz);
+ evas_object_show(bx_horiz);
+
+ btn = elm_button_add(bx_horiz);
+ elm_object_text_set(btn, "Left");
+ elm_box_pack_end(bx_horiz, btn);
+ evas_object_show(btn);
+
+ bx = elm_box_add(bx_horiz);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_horiz, bx);
+ evas_object_show(bx);
+
+ btn = elm_button_add(bx);
+ elm_object_text_set(btn, "Up");
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+ elm_object_focus_set(btn, EINA_TRUE);
+
+ scr = elm_scroller_add(bx);
+ evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(scr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, scr);
+ evas_object_show(scr);
+
+ in_bx = elm_box_add(scr);
+ evas_object_size_hint_weight_set(in_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(in_bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(scr, in_bx);
+ evas_object_show(in_bx);
+
+ gengrid = elm_gengrid_add(in_bx);
+ elm_gengrid_item_size_set(gengrid,
+ ELM_SCALE_SIZE(150),
+ ELM_SCALE_SIZE(150));
+ evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_min_set(gengrid, 0, ELM_SCALE_SIZE(620));
+ elm_box_pack_end(in_bx, gengrid);
+ evas_object_show(gengrid);
+ evas_object_smart_callback_add(gengrid, "item,focused", _gengrid_focus_item_cb, "item,focused");
+ evas_object_smart_callback_add(gengrid, "item,unfocused", _gengrid_focus_item_cb, "item,unfocused");
+ evas_object_smart_callback_add(gengrid, "selected", _gengrid_focus_item_cb, "selected");
+ evas_object_smart_callback_add(gengrid, "unselected", _gengrid_focus_item_cb, "unselected");
+ evas_object_smart_callback_add(gengrid, "highlighted", _gengrid_focus_item_cb, "highlighted");
+ evas_object_smart_callback_add(gengrid, "unhighlighted", _gengrid_focus_item_cb, "unhighlighted");
+ evas_object_smart_callback_add(gengrid, "activated", _gengrid_focus_item_cb, "activated");
+ evas_object_smart_callback_add(gengrid, "activated", _gengrid_focus_item_activated_cb, win);
+ evas_object_event_callback_add(gengrid, EVAS_CALLBACK_KEY_DOWN, _gengrid_focus_key_down_cb, NULL);
+
+ gengrid2 = elm_gengrid_add(in_bx);
+ elm_gengrid_item_size_set(gengrid2,
+ ELM_SCALE_SIZE(150),
+ ELM_SCALE_SIZE(150));
+ evas_object_size_hint_weight_set(gengrid2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gengrid2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_min_set(gengrid2, 0, ELM_SCALE_SIZE(620));
+ elm_box_pack_end(in_bx, gengrid2);
+ evas_object_show(gengrid2);
+ evas_object_smart_callback_add(gengrid2, "item,focused", _gengrid_focus_item_cb, "item,focused");
+ evas_object_smart_callback_add(gengrid2, "item,unfocused", _gengrid_focus_item_cb, "item,unfocused");
+ evas_object_smart_callback_add(gengrid2, "selected", _gengrid_focus_item_cb, "selected");
+ evas_object_smart_callback_add(gengrid2, "unselected", _gengrid_focus_item_cb, "unselected");
+ evas_object_smart_callback_add(gengrid2, "highlighted", _gengrid_focus_item_cb, "highlighted");
+ evas_object_smart_callback_add(gengrid2, "unhighlighted", _gengrid_focus_item_cb, "unhighlighted");
+ evas_object_smart_callback_add(gengrid2, "activated", _gengrid_focus_item_cb, "activated");
+ evas_object_smart_callback_add(gengrid2, "activated", _gengrid_focus_item_activated_cb, win);
+ evas_object_event_callback_add(gengrid2, EVAS_CALLBACK_KEY_DOWN, _gengrid_focus_key_down_cb, NULL);
+
+ btn = elm_button_add(bx);
+ elm_object_text_set(btn, "Down");
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ btn = elm_button_add(bx_horiz);
+ elm_object_text_set(btn, "Right");
+ elm_box_pack_end(bx_horiz, btn);
+ evas_object_show(btn);
+
+ //Options
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Options");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_opt = elm_box_add(fr);
+ elm_box_layout_set(bx_opt, evas_object_box_layout_flow_horizontal, NULL, NULL);
+ evas_object_size_hint_weight_set(bx_opt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx_opt, EVAS_HINT_FILL, 0.0);
+ elm_box_align_set(bx_opt, 0.0, 0.5);
+ elm_object_content_set(fr, bx_opt);
+ evas_object_show(bx_opt);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "Window Auto Focus Enable");
+ elm_check_state_set(ck, EINA_TRUE);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_focus_win_auto_focus_enable_changed,
+ NULL);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "Window Auto Focus Animate");
+ elm_check_state_set(ck, EINA_TRUE);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_focus_win_auto_focus_animate_changed,
+ NULL);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "Focus Highlight");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_focus_focus_highlight_changed_cb,
+ win);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "Focus Animation");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_focus_focus_animate_changed_cb,
+ win);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "Focus Region Show as Item");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_focus_region_show_item_cb,
+ gengrid);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_focus_region_show_item_cb,
+ gengrid2);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "Horizontal Mode");
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed", _horizontal_grid, gengrid);
+ evas_object_smart_callback_add(ck, "changed", _horizontal_grid, gengrid2);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "Rorder mode enable");
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed", _grid_reorder_mode, gengrid);
+ evas_object_smart_callback_add(ck, "changed", _grid_reorder_mode, gengrid2);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "Item Select on Focus disable");
+ elm_check_state_set(ck, elm_config_item_select_on_focus_disabled_get());
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_focus_item_select_on_focus_disable_changed_cb,
+ NULL);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "First item focus on first focus in");
+ elm_check_state_set(ck, elm_config_first_item_focus_on_first_focusin_get());
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_first_item_focus_on_first_focus_in_cb,
+ NULL);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ // Focus Autoscroll Mode
+ fr = _focus_autoscroll_mode_frame_create(bx);
+ elm_box_pack_end(bx, fr);
+
+ //Focus movement policy
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Focus Movement Policy");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_mv = elm_box_add(fr);
+ elm_box_horizontal_set(bx_mv, EINA_TRUE);
+ elm_object_content_set(fr, bx_mv);
+ evas_object_show(bx_mv);
+
+ rdg = rd = elm_radio_add(bx_mv);
+ elm_object_text_set(rd, "Focus Move by Click");
+ elm_radio_state_value_set(rd, 0);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(rd, "changed",
+ _gg_focus_focus_move_policy_changed_cb,
+ NULL);
+ elm_box_pack_end(bx_mv, rd);
+ evas_object_show(rd);
+
+ rd = elm_radio_add(bx_mv);
+ elm_object_text_set(rd, "Focus Move by Mouse-In");
+ elm_radio_group_add(rd, rdg);
+ elm_radio_state_value_set(rd, 1);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(rd, "changed",
+ _gg_focus_focus_move_policy_changed_cb,
+ NULL);
+ elm_box_pack_end(bx_mv, rd);
+ evas_object_show(rd);
+
+ ic = elm_gengrid_item_class_new();
+ ic->item_style = "default";
+ ic->func.text_get = grid_text_get;
+ ic->func.content_get = grid_content_get;
+ ic->func.state_get = NULL;
+ ic->func.del = grid_del;
+
+ n = 0;
+ for (i = 0; i < 24; i++)
+ {
+ id = calloc(1, sizeof(Item_Data));
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
+ n = (n + 1) % 9;
+ id->mode = i;
+ id->path = eina_stringshare_add(buf);
+ id->item = elm_gengrid_item_append(gengrid, ic, id, NULL, NULL);
+ if (i == 4)
+ elm_object_item_disabled_set(id->item, EINA_TRUE);
+ }
+
+ n = 0;
+ for (i = 0; i < 24; i++)
+ {
+ id = calloc(1, sizeof(Item_Data));
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
+ n = (n + 1) % 9;
+ id->mode = i;
+ id->path = eina_stringshare_add(buf);
+ id->item = elm_gengrid_item_append(gengrid2, ic, id, NULL, NULL);
+ if (i == 4)
+ elm_object_item_disabled_set(id->item, EINA_TRUE);
+ }
+ elm_gengrid_item_class_free(ic);
+
+ evas_object_resize(win, 600, 600);
+ evas_object_show(win);
+}
+
+char *
+_gg_update_text_get(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ const char *part EINA_UNUSED)
+{
+ char *txt[] = {"Sky", "Stone", "Water", "Flower", "Sand", "Sun", "Moon", "Star", "Cloud", NULL};
+ int n = rand() % 9;
+
+ return strdup(txt[n]);
+}
+
+Evas_Object *
+_gg_update_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ const Item_Data *id = data;
+ char buf[256];
+ int n = 0;
+
+ if (!strcmp(part, "elm.swallow.icon"))
+ {
+ n = rand() % 9;
+
+ Evas_Object *image = elm_image_add(obj);
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
+ elm_image_file_set(image, buf, NULL);
+ elm_image_aspect_fixed_set(image, EINA_FALSE);
+ evas_object_show(image);
+ return image;
+ }
+ else if (!strcmp(part, "elm.swallow.end"))
+ {
+ Evas_Object *ck = elm_check_add(obj);
+ evas_object_propagate_events_set(ck, EINA_FALSE);
+ elm_check_state_set(ck, id->onoff);
+ evas_object_smart_callback_add(ck, "changed", grid_item_check_changed, data);
+ evas_object_show(ck);
+ return ck;
+ }
+ return NULL;
+}
+
+Eina_Bool
+_gg_update_state_get(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ const char *part EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+static void
+_gg_item_update_clicked_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ api_data *api = (api_data *)data;
+
+ Evas_Object *gengrid = api->grid;
+ Eina_List *l = elm_gengrid_realized_items_get(gengrid);
+ Elm_Object_Item *item = NULL;
+ Item_Data *id = NULL;
+
+ EINA_LIST_FREE(l, item)
+ {
+ id = elm_object_item_data_get(item);
+ if (id && id->onoff) elm_gengrid_item_update(item);
+ }
+}
+
+static void
+_gg_item_fields_update_clicked_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ api_data *api = (api_data *)data;
+
+ Evas_Object *gengrid = api->grid;
+ Eina_List *l = elm_gengrid_realized_items_get(gengrid);
+ Elm_Object_Item *item = NULL;
+ Item_Data *id = NULL;
+
+ EINA_LIST_FREE(l, item)
+ {
+ id = elm_object_item_data_get(item);
+ if (id && id->onoff)
+ {
+ elm_gengrid_item_fields_update(item, "*", api->field_type);
+ }
+ }
+}
+
+static void
+_gg_text_update_changed_cb(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ api_data *api = (api_data *)data;
+
+ if (elm_check_state_get(obj))
+ api->field_type |= ELM_GENGRID_ITEM_FIELD_TEXT;
+ else
+ api->field_type ^= ELM_GENGRID_ITEM_FIELD_TEXT;
+}
+
+static void
+_gg_content_update_changed_cb(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ api_data *api = (api_data *)data;
+
+ if (elm_check_state_get(obj))
+ api->field_type |= ELM_GENGRID_ITEM_FIELD_CONTENT;
+ else
+ api->field_type ^= ELM_GENGRID_ITEM_FIELD_CONTENT;
+}
+
+static void
+_gg_state_update_changed_cb(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ api_data *api = (api_data *)data;
+
+ if (elm_check_state_get(obj))
+ api->field_type |= ELM_GENGRID_ITEM_FIELD_STATE;
+ else
+ api->field_type ^= ELM_GENGRID_ITEM_FIELD_STATE;
+}
+
+void
+test_gengrid_update(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *gengrid, *btn, *fr, *bx_opt, *ck;
+ Elm_Gengrid_Item_Class *ic;
+ api_data *api = calloc(1, sizeof(api_data));
+ Item_Data *id;
+ int i;
+
+ win = elm_win_util_standard_add("gengrid-update", "Gengrid Update");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ api->box = bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ api->grid = gengrid = elm_gengrid_add(bx);
+ elm_gengrid_item_size_set(gengrid,
+ ELM_SCALE_SIZE(150),
+ ELM_SCALE_SIZE(150));
+ evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gengrid);
+ evas_object_show(gengrid);
+ evas_object_smart_callback_add(gengrid, "item,focused", _gengrid_focus_item_cb, "item,focused");
+ evas_object_smart_callback_add(gengrid, "item,unfocused", _gengrid_focus_item_cb, "item,unfocused");
+ evas_object_smart_callback_add(gengrid, "selected", _gengrid_focus_item_cb, "selected");
+ evas_object_smart_callback_add(gengrid, "unselected", _gengrid_focus_item_cb, "unselected");
+ evas_object_smart_callback_add(gengrid, "activated", _gengrid_focus_item_cb, "activated");
+ evas_object_smart_callback_add(gengrid, "highlighted", _gengrid_focus_item_cb, "highlighted");
+ evas_object_smart_callback_add(gengrid, "unhighlighted", _gengrid_focus_item_cb, "unhighlighted");
+ evas_object_event_callback_add(gengrid, EVAS_CALLBACK_KEY_DOWN, _gengrid_focus_key_down_cb, NULL);
+
+ //initialize field type
+ api->field_type = ELM_GENGRID_ITEM_FIELD_ALL;
+
+ //Field Options
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Field Options");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_opt = elm_box_add(fr);
+ elm_box_horizontal_set(bx_opt, EINA_TRUE);
+ elm_object_content_set(fr, bx_opt);
+ evas_object_show(bx_opt);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "TEXT");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_text_update_changed_cb,
+ api);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "CONTENT");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_content_update_changed_cb,
+ api);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ ck = elm_check_add(bx_opt);
+ elm_object_text_set(ck, "STATE");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(ck, "changed",
+ _gg_state_update_changed_cb,
+ api);
+ elm_box_pack_end(bx_opt, ck);
+ evas_object_show(ck);
+
+ //Update Buttons
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Update Options");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_opt = elm_box_add(fr);
+ elm_box_horizontal_set(bx_opt, EINA_TRUE);
+ elm_object_content_set(fr, bx_opt);
+ evas_object_show(bx_opt);
+
+ btn = elm_button_add(bx_opt);
+ elm_object_text_set(btn, "Update");
+ evas_object_smart_callback_add(btn, "clicked", _gg_item_update_clicked_cb, api);
+ elm_box_pack_end(bx_opt, btn);
+ evas_object_show(btn);
+
+ btn = elm_button_add(bx_opt);
+ elm_object_text_set(btn, "Fields Update");
+ evas_object_smart_callback_add(btn, "clicked", _gg_item_fields_update_clicked_cb, api);
+ elm_box_pack_end(bx_opt, btn);
+ evas_object_show(btn);
+
+
+ //Gengrid Item Append
+ ic = elm_gengrid_item_class_new();
+ ic->item_style = "default";
+ ic->func.text_get = _gg_update_text_get;
+ ic->func.content_get = _gg_update_content_get;
+ ic->func.state_get = _gg_update_state_get;
+ ic->func.del = grid_del;
+
+ for (i = 0; i < 24; i++)
+ {
+ id = calloc(1, sizeof(Item_Data));
+ id->mode = i;
+ id->item = elm_gengrid_item_append(gengrid, ic, id, NULL, NULL);
+ if (i == 4)
+ elm_object_item_disabled_set(id->item, EINA_TRUE);
+ }
+ elm_gengrid_item_class_free(ic);
+
+ evas_object_resize(win, 600, 600);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_genlist.c b/src/bin/elementary/test_genlist.c
new file mode 100644
index 0000000000..4c69be277d
--- /dev/null
+++ b/src/bin/elementary/test_genlist.c
@@ -0,0 +1,5300 @@
+#include <Elementary_Cursor.h>
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+#include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#include "test_explode.h"
+
+Evas_Object * _elm_min_set(Evas_Object *obj, Evas_Object *parent,
+ Evas_Coord w, Evas_Coord h);
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ void *box; /* Use this to get box content */
+
+ Elm_Genlist_Item_Class *itc;
+ Elm_Genlist_Item_Class *itc1;
+ Elm_Genlist_Item_Class *itc2;
+ void *gl;
+
+ void *filter_data; /* The data used for filtering */
+ int scrollto;
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ HORIZONTAL_SET,
+ NO_SELECT_MODE_SET,
+ COMPRESS_MODE_SET,
+ BOUNCE_SET,
+ HOMOGENEOUS_SET,
+ SCROLLER_POLICY_SET,
+ TOOLTIP_TEXT_SET,
+ ITEM_CURSOR_SET,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static int bounce_max = 50;
+
+static void
+set_api_state(api_data *api)
+{
+ const Eina_List *items = elm_box_children_get(api->box);
+ if (!eina_list_count(items))
+ return;
+
+ Evas_Object *gl = eina_list_nth(items, 0); /* Genlist is the first item */
+ /* use elm_box_children_get() to get list of children */
+ switch(api->state)
+ {/* Put all api-changes under switch */
+ case HORIZONTAL_SET: /* 0 */
+ elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
+ break;
+
+ case NO_SELECT_MODE_SET: /* 1 */
+ elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_NONE);
+ elm_genlist_mode_set(gl, ELM_LIST_SCROLL); /* Back to default */
+ break;
+
+ case COMPRESS_MODE_SET: /* 2 */
+ elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_DEFAULT);
+ elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
+ break;
+
+ case BOUNCE_SET: /* 3 */
+ elm_scroller_bounce_set(gl, EINA_FALSE, EINA_FALSE);
+ break;
+
+ case HOMOGENEOUS_SET: /* 4 */
+ elm_scroller_bounce_set(gl, EINA_TRUE, EINA_TRUE); /* Back to default */
+ elm_genlist_homogeneous_set(gl, EINA_TRUE);
+ break;
+
+ case SCROLLER_POLICY_SET: /* 5 */
+ elm_genlist_homogeneous_set(gl, EINA_FALSE); /* Back to default */
+ elm_scroller_policy_set(gl, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON);
+ break;
+
+ case TOOLTIP_TEXT_SET: /* 6 */
+ {
+ elm_genlist_item_tooltip_text_set(elm_genlist_first_item_get(gl), "Tooltip text from API");
+ elm_genlist_item_bring_in(elm_genlist_first_item_get(gl),
+ ELM_GENLIST_ITEM_SCROLLTO_IN);
+ }
+ break;
+
+ case ITEM_CURSOR_SET: /* 7 */
+ elm_genlist_item_cursor_set(elm_genlist_first_item_get(gl), ELM_CURSOR_HAND2);
+ break;
+
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ INF("clicked event on API Button: api_state=<%d>", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+/* Hint:
+ * In this example some calls to elm_genlist_item_append() are used which give the
+ * value of an int as 'item data' and 'func data' after casting into (void*). For
+ * sure this works only on architectures where sizeof(int)==sizeof(void*).
+ * For real world usage you should hold a data structure or value in your
+ * application and then give only a pointer to this data as data pointer.
+ */
+
+typedef struct _Testitem
+{
+ Elm_Object_Item *item;
+ int mode;
+ int onoff;
+ Eina_Bool checked;
+} Testitem;
+
+static char *
+gl_text_get1(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ int num = (int)(uintptr_t)data;
+
+ snprintf(buf, sizeof(buf), "Item # %i", num);
+
+ return strdup(buf);
+}
+
+Evas_Object *gl_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
+{
+ char buf[PATH_MAX];
+ Evas_Object *ic = elm_icon_add(obj);
+ if (!strcmp(part, "elm.swallow.end"))
+ snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
+ else
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return ic;
+}
+
+static void on_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("button clicked\n");
+}
+
+static void on_ck_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("checkbox changed\n");
+}
+
+Evas_Object *gl_content_full_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
+{
+ Evas_Object *fr, *bx, *ic, *bt, *ck;
+
+ if (strcmp(part, "elm.swallow.content") != 0) return NULL;
+
+ fr = elm_frame_add(obj);
+ elm_layout_text_set(fr, NULL, "A Frame");
+
+ bx = elm_box_add(fr);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+
+ ic = elm_icon_add(bx);
+ elm_icon_standard_set(ic, "home");
+ evas_object_size_hint_min_set(ic,
+ ELM_SCALE_SIZE(32),
+ ELM_SCALE_SIZE(32));
+ evas_object_size_hint_align_set(ic, 0.5, EVAS_HINT_FILL);
+ evas_object_show(ic);
+ elm_box_pack_end(bx, ic);
+
+ bt = elm_button_add(bx);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_smart_callback_add(bt, "clicked", on_bt_clicked, NULL);
+ elm_layout_text_set(bt, NULL, "Click Me");
+ evas_object_show(bt);
+ elm_box_pack_end(bx, bt);
+
+ ck = elm_check_add(bx);
+ evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_smart_callback_add(ck, "changed", on_ck_changed, NULL);
+ elm_layout_text_set(ck, NULL, "some checkbox");
+ evas_object_show(ck);
+ elm_box_pack_end(bx, ck);
+
+ elm_layout_content_set(fr, NULL, bx);
+ evas_object_size_hint_min_set(fr,
+ ELM_SCALE_SIZE(100),
+ ELM_SCALE_SIZE(100));
+
+ return fr;
+}
+
+
+Eina_Bool gl_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+Evas_Object *gl_reusable_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part, Evas_Object *old)
+{
+ if (old && !strcmp(part, "elm.swallow.end"))
+ {
+ // Reuse old content
+ // Here need to add initializing and state changing
+ // for cached content.
+ // printf("content reuse for cached content %p, %s\n", old, part);
+ return old;
+ }
+ else
+ {
+ // Create new content object for non-reused part.
+ //printf("content create in reuse %p, %s\n", old, part);
+ char buf[PATH_MAX];
+ Evas_Object *ic = elm_icon_add(obj);
+ if (!strcmp(part, "elm.swallow.end"))
+ snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
+ else
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return ic;
+ }
+
+ // If return NULL value, content_get will be called to get new content.
+ // return NULL;
+}
+
+static void
+gl_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ printf("sel item data [%p] on genlist obj [%p], item pointer [%p], index [%d]\n",
+ data, obj, event_info, elm_genlist_item_index_get(event_info));
+}
+
+static void
+_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Object *gl = data;
+ Evas_Event_Mouse_Move *ev = event_info;
+ int where = 0;
+ Elm_Object_Item *gli;
+ gli = elm_genlist_at_xy_item_get(gl, ev->cur.canvas.x, ev->cur.canvas.y, &where);
+ if (gli)
+ INF("<%s> over %p, where %i\n", __func__, elm_object_item_data_get(gli), where);
+ else
+ INF("<%s> over none, where %i\n", __func__,where);
+}
+
+
+/*** Genlist ***************************************************************/
+static void
+_bt50_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_IN);
+}
+
+static void
+_bt1500_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+}
+
+static void
+_gl_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("selected: %p\n", event_info);
+}
+
+static void
+_gl_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("double clicked: %p\n", event_info);
+}
+
+static void
+_gl_right_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("right clicked: %p\n", event_info);
+}
+
+static void
+_gl_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("longpress %p\n", event_info);
+}
+
+static void
+_gl_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+// printf("changed %p\n", event_info);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = (api_data *)data;
+ if (api->filter_data) free(api->filter_data);
+ free(api);
+}
+
+typedef struct
+{
+ Evas_Object *gl;
+ Elm_Object_Item *it1, *it2;
+ int state;
+} Bounce;
+
+static Eina_Bool
+_bounce_cb(void *data)
+{
+ Bounce *bounce = data;
+ bounce->state++;
+ if (bounce->state & 0x1)
+ elm_genlist_item_bring_in(bounce->it2, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+ else
+ elm_genlist_item_bring_in(bounce->it1, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+ if (bounce->state > bounce_max)
+ {
+ if (getenv("ELM_TEST_AUTOBOUNCE")) elm_exit();
+ }
+ return EINA_TRUE;
+}
+
+static void
+_btbounce_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Ecore_Timer *tim = evas_object_data_get(obj, "timer");
+ if (!tim)
+ {
+ _bounce_cb(data);
+ tim = ecore_timer_add(0.5, _bounce_cb, data);
+ evas_object_data_set(obj, "timer", tim);
+ }
+}
+
+static void
+_btdel_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Bounce *bounce = data;
+ Ecore_Timer *tim = evas_object_data_get(obj, "timer");
+ if (tim)
+ {
+ ecore_timer_del(tim);
+ evas_object_data_del(obj, "timer");
+ }
+ free(bounce);
+}
+
+void
+test_genlist(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt;
+ Evas_Object *over;
+ Elm_Object_Item *gli;
+ int i, max;
+ Bounce *bounce;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("genlist", "Genlist");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ api->box = bx;
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
+ evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
+ evas_object_smart_callback_add(gl, "clicked,right", _gl_right_clicked, NULL);
+ evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
+ evas_object_smart_callback_add(gl, "changed", _gl_changed, NULL);
+ // FIXME: This causes genlist to resize the horiz axis very slowly :(
+ // Reenable this and resize the window horizontally, then try to resize it back
+ //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(gl);
+
+ over = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(over, 0, 0, 0, 0);
+ evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl);
+ evas_object_repeat_events_set(over, EINA_TRUE);
+ evas_object_show(over);
+ evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, over);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get1;
+ api->itc1->func.content_get = NULL; // gl_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+ // use content_reuse function for reusing
+ // repeated content objects instead of content_get
+ api->itc1->func.reusable_content_get = gl_reusable_content_get;
+
+ bt_50 = elm_button_add(win);
+ elm_object_text_set(bt_50, "Go to 50");
+ evas_object_show(bt_50);
+ elm_box_pack_end(bx, bt_50);
+
+ bt_1500 = elm_button_add(win);
+ elm_object_text_set(bt_1500, "Go to 1500");
+ evas_object_show(bt_1500);
+ elm_box_pack_end(bx, bt_1500);
+
+ bounce = calloc(1, sizeof(Bounce));
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Bounce");
+ evas_object_show(bt);
+ elm_box_pack_end(bx, bt);
+ bounce->gl = gl;
+ evas_object_smart_callback_add(bt, "clicked", _btbounce_cb, bounce);
+ evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _btdel_cb, bounce);
+
+ max = 2000;
+ if (getenv("ELM_TEST_AUTOBOUNCE"))
+ {
+ max = 200;
+ bounce_max = atoi(getenv("ELM_TEST_AUTOBOUNCE"));
+ }
+ for (i = 0; i < max; i++)
+ {
+ gli = elm_genlist_item_append(gl, api->itc1,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */,
+ (void *)(uintptr_t)(i * 10)/* func data */);
+
+ if (i == 50)
+ evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli);
+ else if (i == 1500)
+ evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli);
+
+ if (i == 100) bounce->it1 = gli;
+ if (i == 120) bounce->it2 = gli;
+ }
+ elm_genlist_item_class_free(api->itc1);
+
+ evas_object_resize(win, 480, 400);
+ explode_win_enable(win);
+ evas_object_show(win);
+
+ if (max == 200) _btbounce_cb(bounce, bt, NULL);
+}
+
+
+/*** Genlist 2 *************************************************************/
+static void
+my_gl_clear(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_genlist_clear(data);
+}
+
+static char *
+gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
+ return strdup(buf);
+}
+static void
+my_gl_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Evas_Object *gl = api->gl;
+ static int i = 0;
+
+ if (!api->itc1)
+ {
+ ERR("Genlist item class should not be null. Something very bad is happening!!");
+ return;
+ }
+
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get;
+ api->itc1->func.content_get = gl_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */,
+ (void *)(uintptr_t)(i * 10)/* func data */);
+ i++;
+}
+
+static void
+my_gl_insert_before(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Evas_Object *gl = api->gl;
+ static int i = 0;
+ Elm_Object_Item *gli_selected;
+
+ if (!api->itc1)
+ {
+ ERR("Genlist item class should not be null. Something very bad is happening!!");
+ return;
+ }
+
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get;
+ api->itc1->func.content_get = gl_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+
+ gli_selected = elm_genlist_selected_item_get(gl);
+ if (!gli_selected)
+ {
+ printf("no item selected\n");
+ return ;
+ }
+
+ elm_genlist_item_insert_before(gl, api->itc1,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ gli_selected /* item before */,
+ ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */,
+ (void *)(uintptr_t)(i * 10)/* func data */);
+ i++;
+}
+
+static void
+my_gl_insert_after(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Evas_Object *gl = api->gl;
+ static int i = 0;
+ Elm_Object_Item *gli_selected;
+
+ if (!api->itc1)
+ {
+ ERR("Genlist item class should not be null. Something very bad is happening!!");
+ return;
+ }
+
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get;
+ api->itc1->func.content_get = gl_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+
+ gli_selected = elm_genlist_selected_item_get(gl);
+ if (!gli_selected)
+ {
+ printf("no item selected\n");
+ return ;
+ }
+
+ elm_genlist_item_insert_after(gl, api->itc1,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ gli_selected /* item after */,
+ ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */,
+ (void *)(uintptr_t)(i * 10)/* func data */);
+ i++;
+}
+
+static void
+my_gl_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Evas_Object *gl = api->gl;
+ Elm_Object_Item *gli = elm_genlist_selected_item_get(gl);
+ if (!gli)
+ {
+ printf("no item selected\n");
+ return;
+ }
+ elm_object_item_del(gli);
+}
+
+static void
+my_gl_disable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Evas_Object *gl = api->gl;
+ Elm_Object_Item *gli = elm_genlist_selected_item_get(gl);
+ if (!gli)
+ {
+ printf("no item selected\n");
+ return;
+ }
+ elm_object_item_disabled_set(gli, EINA_TRUE);
+ elm_genlist_item_selected_set(gli, EINA_FALSE);
+ elm_genlist_item_update(gli);
+}
+
+static void
+my_gl_update_all(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Evas_Object *gl = api->gl;
+ int i = 0;
+ Elm_Object_Item *it = elm_genlist_first_item_get(gl);
+ while (it)
+ {
+ elm_genlist_item_update(it);
+ INF("%i", i);
+ i++;
+ it = elm_genlist_item_next_get(it);
+ }
+}
+
+static void
+my_gl_first(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Evas_Object *gl = api->gl;
+ Elm_Object_Item *gli = elm_genlist_first_item_get(gl);
+ if (!gli) return;
+ elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN);
+ elm_genlist_item_selected_set(gli, 1);
+}
+
+static void
+my_gl_last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Evas_Object *gl = api->gl;
+ Elm_Object_Item *gli = elm_genlist_last_item_get(gl);
+ if (!gli) return;
+ elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN);
+ elm_genlist_item_selected_set(gli, 1);
+}
+
+static Eina_Bool
+my_gl_flush_delay(void *data EINA_UNUSED)
+{
+ elm_cache_all_flush();
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+my_gl_flush(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ ecore_timer_add(1.2, my_gl_flush_delay, NULL);
+}
+
+static void
+_genlist_del_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ if (!data) return;
+
+ elm_genlist_item_class_free(data);
+}
+
+void
+test_genlist2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *gl, *bx, *bx2, *bx3, *bt;
+ Elm_Object_Item *gli[10];
+ char buf[PATH_MAX];
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_add(NULL, "genlist2", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Genlist 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get;
+ api->itc1->func.content_get = gl_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+
+ gli[0] = elm_genlist_item_append(gl, api->itc1,
+ (void *)1001/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ (void *)1001/* func data */);
+ gli[1] = elm_genlist_item_append(gl, api->itc1,
+ (void *)1002/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ (void *)1002/* func data */);
+ gli[2] = elm_genlist_item_append(gl, api->itc1,
+ (void *)1003/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ (void *)1003/* func data */);
+ gli[3] = elm_genlist_item_prepend(gl, api->itc1,
+ (void *)1004/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ (void *)1004/* func data */);
+ gli[4] = elm_genlist_item_prepend(gl, api->itc1,
+ (void *)1005/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ (void *)1005/* func data */);
+ gli[5] = elm_genlist_item_insert_before(gl, api->itc1,
+ (void *)1006/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */, (void *)1006/* func data */);
+ gli[6] = elm_genlist_item_insert_after(gl, api->itc1,
+ (void *)1007/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */, (void *)1007/* func data */);
+ elm_box_pack_end(bx, gl);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "/\\");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_first, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "\\/");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_last, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "#");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_disable, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "U");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_update_all, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "X");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_clear, gl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "+");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_add, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "-");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_del, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx3 = elm_box_add(win);
+ elm_box_horizontal_set(bx3, EINA_TRUE);
+ elm_box_homogeneous_set(bx3, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "+ before");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx3, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "+ after");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx3, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Flush");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_flush, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx3, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx3);
+ evas_object_show(bx3);
+
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _genlist_del_cb, api->itc1);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+
+/*** Genlist 3 *************************************************************/
+char *
+gl2_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ const Testitem *tit = data;
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
+ return strdup(buf);
+}
+
+Evas_Object *
+gl2_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ const Testitem *tit = data;
+ char buf[PATH_MAX];
+ Evas_Object *ic = elm_icon_add(obj);
+ if (!strcmp(part, "elm.swallow.icon"))
+ {
+ if (!(tit->mode & 0x3))
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ else if ((tit->mode & 0x3) == 1)
+ snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
+ else if ((tit->mode & 0x3) == 2)
+ snprintf(buf, sizeof(buf), "%s/images/panel_01.jpg", elm_app_data_dir_get());
+ else if ((tit->mode & 0x3) == 3)
+ snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ }
+ else if (!strcmp(part, "elm.swallow.end"))
+ {
+ if (!(tit->mode & 0x3))
+ snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ else if ((tit->mode & 0x3) == 1)
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ else if ((tit->mode & 0x3) == 2)
+ snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get());
+ else if ((tit->mode & 0x3) == 3)
+ snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ }
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return ic;
+}
+
+Eina_Bool
+gl2_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+static void
+my_gl_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Testitem *tit = data;
+ tit->mode++;
+ elm_genlist_item_update(tit->item);
+}
+
+static void
+my_gl_labels_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Testitem *tit = data;
+ tit->mode++;
+ elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_TEXT);
+}
+
+static void
+my_gl_contents_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Testitem *tit = data;
+ tit->mode++;
+ elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_CONTENT);
+}
+
+void
+test_genlist3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bx, *bx2, *bt;
+ static Testitem tit[3];
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist3", "Genlist 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(gl);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl2_text_get;
+ api->itc1->func.content_get = gl2_content_get;
+ api->itc1->func.state_get = gl2_state_get;
+ api->itc1->func.del = NULL;
+
+ tit[0].mode = 0;
+ tit[0].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ NULL/* func data */);
+ tit[1].mode = 1;
+ tit[1].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ NULL/* func data */);
+ tit[2].mode = 2;
+ tit[2].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ NULL/* func data */);
+
+ elm_box_pack_end(bx, gl);
+ evas_object_show(bx);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "[1]");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "labels");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_labels_update, &(tit[1]));
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "contents");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_contents_update, &(tit[2]));
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ elm_genlist_item_class_free(api->itc1);
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+
+/*** Genlist 4 *************************************************************/
+static void
+my_gl_item_check_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Testitem *tit = data;
+ tit->onoff = elm_check_state_get(obj);
+ printf("item %p onoff = %i\n", tit, tit->onoff);
+}
+
+char *
+gl3_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ const Testitem *tit = data;
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
+ return strdup(buf);
+}
+
+Evas_Object *
+gl3_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ const Testitem *tit = data;
+ if (!strcmp(part, "elm.swallow.icon"))
+ {
+ Evas_Object *lb;
+
+ lb = elm_label_add(obj);
+ elm_label_line_wrap_set(lb, ELM_WRAP_CHAR);
+ elm_label_wrap_width_set(lb, 201);
+ elm_object_text_set(lb, "ashj ascjscjh n asjkl hcjlh ls hzshnn zjh sh zxjcjsnd h dfw sdv edev efe fwefvv vsd cvs ws wf fvwf wd fwe f we wef we wfe rfwewef wfv wswf wefg sdfws w wsdcfwcf wsc vdv sdsd sdcd cv wsc sdcv wsc d sdcdcsd sdcdsc wdvd sdcsd wscxcv wssvd sd");
+ return lb;
+ }
+ else if (!strcmp(part, "elm.swallow.end"))
+ {
+ Evas_Object *ck;
+ ck = elm_check_add(obj);
+ evas_object_propagate_events_set(ck, EINA_FALSE);
+ elm_check_state_set(ck, tit->onoff);
+ evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed, data);
+ return ck;
+ }
+ return NULL;
+}
+
+Eina_Bool
+gl3_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+static void
+_realized(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei)
+{
+ Evas_Object *check;
+ Eina_List *items;
+ items = NULL;
+
+ if (!ei) return;
+ Elm_Object_Item *item = ei;
+
+ check = elm_object_item_part_content_get(item, "elm.swallow.end");
+
+ if (!check) return;
+
+ items = eina_list_append(items, check);
+ elm_object_item_access_order_set(item, items);
+}
+
+void
+test_genlist4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bx, *bx2, *bt;
+ static Testitem tit[3];
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist4", "Genlist 4");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
+ elm_genlist_multi_select_set(gl, EINA_TRUE);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ evas_object_smart_callback_add(gl, "realized", _realized, NULL);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl3_text_get;
+ api->itc1->func.content_get = gl3_content_get;
+ api->itc1->func.state_get = gl3_state_get;
+ api->itc1->func.del = NULL;
+
+ tit[0].mode = 0;
+ tit[0].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[0])/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ NULL/* func data */);
+ tit[1].mode = 1;
+ tit[1].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[1])/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ NULL/* func data */);
+ tit[2].mode = 2;
+ tit[2].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[2])/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ NULL/* func data */);
+
+ elm_genlist_item_class_free(api->itc1);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(bx);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "[1]");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "[2]");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1]));
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "[3]");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2]));
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+
+/*** Genlist 5 *************************************************************/
+static void
+my_gl_item_check_changed2(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Testitem *tit = data;
+ tit->onoff = elm_check_state_get(obj);
+ printf("item %p onoff = %i\n", tit, tit->onoff);
+}
+
+char *
+gl5_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
+{
+ const Testitem *tit = data;
+ char buf[256] = { 0 };
+ if (!strcmp(part, "elm.text"))
+ {
+ snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
+ }
+ else if (!strcmp(part, "elm.text.sub"))
+ {
+ snprintf(buf, sizeof(buf), "%i bottles on the wall", tit->mode);
+ }
+ return strdup(buf);
+}
+
+Evas_Object *
+gl5_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ const Testitem *tit = data;
+ char buf[PATH_MAX];
+ if (!strcmp(part, "elm.swallow.icon"))
+ {
+ Evas_Object *bx = elm_box_add(obj);
+ Evas_Object *ic;
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ ic = elm_icon_add(obj);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_show(ic);
+ elm_box_pack_end(bx, ic);
+ ic = elm_icon_add(obj);
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_show(ic);
+ elm_box_pack_end(bx, ic);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+ return bx;
+ }
+ else if (!strcmp(part, "elm.swallow.end"))
+ {
+ Evas_Object *ck;
+ ck = elm_check_add(obj);
+ evas_object_propagate_events_set(ck, EINA_FALSE);
+ elm_check_state_set(ck, tit->onoff);
+ evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed2, data);
+ evas_object_show(ck);
+ return ck;
+ }
+ return NULL;
+}
+
+Eina_Bool
+gl5_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+static void
+item_drag_up(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("drag up");
+}
+
+static void
+item_drag_down(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("drag down");
+}
+
+static void
+item_drag_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("drag left");
+}
+
+static void
+item_drag_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("drag right");
+}
+
+static void
+scroll_top(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("Top edge!");
+}
+
+static void
+scroll_bottom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("Bottom edge!");
+}
+
+static void
+scroll_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("Left edge!");
+}
+
+static void
+scroll_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("Right edge!");
+}
+
+static void
+item_drag(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("drag");
+}
+
+static void
+item_drag_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("drag stop");
+}
+
+static void
+item_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ INF("longpress");
+}
+
+void
+test_genlist5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bx, *bx2, *bt;
+ static Testitem tit[3];
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist5", "Genlist 5");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "double_label";
+ api->itc1->func.text_get = gl5_text_get;
+ api->itc1->func.content_get = gl5_content_get;
+ api->itc1->func.state_get = gl5_state_get;
+ api->itc1->func.del = NULL;
+
+ tit[0].mode = 0;
+ tit[0].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[0])/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ NULL/* func data */);
+ tit[1].mode = 1;
+ tit[1].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[1])/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ NULL/* func data */);
+ tit[2].mode = 2;
+ tit[2].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[2])/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
+ NULL/* func data */);
+
+ elm_box_pack_end(bx, gl);
+ evas_object_show(bx);
+
+ evas_object_smart_callback_add(gl, "drag,start,up", item_drag_up, NULL);
+ evas_object_smart_callback_add(gl, "drag,start,down", item_drag_down, NULL);
+ evas_object_smart_callback_add(gl, "drag,start,left", item_drag_left, NULL);
+ evas_object_smart_callback_add(gl, "drag,start,right", item_drag_right, NULL);
+ evas_object_smart_callback_add(gl, "drag", item_drag, NULL);
+ evas_object_smart_callback_add(gl, "drag,stop", item_drag_stop, NULL);
+ evas_object_smart_callback_add(gl, "longpressed", item_longpress, NULL);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "[1]");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "[2]");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1]));
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "[3]");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2]));
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ elm_genlist_item_class_free(api->itc1);
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Tree **********************************************************/
+static void
+gl4_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ int depth = elm_genlist_item_expanded_depth_get(glit);
+ printf("item sel callback %p - expanded depth = %d\n", glit, depth);
+}
+
+static void
+gl4_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ api_data *api = data;
+ Elm_Object_Item *glit = event_info;
+ Evas_Object *gl = elm_object_item_widget_get(glit);
+ int val = (int)(uintptr_t) elm_object_item_data_get(glit);
+ int i = 0;
+
+ printf("expand %p\n", glit);
+ val *= 10;
+ for (i = 0; i < 30; i++)
+ {
+ elm_genlist_item_append(gl, api->itc2,
+ (void *)(uintptr_t) (val + i)/* item data */,
+ glit/* parent */,
+ ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
+ NULL/* func data */);
+ }
+}
+
+static void
+gl4_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ const Eina_List *list = NULL, *l = NULL;
+ Elm_Object_Item *it = NULL;
+
+ printf("contract request %p\n", glit);
+
+ list = elm_genlist_item_subitems_get(glit);
+ EINA_LIST_FOREACH(list, l, it)
+ {
+ printf("sub item: %p %s\n", it, elm_object_item_text_get(it));
+ }
+
+ elm_genlist_item_subitems_clear(glit);
+}
+
+static void
+gl4_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ printf("expand request %p\n", glit);
+ elm_genlist_item_expanded_set(glit, EINA_TRUE);
+}
+
+static void
+gl4_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_expanded_set(glit, EINA_FALSE);
+}
+
+static void
+gl4_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ printf("selected %p\n", glit);
+}
+
+static void
+gl4_activated(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ printf("activated %p\n", glit);
+}
+
+static void
+gl4_unselected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ printf("unselected %p\n", glit);
+}
+
+static void
+gl4_longpressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ printf("longpressed %p\n", glit);
+}
+
+static void
+gl4_pressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ printf("pressed %p\n", glit);
+}
+
+static void
+gl4_released(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ printf("released %p\n", glit);
+}
+
+char *
+gl4_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item mode %i", (int)(uintptr_t)data);
+ return strdup(buf);
+}
+
+Evas_Object *
+gl4_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
+{
+ char buf[PATH_MAX];
+ if (!strcmp(part, "elm.swallow.icon"))
+ {
+ Evas_Object *ic = elm_icon_add(obj);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_show(ic);
+ return ic;
+ }
+ else if (!strcmp(part, "elm.swallow.end"))
+ {
+ Evas_Object *ck;
+ ck = elm_check_add(obj);
+ evas_object_propagate_events_set(ck, EINA_FALSE);
+ evas_object_show(ck);
+ return ck;
+ }
+ return NULL;
+}
+
+Eina_Bool
+gl4_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+void
+gl4_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
+{
+ printf("item deleted.\n");
+}
+
+static void
+_tree_effect_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_genlist_tree_effect_enabled_set(data, elm_check_state_get(obj));
+}
+
+static void
+_tree_homogeneous_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_genlist_homogeneous_set(data, elm_check_state_get(obj));
+}
+
+void
+test_genlist6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bx, *fr, *bx2, *ck1, *ck2;
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-tree", "Genlist Tree");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0);
+ elm_object_text_set(fr, "Genlist Tree Options");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(fr, bx2);
+ evas_object_show(bx2);
+
+ ck1 = elm_check_add(win);
+ elm_object_text_set(ck1, "Tree Effect");
+ evas_object_show(ck1);
+ elm_box_pack_end(bx2, ck1);
+
+ ck2 = elm_check_add(win);
+ elm_object_text_set(ck2, "Homogeneous");
+ evas_object_show(ck2);
+ elm_box_pack_end(bx2, ck2);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->gl = gl;
+ evas_object_show(gl);
+ evas_object_smart_callback_add(gl, "edge,left", scroll_left, NULL);
+ evas_object_smart_callback_add(gl, "edge,right", scroll_right, NULL);
+ evas_object_smart_callback_add(gl, "edge,top", scroll_top, NULL);
+ evas_object_smart_callback_add(gl, "edge,bottom", scroll_bottom, NULL);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl4_text_get;
+ api->itc1->func.content_get = gl4_content_get;
+ api->itc1->func.state_get = gl4_state_get;
+ api->itc1->func.del = gl4_del;
+
+ api->itc2 = elm_genlist_item_class_new();
+ api->itc2->item_style = "tree_effect";
+ api->itc2->func.text_get = gl4_text_get;
+ api->itc2->func.content_get = gl4_content_get;
+ api->itc2->func.state_get = gl4_state_get;
+ api->itc2->func.del = gl4_del;
+
+ elm_genlist_item_append(gl, api->itc2,
+ (void *)1/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_append(gl, api->itc2,
+ (void *)2/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)3/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
+ NULL/* func data */);
+
+ elm_genlist_item_class_free(api->itc1);
+ elm_genlist_item_class_free(api->itc2);
+
+ evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, api);
+ evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, api);
+ evas_object_smart_callback_add(gl, "expanded", gl4_exp, api);
+ evas_object_smart_callback_add(gl, "contracted", gl4_con, api);
+
+ evas_object_smart_callback_add(gl, "selected", gl4_selected, api);
+ evas_object_smart_callback_add(gl, "unselected", gl4_unselected, api);
+ evas_object_smart_callback_add(gl, "activated", gl4_activated, api);
+ evas_object_smart_callback_add(gl, "longpressed", gl4_longpressed, api);
+ evas_object_smart_callback_add(gl, "pressed", gl4_pressed, api);
+ evas_object_smart_callback_add(gl, "released", gl4_released, api);
+
+ evas_object_smart_callback_add(ck1, "changed", _tree_effect_changed_cb, gl);
+ evas_object_smart_callback_add(ck2, "changed", _tree_homogeneous_changed_cb, gl);
+
+ elm_box_pack_end(bx, gl);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+
+/*** Genlist 7 *************************************************************/
+struct genlist7_data
+{
+ Evas_Object *win, *naviframe;
+};
+
+static void
+gl_sel7(void *data, Evas_Object *obj, void *event_info)
+{
+ if (!event_info) return;
+ api_data *api = data;
+ elm_genlist_item_item_class_update(event_info, api->itc2);
+ printf("sel item data [%p] on genlist obj [%p], item pointer [%p], new item style [%s] \n", data, obj, event_info, api->itc2->item_style);
+}
+
+static void
+_gl7_back_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ struct genlist7_data *info = data;
+ if (!info) return;
+
+ elm_naviframe_item_pop(info->naviframe);
+}
+
+static void
+_gl7_swipe_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ struct genlist7_data *info = data;
+ Evas_Object *box, *entry, *button;
+ char item_data[] = "Just a simple test";
+
+ if ((!event_info) || (!data)) return;
+
+ box = elm_box_add(info->win);
+ elm_box_homogeneous_set(box, EINA_FALSE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(box);
+
+ entry = elm_entry_add(info->win);
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_entry_editable_set(entry, EINA_FALSE);
+ elm_object_text_set(entry, item_data);
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(entry);
+
+ button = elm_button_add(info->win);
+ elm_object_text_set(button, "back");
+ evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0);
+ evas_object_smart_callback_add(button, "clicked", _gl7_back_cb,
+ info);
+ evas_object_show(button);
+
+ elm_box_pack_start(box, entry);
+ elm_box_pack_end(box, button);
+
+ elm_naviframe_item_simple_push(info->naviframe, box);
+}
+
+void
+test_genlist7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *naviframe;
+ static struct genlist7_data info;
+ static Testitem tit[3];
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist7", "Genlist 7");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+ info.win = win;
+
+ naviframe = elm_naviframe_add(win);
+ elm_win_resize_object_add(win, naviframe);
+ evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(naviframe);
+ info.naviframe = naviframe;
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_smart_callback_add(gl, "swipe", _gl7_swipe_cb, &info);
+ api->gl = gl;
+ evas_object_show(gl);
+ elm_naviframe_item_simple_push(naviframe, gl);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl2_text_get;
+ api->itc1->func.content_get = gl2_content_get;
+ api->itc1->func.state_get = gl2_state_get;
+ api->itc1->func.del = NULL;
+
+ api->itc2 = elm_genlist_item_class_new();
+ api->itc2->item_style = "double_label";
+ api->itc2->func.text_get = gl5_text_get;
+ api->itc2->func.content_get = gl5_content_get;
+ api->itc2->func.state_get = gl5_state_get;
+ api->itc2->func.del = NULL;
+
+ tit[0].mode = 0;
+ tit[0].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[0])/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
+ api/* func data */);
+ tit[1].mode = 1;
+ tit[1].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[1])/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
+ api/* func data */);
+ tit[2].mode = 2;
+ tit[2].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[2])/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
+ api/* func data */);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Group *********************************************************/
+char *gl8_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Group Index # %i (Item # %i)", (int)((uintptr_t)data / 10), (int)(uintptr_t)data);
+ return strdup(buf);
+}
+
+static void
+_bt_show_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_genlist_item_show(data, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+}
+
+static void
+_bt_bring_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+}
+
+void
+test_genlist8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bt[8], *bx, *bx2, *bx3;
+ Elm_Object_Item *gli = NULL, *git = NULL;
+ int i, bt_num;
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-group", "Genlist Group");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
+ evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
+ evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ // Use homogeneous mode for group index + homogeneous test.
+ // Homogeneous is not mandatory for group index.
+ elm_genlist_homogeneous_set(gl, EINA_TRUE);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get;
+ api->itc1->func.content_get = gl_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+
+ api->itc2 = elm_genlist_item_class_new();
+ api->itc2->item_style = "group_index";
+ api->itc2->func.text_get = gl8_text_get;
+ api->itc2->func.content_get = NULL;
+ api->itc2->func.state_get = NULL;
+ api->itc2->func.del = NULL;
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt_num = 0;
+ bt[bt_num] = elm_button_add(win);
+ elm_object_text_set(bt[bt_num], "Show 0");
+ evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
+ evas_object_show(bt[bt_num]);
+ elm_box_pack_end(bx2, bt[bt_num]);
+
+ bt[++bt_num] = elm_button_add(win);
+ elm_object_text_set(bt[bt_num], "Show 26");
+ evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
+ evas_object_show(bt[bt_num]);
+ elm_box_pack_end(bx2, bt[bt_num]);
+
+ bt[++bt_num] = elm_button_add(win);
+ elm_object_text_set(bt[bt_num], "Show 101");
+ evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
+ evas_object_show(bt[bt_num]);
+ elm_box_pack_end(bx2, bt[bt_num]);
+
+ bt[++bt_num] = elm_button_add(win);
+ elm_object_text_set(bt[bt_num], "Show 480");
+ evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
+ evas_object_show(bt[bt_num]);
+ elm_box_pack_end(bx2, bt[bt_num]);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx3 = elm_box_add(win);
+ elm_box_horizontal_set(bx3, EINA_TRUE);
+ elm_box_homogeneous_set(bx3, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt[++bt_num] = elm_button_add(win);
+ elm_object_text_set(bt[bt_num], "Bring top 0");
+ evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
+ evas_object_show(bt[bt_num]);
+ elm_box_pack_end(bx3, bt[bt_num]);
+
+ bt[++bt_num] = elm_button_add(win);
+ elm_object_text_set(bt[bt_num], "Bring top 31");
+ evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
+ evas_object_show(bt[bt_num]);
+ elm_box_pack_end(bx3, bt[bt_num]);
+
+ bt[++bt_num] = elm_button_add(win);
+ elm_object_text_set(bt[bt_num], "Bring top 239");
+ evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
+ evas_object_show(bt[bt_num]);
+ elm_box_pack_end(bx3, bt[bt_num]);
+
+ bt[++bt_num] = elm_button_add(win);
+ elm_object_text_set(bt[bt_num], "Bring top 477");
+ evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
+ evas_object_show(bt[bt_num]);
+ elm_box_pack_end(bx3, bt[bt_num]);
+
+ elm_box_pack_end(bx, bx3);
+ evas_object_show(bx3);
+
+ for (i = 0; i < 500; i++)
+ {
+ if (!(i % 10))
+ {
+ gli = git = elm_genlist_item_append(gl, api->itc2,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_GROUP,
+ gl_sel/* func */,
+ (void *)(uintptr_t)(i * 10)/* func data */);
+ elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ }
+ else if (git)
+ {
+ gli = elm_genlist_item_append(gl, api->itc1,
+ (void *)(uintptr_t)i/* item data */,
+ git/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */,
+ (void *)(uintptr_t)(i * 10)/* func data */);
+ }
+ switch (i)
+ {
+ case 0:
+ evas_object_smart_callback_add(bt[0], "clicked", _bt_show_cb, gli);
+ evas_object_smart_callback_add(bt[4], "clicked", _bt_bring_cb, gli);
+ break;
+ case 26:
+ evas_object_smart_callback_add(bt[1], "clicked", _bt_show_cb, gli);
+ break;
+ case 31:
+ evas_object_smart_callback_add(bt[5], "clicked", _bt_bring_cb, gli);
+ break;
+ case 101:
+ evas_object_smart_callback_add(bt[2], "clicked", _bt_show_cb, gli);
+ break;
+ case 239:
+ evas_object_smart_callback_add(bt[6], "clicked", _bt_bring_cb, gli);
+ break;
+ case 477:
+ evas_object_smart_callback_add(bt[7], "clicked", _bt_bring_cb, gli);
+ break;
+ case 480:
+ evas_object_smart_callback_add(bt[3], "clicked", _bt_show_cb, gli);
+ break;
+ }
+ }
+
+ elm_genlist_item_class_free(api->itc1);
+ elm_genlist_item_class_free(api->itc2);
+
+ evas_object_resize(win, 480, 800);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Group Tree ****************************************************/
+static void
+gl9_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ api_data *api = data;
+ Elm_Object_Item *glit = event_info;
+ Evas_Object *gl = elm_object_item_widget_get(glit);
+ int val = (int)(uintptr_t) elm_object_item_data_get(glit);
+ val *= 10;
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)(uintptr_t) (val + 1)/* item data */,
+ glit/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)(uintptr_t) (val + 2)/* item data */,
+ glit/* parent */,
+ ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)(uintptr_t) (val + 3)/* item data */,
+ glit/* parent */,
+ ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
+ NULL/* func data */);
+}
+
+static void
+gl9_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_subitems_clear(glit);
+}
+
+static void
+gl9_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_expanded_set(glit, EINA_TRUE);
+}
+
+static void
+gl9_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_expanded_set(glit, EINA_FALSE);
+}
+
+void
+test_genlist9(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bx;
+ Elm_Object_Item *git;
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-group-tree", "Genlist Group Tree");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
+ evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
+ evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get;
+ api->itc1->func.content_get = gl_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+
+ api->itc2 = elm_genlist_item_class_new();
+ api->itc2->item_style = "group_index";
+ api->itc2->func.text_get = gl8_text_get;
+ api->itc2->func.content_get = NULL;
+ api->itc2->func.state_get = NULL;
+ api->itc2->func.del = NULL;
+
+ git = elm_genlist_item_append(gl, api->itc2,
+ (void *)0/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)1/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)2/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)3/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
+ NULL/* func data */);
+ git = elm_genlist_item_append(gl, api->itc2,
+ (void *)4/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)5/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)6/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)7/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
+ NULL/* func data */);
+ elm_genlist_item_class_free(api->itc1);
+ elm_genlist_item_class_free(api->itc2);
+
+ evas_object_smart_callback_add(gl, "expand,request", gl9_exp_req, api);
+ evas_object_smart_callback_add(gl, "contract,request", gl9_con_req, api);
+ evas_object_smart_callback_add(gl, "expanded", gl9_exp, api);
+ evas_object_smart_callback_add(gl, "contracted", gl9_con, api);
+
+ evas_object_resize(win, 480, 800);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Decorate Item Mode ********************************************/
+static char *mode_type[] = { "slide", "rotate" };
+
+char *
+gl10_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
+{
+ char buf[256];
+ if (!strcmp(part, "elm.text.mode"))
+ snprintf(buf, sizeof(buf), "Mode # %i", (int)(uintptr_t)data);
+ else
+ snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
+ return strdup(buf);
+}
+
+Evas_Object *
+gl10_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
+{
+ char buf[PATH_MAX];
+ Evas_Object *ic = elm_icon_add(obj);
+ if (!strcmp(part, "elm.swallow.end"))
+ snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
+ else
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return ic;
+}
+
+static void
+_gl_sel10(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (!data) return;
+ int v = elm_radio_value_get(data);
+ if (v == 1)
+ elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_TRUE);
+}
+
+static void
+_my_gl_mode_right(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ if (!data) return;
+ int v = elm_radio_value_get(data);
+ if (v == 0)
+ elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_TRUE);
+}
+
+static void
+_my_gl_mode_left(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ if (!data) return;
+ int v = elm_radio_value_get(data);
+ if (v == 0)
+ elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_FALSE);
+}
+
+static void
+_my_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ fprintf(stderr, "drag\n");
+ if (!data) return;
+ int v = elm_radio_value_get(data);
+ Elm_Object_Item *glit = elm_genlist_decorated_item_get(obj);
+ if (glit) elm_genlist_item_decorate_mode_set(glit, mode_type[v], EINA_FALSE);
+}
+
+void
+test_genlist10(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fr, *bx, *bx2, *rd, *rdg, *gl;
+ int i;
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-decorate-item-mode", "Genlist Decorate Item Mode");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Decorate Item Mode Type");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx2 = elm_box_add(win);
+ elm_object_content_set(fr, bx2);
+ evas_object_show(bx2);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 0);
+ elm_object_text_set(rd, "Slide : Sweep genlist items to the right.");
+ evas_object_show(rd);
+ elm_box_pack_end(bx2, rd);
+ rdg = rd;
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 1);
+ elm_object_text_set(rd, "Rotate : Click each item.");
+ elm_radio_group_add(rd, rdg);
+ evas_object_show(rd);
+ elm_box_pack_end(bx2, rd);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg);
+ evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg);
+ evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg);
+ evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->decorate_item_style = "mode";
+ api->itc1->func.text_get = gl10_text_get;
+ api->itc1->func.content_get = gl10_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+
+ for (i = 0; i < 50; i++)
+ elm_genlist_item_append(gl,
+ api->itc1,
+ (void *)(uintptr_t)(1000 + i)/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE/* flags */,
+ _gl_sel10/* func */,
+ rdg/* func data */);
+
+ elm_box_pack_end(bx, gl);
+
+ elm_genlist_item_class_free(api->itc1);
+ evas_object_resize(win, 520, 520);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Reorder Mode **************************************************/
+static void
+_reorder_tg_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_genlist_reorder_mode_set(data, elm_check_state_get(obj));
+}
+
+/**
+ * gl_moved is called after an item was reordered.
+ * This is only called when reorder mode is enabled.
+ *
+ * @param obj : the genlist object.
+ * @param event_info : the moved item.
+ *
+ * the item(event_info) had been moved
+ *
+ */
+static void
+_gl_reorder_moved_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("\"moved\" it: %p\n", event_info);
+}
+
+/**
+ * _gl_reorder_moved_after_cb is called after an item was reordered.
+ * This is only called when reorder mode is enabled.
+ *
+ * @param obj : the genlist object.
+ * @param event_info : the moved item.
+ *
+ * the item(event_info) had been moved after the given relative item(*rel_item) in list.
+ *
+ */
+static void
+_gl_reorder_moved_after_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ // if needed, add application logic.
+ Elm_Object_Item *it = elm_genlist_item_prev_get((Elm_Object_Item *)event_info);
+ printf("it = %p, prev_it = %p\n", event_info, it);
+}
+
+/**
+ * _gl_reorder_moved_before_cb is called after an item was reordered.
+ * This is only called when reorder mode is enabled.
+ *
+ * @param obj : the genlist object.
+ * @param event_info : the moved item.
+ *
+ * the item(event_info) had been moved before the given relative item(*rel_item) in list.
+ *
+ */
+static void
+_gl_reorder_moved_before_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ // if needed, add application logic.
+ Elm_Object_Item *it = elm_genlist_item_next_get((Elm_Object_Item *)event_info);
+ printf("it = %p, next_it = %p\n", event_info, it);
+}
+
+static void
+_gl_reorder_item_focused_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("\"item,focused\" it: %p\n", event_info);
+}
+
+static void
+_gl_reorder_item_unfocused_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("\"item,unfocused\" it: %p\n", event_info);
+}
+
+static void
+_gl_reorder_item_selected_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("\"selected\" it: %p\n", event_info);
+}
+
+static void
+_gl_reorder_item_unselected_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("\"unselected\" it: %p\n", event_info);
+}
+
+void
+test_genlist_reorder(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fr, *lb, *bx, *tg, *gl;
+ int i;
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-reorder-mode", "Genlist Reorder Mode");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fr = elm_frame_add(win);
+
+ elm_object_text_set(fr, "Reorder Mode");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "Enable reorder mode if you want to move item.<br/>"
+ "Then long press and drag item.");
+ elm_object_content_set(fr, lb);
+ evas_object_show(lb);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ tg = elm_check_add(win);
+ elm_object_style_set(tg, "toggle");
+ elm_object_text_set(tg, "Reorder Mode:");
+ elm_check_state_set(tg, elm_config_mirrored_get());
+ evas_object_smart_callback_add(tg, "changed", _reorder_tg_changed_cb, gl);
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get;
+ api->itc1->func.content_get = gl_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+ evas_object_smart_callback_add(gl, "moved", _gl_reorder_moved_cb, NULL);
+ evas_object_smart_callback_add(gl, "moved,after", _gl_reorder_moved_after_cb, NULL);
+ evas_object_smart_callback_add(gl, "moved,before", _gl_reorder_moved_before_cb, NULL);
+ evas_object_smart_callback_add(gl, "item,focused", _gl_reorder_item_focused_cb, NULL);
+ evas_object_smart_callback_add(gl, "item,unfocused", _gl_reorder_item_unfocused_cb, NULL);
+ evas_object_smart_callback_add(gl, "selected", _gl_reorder_item_selected_cb, NULL);
+ evas_object_smart_callback_add(gl, "unselected", _gl_reorder_item_unselected_cb, NULL);
+
+ for (i = 0; i < 50; i++)
+ elm_genlist_item_append(gl,
+ api->itc1,
+ (void *)(uintptr_t)(1 + i)/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE/* flags */,
+ NULL/* func */,
+ NULL/* func data */);
+
+ elm_genlist_item_class_free(api->itc1);
+
+ elm_box_pack_end(bx, gl);
+
+ evas_object_resize(win, 400, 500);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Textblock *****************************************************/
+char *gl12_text_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ return strdup("Enlightenment is not just a window manager for Linux/X11 and others, but also a whole suite of libraries to help you create beautiful user interfaces with much less work than doing it the old fashioned way and fighting with traditional toolkits, not to mention a traditional window manager. It covers uses from small mobile devices like phones all the way to powerful multi-core desktops (which are the primary development environment).");
+}
+
+void
+test_genlist12(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *gl;
+ int i;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("genlist-textblock", "Genlist Textblock");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "message";
+ api->itc1->func.text_get = gl12_text_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+
+ for (i = 0; i < 1000; i++)
+ {
+ elm_genlist_item_append(gl, api->itc1,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */,
+ (void *)(uintptr_t)(i * 10)/* func data */);
+ }
+ elm_genlist_item_class_free(api->itc1);
+
+ evas_object_resize(win, 400, 500);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Tree, Insert Sorted *******************************************/
+static int
+gl13_cmp(const void *pa, const void *pb)
+{
+ const Elm_Object_Item *ia = pa, *ib = pb;
+ int a = (int)(uintptr_t) elm_object_item_data_get(ia);
+ int b = (int)(uintptr_t) elm_object_item_data_get(ib);
+ return a - b;
+}
+
+void
+test_genlist13(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *pi[6];
+ Evas_Object *win, *bx, *gl; int i, base, idx[3] = {1, 10, 15};
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-tree-insert-sorted", "Genlist Tree, Insert Sorted");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(gl);
+
+ api->itc2 = elm_genlist_item_class_new();
+ api->itc2->item_style = "default";
+ api->itc2->func.text_get = gl4_text_get;
+ api->itc2->func.content_get = NULL;
+ api->itc2->func.state_get = NULL;
+ api->itc2->func.del = NULL;
+
+ /* mixed order to test insert sorted */
+
+ for (i = 0; i < 3; i++)
+ {
+ pi[i] = elm_genlist_item_sorted_insert
+ (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_TREE, gl13_cmp/* cmp */,
+ NULL/* func */, NULL/* func data */);
+ }
+
+ for (i = 0, base = 100; i < 3; i++, base += 100)
+ {
+ int j;
+ for (j = 0; j < 3; j++)
+ {
+ elm_genlist_item_sorted_insert
+ (gl, api->itc2, (void *)(uintptr_t)(idx[j] + base)/* item data */,
+ pi[i]/* parent */, ELM_GENLIST_ITEM_NONE,
+ gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */);
+ }
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ pi[i + 3] = elm_genlist_item_sorted_insert
+ (gl, api->itc2, (void *)(uintptr_t)(idx[i] * 2)/* item data */, NULL/* parent */,
+ ELM_GENLIST_ITEM_TREE, gl13_cmp/* cmp */, NULL/* func */,
+ NULL/* func data */);
+ }
+
+
+ for (i = 0, base = 10000; i < 3; i++, base += 10000)
+ {
+ int j;
+ for (j = 0; j < 3; j++)
+ {
+ elm_genlist_item_sorted_insert
+ (gl, api->itc2, (void *)(uintptr_t)(idx[j] + base)/* item data */,
+ pi[i + 3]/* parent */, ELM_GENLIST_ITEM_NONE,
+ gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */);
+ }
+ }
+ elm_genlist_item_class_free(api->itc2);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(bx);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Tree, Insert Relative *****************************************/
+static void
+my_gl_insert_before_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Evas_Object *gl = api->gl;
+ static int i = 1000;
+ Elm_Object_Item *gli_selected;
+
+ if (!api->itc1) api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get;
+ api->itc1->func.content_get = NULL;
+ api->itc1->func.state_get = NULL;
+ api->itc1->func.del = NULL;
+
+ gli_selected = elm_genlist_selected_item_get(gl);
+ if (!gli_selected)
+ {
+ printf("no item selected\n");
+ return;
+ }
+
+ elm_genlist_item_insert_before(gl, api->itc1,
+ (void *)(uintptr_t)i/* item data */,
+ elm_genlist_item_parent_get(gli_selected),
+ gli_selected/* item before */,
+ ELM_GENLIST_ITEM_NONE,
+ NULL/* func */, NULL/* func data */);
+ i++;
+}
+
+static void
+my_gl_insert_after_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Evas_Object *gl = api->gl;
+ static int i = 0;
+ Elm_Object_Item *gli_selected;
+
+ if (!api->itc1) api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get;
+ api->itc1->func.content_get = NULL;
+ api->itc1->func.state_get = NULL;
+ api->itc1->func.del = NULL;
+
+ gli_selected = elm_genlist_selected_item_get(gl);
+ if (!gli_selected)
+ {
+ printf("no item selected\n");
+ return;
+ }
+
+ elm_genlist_item_insert_after(gl, api->itc1,
+ (void *)(uintptr_t)i/* item data */,
+ elm_genlist_item_parent_get(gli_selected),
+ gli_selected/* item after */,
+ ELM_GENLIST_ITEM_NONE,
+ NULL/* func */, NULL/* func data */);
+ i++;
+}
+
+void
+test_genlist14(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *pi[6];
+ Evas_Object *win, *bx, *bx2, *bt, *gl;
+ int i, base;
+ /* index: 0, 1, 2, 3, 4, 5
+ * items: 1, 15, 11, 2, 33, 21
+ * final: 1, 2, 11, 15, 21, 33
+ */
+ const int idx[6] = {1, 15, 11, 2, 33, 21};
+ const int relative[6] = {
+ 0, /* item '1' - not used */
+ 0, /* item '15' - insert after pi[0], item '1' */
+ -1, /* item '11' - insert before pi[1], item '15' */
+ -2, /* item '2' - insert before pi[2], item '11' */
+ 1, /* item '33' - insert after pi[1], item '15' */
+ -4 /* item '21' - insert before pi[4], item '33' */
+ };
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-tree-insert-relative", "Genlist Tree, Insert Relative");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ api->itc2 = elm_genlist_item_class_new();
+ api->itc2->item_style = "default";
+ api->itc2->func.text_get = gl4_text_get;
+ api->itc2->func.content_get = NULL;
+ api->itc2->func.state_get = NULL;
+ api->itc2->func.del = NULL;
+
+ /* mixed order to test insert sorted */
+
+ // BUG1: should be able to insert before=NULL, prepend
+ // BUG2: should be able to insert after=NULL, append
+
+ pi[0] = elm_genlist_item_append
+ (gl, api->itc2, (void *)(uintptr_t)idx[0]/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+
+ for (i = 1; i < 3; i++)
+ {
+ if (relative[i] < 0)
+ pi[i] = elm_genlist_item_insert_before
+ (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */,
+ NULL/* parent */, pi[-relative[i]],
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+ else
+ pi[i] = elm_genlist_item_insert_after
+ (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */,
+ NULL/* parent */, pi[relative[i]],
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ Elm_Object_Item *sub_glit[6];
+ int j;
+
+ base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]);
+
+ sub_glit[0] = elm_genlist_item_append
+ (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */,
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+
+ for (j = 1; j < 6; j++) {
+ if (relative[j] < 0)
+ sub_glit[j] = elm_genlist_item_insert_before
+ (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
+ pi[i]/* parent */, sub_glit[-relative[j]],
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+ else
+ sub_glit[j] = elm_genlist_item_insert_after
+ (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
+ pi[i]/* parent */, sub_glit[relative[j]],
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+ }
+ }
+
+ for (i = 3; i < 6; i++)
+ {
+ if (relative[i] < 0)
+ pi[i] = elm_genlist_item_insert_before
+ (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */,
+ NULL/* parent */, pi[-relative[i]],
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+ else
+ pi[i] = elm_genlist_item_insert_after
+ (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */,
+ NULL/* parent */, pi[relative[i]],
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+ }
+
+ for (i = 3; i < 6; i++)
+ {
+ Elm_Object_Item *sub_glit[6];
+ int j;
+
+ base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]);
+
+ sub_glit[0] = elm_genlist_item_append
+ (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */,
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+
+ for (j = 1; j < 6; j++) {
+ if (relative[j] < 0)
+ sub_glit[j] = elm_genlist_item_insert_before
+ (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
+ pi[i]/* parent */, sub_glit[-relative[j]],
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+ else
+ sub_glit[j] = elm_genlist_item_insert_after
+ (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
+ pi[i]/* parent */, sub_glit[relative[j]],
+ ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
+ }
+ }
+
+ elm_box_pack_end(bx, gl);
+ evas_object_show(bx);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "+ before");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before_rel, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "+ after");
+ evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after_rel, api);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ /* item_class_ref is needed for itc2. some items can be added in callbacks */
+ elm_genlist_item_class_ref(api->itc2);
+ elm_genlist_item_class_free(api->itc2);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Decorate All Mode *********************************************/
+static void
+_edit_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *item = (Elm_Object_Item *)data;
+ elm_object_item_del(item);
+}
+
+char *
+gl15_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ const Testitem *tit = data;
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item #%i", tit->mode);
+ return strdup(buf);
+}
+
+Evas_Object *
+gl15_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ Testitem *tit = data;
+ char buf[PATH_MAX];
+
+ // "edit" EDC layout is like below. each part is swallow part.
+ // the existing item is swllowed to elm.swallow.edit.content part.
+ // --------------------------------------------------------------------
+ // | elm.edit.icon.1 | elm.swallow.decorate.content | elm.edit.icon,2 |
+ // --------------------------------------------------------------------
+
+ if (!strcmp(part, "elm.swallow.end"))
+ {
+ Evas_Object *ic = elm_icon_add(obj);
+ snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return ic;
+ }
+ else if (!strcmp(part, "elm.edit.icon.1"))
+ {
+ Evas_Object *ck;
+ ck = elm_check_add(obj);
+ elm_check_state_pointer_set(ck, &tit->checked);
+ evas_object_propagate_events_set(ck, EINA_FALSE);
+ evas_object_show(ck);
+ return ck;
+ }
+ else if (!strcmp(part, "elm.edit.icon.2"))
+ {
+ Evas_Object *icn = elm_icon_add(obj);
+ snprintf(buf, sizeof(buf), "%s/images/icon_06.png", elm_app_data_dir_get());
+ elm_image_file_set(icn, buf, NULL);
+ evas_object_propagate_events_set(icn, EINA_FALSE);
+ evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_smart_callback_add(icn, "clicked", _edit_icon_clicked_cb, (void *)tit->item);
+ return icn;
+ }
+ else return NULL;
+}
+
+static void
+gl15_sel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Testitem *tit = data;
+ if (elm_genlist_decorate_mode_get(obj))
+ {
+ if (!tit->checked) tit->checked = EINA_TRUE;
+ else tit->checked = EINA_FALSE;
+ }
+ elm_genlist_item_update(tit->item);
+}
+
+static void
+gl15_deco_all_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_genlist_decorate_mode_set(data, EINA_TRUE);
+ elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS);
+}
+
+static void
+gl15_normal_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_genlist_decorate_mode_set(data, EINA_FALSE);
+ elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_DEFAULT);
+}
+
+void
+gl15_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
+{
+ Testitem *ti = data;
+ printf("item deleted. (# %d)\n", ti->mode);
+}
+
+void
+test_genlist15(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *bt, *gl;
+ int i;
+ static Testitem tit[100];
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-decorate-all-mode", "Genlist Decorate All Mode");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl15_text_get;
+ api->itc1->func.content_get = gl15_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = gl15_del;
+ api->itc1->decorate_all_item_style = "edit";
+
+ for (i = 0; i < 100; i++)
+ {
+ tit[i].mode = i;
+ tit[i].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[i])/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE/* flags */,
+ gl15_sel/* func */,
+ (void *)(uintptr_t)&(tit[i])/* func data */);
+ }
+ elm_genlist_item_class_free(api->itc1);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(bx);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Decorate All mode");
+ evas_object_smart_callback_add(bt, "clicked", gl15_deco_all_mode, gl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Normal mode");
+ evas_object_smart_callback_add(bt, "clicked", gl15_normal_mode,gl);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 520, 520);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Flip Mode *****************************************************/
+static void
+_flip_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ const Testitem *tit = data;
+
+ if (elm_genlist_item_flip_get(tit->item))
+ elm_genlist_item_flip_set(tit->item, EINA_FALSE);
+ else
+ elm_genlist_item_flip_set(tit->item, EINA_TRUE);
+}
+
+char *
+gl16_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ const Testitem *tit = data;
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item #%i", tit->mode);
+ return strdup(buf);
+}
+
+Evas_Object *
+gl16_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ Testitem *tit = data;
+ char buf[PATH_MAX];
+
+ if (!strcmp(part, "elm.text.flip"))
+ {
+ Evas_Object *btn = elm_button_add(obj);
+ elm_object_text_set(btn, "flipped content placement");
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(btn, "clicked", _flip_icon_clicked_cb, (void *)tit);
+ evas_object_show(btn);
+ return btn;
+ }
+ else if (!strcmp(part, "elm.edit.icon.1"))
+ {
+ Evas_Object *icn = elm_icon_add(obj);
+ snprintf(buf, sizeof(buf), "%s/images/icon_04.png", elm_app_data_dir_get());
+ elm_image_file_set(icn, buf, NULL);
+ evas_object_propagate_events_set(icn, EINA_FALSE);
+ evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return icn;
+ }
+ else if (!strcmp(part, "elm.edit.icon.2"))
+ {
+ Evas_Object *icn = elm_icon_add(obj);
+ snprintf(buf, sizeof(buf), "%s/images/icon_09.png", elm_app_data_dir_get());
+ elm_image_file_set(icn, buf, NULL);
+ evas_object_propagate_events_set(icn, EINA_FALSE);
+ evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_smart_callback_add(icn, "clicked", _flip_icon_clicked_cb, (void *)tit);
+ return icn;
+ }
+ else return NULL;
+}
+
+void
+test_genlist16(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *gl;
+ int i;
+ static Testitem tit[100];
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-flip-mode", "Genlist Flip Mode");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ /* note: flip mode can be used with/without edit mode */
+ elm_genlist_decorate_mode_set(gl, EINA_TRUE);
+ elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl16_text_get;
+ api->itc1->func.content_get = gl16_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+ api->itc1->decorate_all_item_style = "edit";
+
+ for (i = 0; i < 100; i++)
+ {
+ tit[i].mode = i;
+ tit[i].item = elm_genlist_item_append(gl, api->itc1,
+ &(tit[i])/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE/* flags */,
+ gl_sel/* func */,
+ (void *)(uintptr_t)&(tit[i])/* func data */);
+ }
+ elm_genlist_item_class_free(api->itc1);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(bx);
+
+ evas_object_resize(win, 520, 520);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Decorate Modes ************************************************/
+char *
+gl17_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
+{
+ const Testitem *tit = data;
+ char buf[256];
+ if (!strcmp(part, "elm.text.mode"))
+ snprintf(buf, sizeof(buf), "Mode # %i", tit->mode);
+ else
+ snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
+ return strdup(buf);
+}
+
+Evas_Object *
+_decorate_item_mode_frame_new(Evas_Object *win, Evas_Object **rdg)
+{
+ Evas_Object *fr, *bx, *rd;
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Decorate Item Mode Type");
+ evas_object_show(fr);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 0);
+ elm_object_text_set(rd, "Slide : Sweep genlist items to the right.");
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+ *rdg = rd;
+
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, 1);
+ elm_object_text_set(rd, "Rotate : Click each item.");
+ elm_radio_group_add(rd, *rdg);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+ return fr;
+}
+
+void
+_decorate_all_set_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (!data) return;
+
+ Evas_Object *gl;
+ gl = evas_object_data_get(obj, "gl");
+ if (!gl) return;
+
+ if (evas_object_data_get(gl, "tree_effect"))
+ elm_genlist_tree_effect_enabled_set(gl, EINA_FALSE);
+ elm_genlist_decorate_mode_set(gl, EINA_TRUE);
+}
+
+void
+_decorate_all_unset_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (evas_object_data_get(data, "tree_effect"))
+ elm_genlist_tree_effect_enabled_set(data, EINA_TRUE);
+ elm_genlist_decorate_mode_set(data, EINA_FALSE);
+}
+
+Evas_Object *
+_decorate_all_mode_frame_new(Evas_Object *win, Evas_Object *rdg, Evas_Object *gl)
+{
+ Evas_Object *fr, *bx, *btn;
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Decorate All Mode Type");
+ evas_object_show(fr);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ btn = elm_button_add(win);
+ evas_object_data_set(btn, "gl", gl);
+ elm_object_text_set(btn, "Set Decorate All Mode");
+ evas_object_smart_callback_add(btn, "clicked", _decorate_all_set_btn_clicked_cb, rdg);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "Unset Decorate All Mode");
+ evas_object_smart_callback_add(btn, "clicked", _decorate_all_unset_btn_clicked_cb, gl);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ return fr;
+}
+
+void
+test_genlist17(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fr1, *fr2, *bx, *bx2, *rdg = NULL, *gl;
+ int i;
+ static Testitem tit[50];
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-decorate-modes", "Genlist Decorate Modes");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bx2 = elm_box_add(win);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ fr1 = _decorate_item_mode_frame_new(win, &rdg);
+ elm_box_pack_end(bx2, fr1);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg);
+ evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg);
+ evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg);
+ evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->decorate_item_style = "mode";
+ api->itc1->func.text_get = gl15_text_get;
+ api->itc1->func.content_get = gl15_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+ api->itc1->decorate_all_item_style = "edit";
+
+ for (i = 0; i < 50; i++)
+ {
+ tit[i].checked = EINA_FALSE;
+ tit[i].mode = i;
+ tit[i].item = elm_genlist_item_append(gl,
+ api->itc1,
+ &(tit[i])/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE/* flags */,
+ NULL/* select func */,
+ NULL/* func data */);
+ }
+
+ elm_genlist_item_class_free(api->itc1);
+ elm_box_pack_end(bx, gl);
+
+ fr2 = _decorate_all_mode_frame_new(win, rdg, gl);
+ elm_box_pack_end(bx2, fr2);
+
+ evas_object_resize(win, 520, 520);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Tree and Decorate All Mode ************************************/
+static void
+_tree_effect_enable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_genlist_tree_effect_enabled_set(data, EINA_TRUE);
+}
+
+static void
+_tree_effect_disable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_genlist_tree_effect_enabled_set(data, EINA_FALSE);
+}
+
+Evas_Object *
+_tree_effect_frame_new(Evas_Object *win, Evas_Object **rdg, Evas_Object *gl)
+{
+ Evas_Object *fr, *bx, *rd;
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Genlist Tree Effect");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(fr);
+
+ bx = elm_box_add(win);
+ elm_box_homogeneous_set(bx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, 0);
+ elm_object_text_set(rd, "Enable");
+ evas_object_smart_callback_add(rd, "changed", _tree_effect_enable_cb, gl);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+ *rdg = rd;
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, 1);
+ elm_radio_group_add(rd, *rdg);
+ elm_object_text_set(rd, "Disable");
+ evas_object_smart_callback_add(rd, "changed", _tree_effect_disable_cb, gl);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+
+ return fr;
+}
+
+static void
+gl18_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ int depth = elm_genlist_item_expanded_depth_get(glit);
+ printf("expanded depth for selected item is %d\n", depth);
+}
+
+static void
+gl18_del(void *data, Evas_Object *obj EINA_UNUSED)
+{
+ free(data);
+}
+
+static void
+gl18_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ api_data *api = data;
+ Elm_Object_Item *glit = event_info;
+ Evas_Object *gl = elm_object_item_widget_get(glit);
+ Testitem *tit = elm_object_item_data_get(glit);
+ int i, j, val;
+
+ val = tit->mode * 10;
+ for (i = 0; i < 100; i++)
+ {
+ tit = calloc(1, sizeof(Testitem));
+ tit->mode = val + i;
+ tit->item = elm_genlist_item_append(gl,
+ api->itc2,
+ tit/* item data */,
+ glit/* parent */,
+ ELM_GENLIST_ITEM_TREE,
+ gl18_sel/* func */,
+ NULL/* func data */);
+ }
+ for (j = 0; j < 3; j++)
+ {
+ tit = calloc(1, sizeof(Testitem));
+ tit->mode = i;
+ tit->item = elm_genlist_item_append(gl,
+ api->itc1,
+ tit/* item data */,
+ glit/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ gl18_sel/* func */,
+ NULL/* func data */);
+ i++;
+ }
+}
+
+static void
+gl18_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_subitems_clear(glit);
+}
+
+static void
+gl18_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_expanded_set(glit, EINA_TRUE);
+}
+
+static void
+gl18_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_expanded_set(glit, EINA_FALSE);
+}
+
+void
+test_genlist18(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bx, *fr1, *fr2, *bx2, *rdg;
+ Testitem *tit = NULL;
+ int i, j;
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-tree-decorate-all",
+ "Genlist Tree and Decorate All Mode");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bx2 = elm_box_add(win);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ elm_genlist_tree_effect_enabled_set(gl, EINA_TRUE);
+ evas_object_data_set(gl, "tree_effect", "true");
+
+ /* normal item */
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "tree_effect"; /* item/tree_effect */
+ api->itc1->func.text_get = gl15_text_get;
+ api->itc1->func.content_get = gl15_content_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = gl18_del;
+ api->itc1->decorate_all_item_style = "edit";
+
+ /* expandable item */
+ api->itc2 = elm_genlist_item_class_new();
+ api->itc2->item_style = "tree_effect"; /* tree/tree_effect */
+ api->itc2->func.text_get = gl15_text_get;
+ api->itc2->func.content_get = gl15_content_get;
+ api->itc2->func.state_get = gl_state_get;
+ api->itc2->func.del = gl18_del;
+ api->itc2->decorate_all_item_style = "edit";
+
+ for (i = 0; i < 5; i++)
+ {
+ tit = calloc(1, sizeof(Testitem));
+ tit->mode = i;
+ tit->item = elm_genlist_item_append(gl,
+ api->itc2,
+ tit/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_TREE,
+ gl18_sel/* func */,
+ NULL/* func data */);
+ }
+
+ for (j = 0; j < 3; j++)
+ {
+ tit = calloc(1, sizeof(Testitem));
+ tit->mode = i;
+ tit->item = elm_genlist_item_append(gl,
+ api->itc1,
+ tit/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ gl18_sel/* func */,
+ NULL/* func data */);
+ i++;
+ }
+
+ elm_genlist_item_class_free(api->itc1);
+ elm_genlist_item_class_free(api->itc2);
+
+ evas_object_smart_callback_add(gl, "expand,request", gl18_exp_req, api);
+ evas_object_smart_callback_add(gl, "contract,request", gl18_con_req, api);
+ evas_object_smart_callback_add(gl, "expanded", gl18_exp, api);
+ evas_object_smart_callback_add(gl, "contracted", gl18_con, api);
+
+ elm_box_pack_end(bx, gl);
+
+ fr1 = _tree_effect_frame_new(win, &rdg, gl);
+ elm_box_pack_end(bx2, fr1);
+
+ fr2 = _decorate_all_mode_frame_new(win, rdg, gl);
+ elm_box_pack_end(bx2, fr2);
+
+ evas_object_resize(win, 400, 800);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Full Widget ***************************************************/
+void
+test_genlist19(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt;
+ Evas_Object *over;
+ Elm_Object_Item *gli;
+ int i;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("genlist-full", "Genlist Full Widget");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bxx);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ api->box = bx;
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
+ evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
+ evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
+ // FIXME: This causes genlist to resize the horiz axis very slowly :(
+ // Reenable this and resize the window horizontally, then try to resize it back
+ //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ api->gl = gl;
+ evas_object_show(gl);
+
+ over = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(over, 0, 0, 0, 0);
+ evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl);
+ evas_object_repeat_events_set(over, EINA_TRUE);
+ evas_object_show(over);
+ evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, over);
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "full";
+ api->itc1->func.text_get = NULL;
+ api->itc1->func.content_get = gl_content_full_get;
+ api->itc1->func.state_get = gl_state_get;
+ api->itc1->func.del = NULL;
+
+ bt_50 = elm_button_add(win);
+ elm_object_text_set(bt_50, "Go to 50");
+ evas_object_show(bt_50);
+ elm_box_pack_end(bx, bt_50);
+
+ bt_1500 = elm_button_add(win);
+ elm_object_text_set(bt_1500, "Go to 1500");
+ evas_object_show(bt_1500);
+ elm_box_pack_end(bx, bt_1500);
+
+ for (i = 0; i < 2000; i++)
+ {
+ gli = elm_genlist_item_append(gl, api->itc1,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */,
+ (void *)(uintptr_t)(i * 10)/* func data */);
+ if (i == 50)
+ evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli);
+ else if (i == 1500)
+ evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli);
+ }
+ elm_genlist_item_class_free(api->itc1);
+
+ evas_object_resize(win, 480, 800);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Item Styles ***************************************************/
+const char *_genlist_styles[] = {
+ "default", "full", "one_icon", "end_icon", "no_icon",
+ "default_style", "double_label", "icon_top_text_bottom",
+ "message", "media", "media-album", "media-preview",
+ NULL
+};
+
+static void
+_genlist_renew(Evas_Object *obj, const char *style)
+{
+ Elm_Genlist_Item_Class *ic;
+ Evas_Object *check;
+ int i;
+
+ if (!obj) return;
+
+ elm_genlist_clear(obj);
+
+ check = evas_object_data_get(obj, "check");
+ if (elm_check_state_get(check))
+ elm_genlist_mode_set(obj, ELM_LIST_COMPRESS);
+ else
+ elm_genlist_mode_set(obj, ELM_LIST_SCROLL);
+
+ ic = elm_genlist_item_class_new();
+ ic->item_style = style;
+ ic->func.text_get = gl_text_get;
+ ic->func.content_get = gl_content_get;
+ ic->func.state_get = NULL;
+ ic->func.del = NULL;
+
+ for (i = 0; i < 50; i++)
+ {
+ elm_genlist_item_append(obj, ic, (void *)(uintptr_t)i, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ }
+ elm_genlist_item_class_free(ic);
+}
+
+static void
+_item_style_sel_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *gl = evas_object_data_get(obj, "genlist");
+ if (gl)
+ _genlist_renew(gl, elm_object_item_text_get(event_info));
+}
+
+static Evas_Object *
+_item_styles_list_create(Evas_Object *parent)
+{
+ Evas_Object *list;
+ int i = 0;
+
+ list = elm_list_add(parent);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ while (_genlist_styles[i])
+ {
+ elm_list_item_append(list, _genlist_styles[i], NULL, NULL,
+ _item_style_sel_cb, _genlist_styles[i]);
+ i++;
+ }
+
+ return list;
+}
+
+void
+test_genlist_item_styles(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *gl, *list, *table, *check;
+
+ win = elm_win_util_standard_add("genlist-item-styles", "Genlist Item Styles");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ list = _item_styles_list_create(box);
+ evas_object_show(list);
+
+ table = _elm_min_set(list, box, 200, 0);
+ evas_object_size_hint_weight_set(table, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, table);
+ evas_object_show(table);
+
+ gl = elm_genlist_add(box);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, gl);
+ evas_object_show(gl);
+
+ check = elm_check_add(win);
+ elm_object_text_set(check, "Compress");
+ elm_box_pack_end(box, check);
+ evas_object_show(check);
+ evas_object_data_set(gl, "check", check);
+ _genlist_renew(gl, "default");
+
+ evas_object_data_set(list, "genlist", gl);
+
+ evas_object_resize(win, 600, 600);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Multi Select **************************************************/
+typedef struct _Genlist_Multi_Data Genlist_Multi_Data;
+struct _Genlist_Multi_Data
+{
+ Evas_Object *gl;
+ Evas_Object *rd1;
+ Evas_Object *rd2;
+};
+
+static void
+_multi_select_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool multi = elm_check_state_get(obj);
+ Genlist_Multi_Data *gd = data;
+ if (!gd) return;
+
+ elm_genlist_multi_select_set(gd->gl, multi);
+ elm_object_disabled_set(gd->rd1, !multi);
+ elm_object_disabled_set(gd->rd2, !multi);
+}
+
+static void
+_multi_select_mode_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_genlist_multi_select_mode_set(data, elm_radio_value_get(obj));
+}
+
+static void
+_multi_select_frame_create(Evas_Object *bx, Genlist_Multi_Data *gd)
+{
+ Evas_Object *fr, *bx2, *bx3, *tg, *rd, *rdg;
+ if (!gd) return;
+
+ fr = elm_frame_add(bx);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(fr, "Multi Select Option");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx2 = elm_box_add(fr);
+ elm_object_content_set(fr, bx2);
+ evas_object_show(bx2);
+
+ tg = elm_check_add(bx2);
+ elm_object_style_set(tg, "toggle");
+ elm_object_text_set(tg, "Multi Select Mode");
+ elm_box_pack_end(bx2, tg);
+ evas_object_show(tg);
+
+ bx3 = elm_box_add(bx2);
+ elm_box_horizontal_set(bx3, EINA_TRUE);
+ elm_box_pack_end(bx2, bx3);
+ evas_object_show(bx3);
+
+ gd->rd1 = rdg = rd = elm_radio_add(bx3);
+ elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT);
+ elm_object_text_set(rd, "Default Mode");
+ elm_box_pack_end(bx3, rd);
+ evas_object_show(rd);
+ elm_object_disabled_set(rd, EINA_TRUE);
+ evas_object_smart_callback_add(rd, "changed",
+ _multi_select_mode_changed_cb, gd->gl);
+
+ gd->rd2 = rd = elm_radio_add(bx3);
+ elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "With Control Mode");
+ elm_box_pack_end(bx3, rd);
+ evas_object_show(rd);
+ elm_object_disabled_set(rd, EINA_TRUE);
+ evas_object_smart_callback_add(rd, "changed",
+ _multi_select_mode_changed_cb, gd->gl);
+
+ evas_object_smart_callback_add(tg, "changed",
+ _multi_select_changed_cb, gd);
+}
+
+static void
+_multi_data_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_genlist_multi_select(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bx;
+ Genlist_Multi_Data *gd = calloc(1, sizeof(Genlist_Multi_Data));
+ Elm_Genlist_Item_Class *itc = NULL;
+ int i = 0;
+
+ win = elm_win_util_standard_add("genlist-multi-select", "Genlist Multi Select");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _multi_data_free_cb, gd);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gd->gl = gl = elm_genlist_add(bx);
+ _multi_select_frame_create(bx, gd);
+
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(gl);
+
+ itc = elm_genlist_item_class_new();
+ itc->item_style = "default";
+ itc->func.text_get = gl_text_get;
+ itc->func.content_get = gl_content_get;
+ itc->func.state_get = gl_state_get;
+ itc->func.del = NULL;
+
+ for (i = 0; i < 100; i++)
+ {
+ elm_genlist_item_append(gl, itc,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ gl_sel/* func */,
+ (void *)(uintptr_t)(i * 10)/* func data */);
+ }
+ elm_genlist_item_class_free(itc);
+
+ evas_object_resize(win, 320, 500);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Item Search By Text *******************************************/
+typedef struct _gl20_Event_Data gl20_Event_Data;
+struct _gl20_Event_Data
+{
+ Evas_Object *gl_obj;
+ Evas_Object *tg_obj;
+ Evas_Object *en_obj;
+ Elm_Object_Item *last_item_found;
+};
+
+static const char *_gl20_items_text[] = {
+ "Albany", "Annapolis",
+ "Atlanta", "Augusta",
+ "Austin", "Baton Rouge",
+ "Bismarck", "Boise",
+ "Boston", "Carson City",
+ "Charleston", "Cheyenne",
+ "Columbia", "Columbus",
+ "Concord", "Denver",
+ "Des Moines", "Dover",
+ "Frankfort", "Harrisburg",
+ "Hartford", "Helena",
+ "Honolulu", "Indianapolis",
+ "Jackson", "Jefferson City",
+ "Juneau", "Lansing",
+ "Lincoln", "Little Rock",
+ "Madison", "Montgomery",
+ "Montpelier", "Nashville",
+ "Oklahoma City", "Olympia",
+ "Phoenix", "Pierre",
+ "Providence", "Raleigh",
+ "Richmond", "Sacramento",
+ "Saint Paul", "Salem",
+ "Salt Lake City", "Santa Fe",
+ "Springfield", "Tallahassee",
+ "Topeka", "Trenton" };
+
+static void
+_gl20_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+static char *
+_gl20_text_get(void *data, Evas_Object *obj EINA_UNUSED,
+ const char *part EINA_UNUSED)
+{
+ char buf[32];
+ int item_index = (int)(uintptr_t)data;
+
+ if (item_index < 50)
+ {
+ snprintf(buf, sizeof(buf), "%s", _gl20_items_text[item_index]);
+ return strdup(buf);
+ }
+ else if (item_index < 100)
+ {
+ snprintf(buf, sizeof(buf), "%X", (item_index - 50));
+ return strdup(buf);
+ }
+ else if (item_index == 100)
+ return strdup("Tree Item");
+
+ return NULL;
+}
+
+static void
+_gl20_search_item(gl20_Event_Data *event_data, Elm_Object_Item * it)
+{
+ const char *str = elm_entry_entry_get(event_data->en_obj);
+ if (!str || !strlen(str)) return;
+
+ Elm_Glob_Match_Flags flag = 0;
+ if (!elm_check_state_get(event_data->tg_obj)) flag = ELM_GLOB_MATCH_NOCASE;
+
+ printf("Looking for \"%s\". ", str);
+ event_data->last_item_found = elm_genlist_search_by_text_item_get
+ (event_data->gl_obj, it, NULL, str, flag);
+
+ if (event_data->last_item_found)
+ {
+ printf("Found.\n");
+ elm_genlist_item_selected_set(event_data->last_item_found, EINA_TRUE);
+ elm_genlist_item_bring_in(event_data->last_item_found,
+ ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+ elm_object_focus_set(event_data->en_obj, EINA_TRUE);
+ }
+ else
+ printf("Not Found.\n");
+}
+
+static void
+_gl20_search_settings_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *einfo EINA_UNUSED)
+{
+ _gl20_search_item(data, NULL);
+}
+
+static Elm_Genlist_Item_Class *
+_gl20_item_class_create(const char *item_style)
+{
+ Elm_Genlist_Item_Class * itc = elm_genlist_item_class_new();
+ itc->item_style = item_style;
+ itc->func.text_get = _gl20_text_get;
+ itc->func.content_get = gl_content_get;
+ itc->func.state_get = gl_state_get;
+ itc->func.del = NULL;
+ return itc;
+}
+
+static void
+_gl20_expand_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED,
+ void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ Evas_Object *gl = elm_object_item_widget_get(glit);
+ Elm_Genlist_Item_Class *itc = NULL;
+ int i = 0;
+
+ itc = _gl20_item_class_create("default");
+
+ for (i = 50; i < 100; i++)
+ {
+ elm_genlist_item_append(gl, itc,
+ (void *)(uintptr_t) i/* item data */,
+ glit/* parent */,
+ ELM_GENLIST_ITEM_NONE, NULL/* func */,
+ NULL/* func data */);
+ }
+ elm_genlist_item_class_free(itc);
+}
+
+static void _gl20_on_keydown(void *data, Evas *evas EINA_UNUSED,
+ Evas_Object *o EINA_UNUSED, void *einfo)
+{
+ Evas_Event_Key_Down *ev = einfo;
+ gl20_Event_Data * event_data = (gl20_Event_Data *)data;
+
+ if (!strcmp(ev->key, "Return"))
+ {
+ printf("Looking for next item\n");
+ _gl20_search_item(data, event_data->last_item_found);
+ }
+}
+
+void
+test_genlist20(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *gl;
+ Evas_Object *fr, *lb_frame; // info frame
+ Evas_Object *bx_entry, *lb_entry, *en; // search line
+ Evas_Object *tg; // "case sensitive" toggle
+ Elm_Genlist_Item_Class *itc = NULL;
+ gl20_Event_Data* event_data = NULL;
+ int i = 0;
+
+ win = elm_win_util_standard_add("genlist-item-search-by-text",
+ "Genlist Item Search By Text");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fr = elm_frame_add(bx);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Information");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ lb_frame = elm_label_add(fr);
+ elm_object_text_set(lb_frame,
+ "<align=left>This is an example of "
+ "elm_genlist_search_by_text_item_get() usage.<br>"
+ "Enter search string to the entry and press Enter to "
+ "show next search result.<br>");
+ elm_object_content_set(fr, lb_frame);
+ evas_object_show(lb_frame);
+
+ tg = elm_check_add(win);
+ elm_object_style_set(tg, "toggle");
+ elm_object_text_set(tg, " Case Sensitive Search");
+ elm_check_state_set(tg, EINA_TRUE);
+ elm_box_pack_end(bx, tg);
+ evas_object_show(tg);
+
+ bx_entry = elm_box_add(win);
+ elm_box_horizontal_set(bx_entry, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx_entry, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx_entry, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(bx, bx_entry);
+ evas_object_show(bx_entry);
+
+ lb_entry = elm_label_add(win);
+ elm_object_text_set(lb_entry, " Search:");
+ evas_object_size_hint_weight_set(lb_entry, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lb_entry, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_entry, lb_entry);
+ evas_object_show(lb_entry);
+
+ en = elm_entry_add(win);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_object_part_text_set(en, "guide", "Type item's name here to search.");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_entry, en);
+ evas_object_show(en);
+ elm_object_focus_set(en, EINA_TRUE);
+
+ gl = elm_genlist_add(bx);
+
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(gl);
+
+ event_data = calloc(1, sizeof(gl20_Event_Data));
+ event_data->tg_obj = tg;
+ event_data->en_obj = en;
+ event_data->gl_obj = gl;
+ event_data->last_item_found = NULL;
+
+ evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_DOWN,
+ _gl20_on_keydown, (void*)event_data);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_FREE,
+ _gl20_del_cb, (void*)event_data);
+ evas_object_smart_callback_add(en, "changed,user",
+ _gl20_search_settings_changed_cb, (void*)event_data);
+ evas_object_smart_callback_add(tg, "changed",
+ _gl20_search_settings_changed_cb, (void*)event_data);
+ evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, gl);
+ evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, gl);
+ evas_object_smart_callback_add(gl, "contracted", gl4_con, gl);
+ evas_object_smart_callback_add(gl, "expanded", _gl20_expand_cb, gl);
+
+ itc = _gl20_item_class_create("tree_effect");
+
+ elm_genlist_item_append(gl, itc,
+ (void *)100/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_TREE,
+ NULL/* func */,
+ NULL/* func data */);
+
+ itc->item_style = "default";
+
+ for (i = 0; i < 50; i++)
+ {
+ elm_genlist_item_append(gl, itc,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ NULL/* func */,
+ NULL/* func data */);
+ }
+
+ elm_genlist_item_class_free(itc);
+
+ evas_object_resize(win, 320, 500);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Del ***********************************************************/
+static void _gl_del_sel(void *data, Evas_Object *obj, void *event_info);
+
+static void
+_gl_del_win_del_cb(void *data, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (!data) return;
+ elm_genlist_item_class_free(data);
+}
+
+static void
+_gl_del_unrealized_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ int num = (int)(uintptr_t)elm_object_item_data_get(event_info);
+ printf("unrealized item # %d\n", num);
+}
+
+static void
+_gl_del_doubleclick_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ int num = (int)(uintptr_t)elm_object_item_data_get(event_info);
+ int num_category = num % 4;
+
+ if (num_category == 3)
+ elm_genlist_clear(obj);
+}
+static Evas_Object *
+_gl_del_genlist_add(Evas_Object *bx)
+{
+ Evas_Object *gl = NULL;
+
+ gl = elm_genlist_add(bx);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(gl);
+ evas_object_smart_callback_add(gl, "unrealized",
+ _gl_del_unrealized_cb, NULL);
+ evas_object_smart_callback_add(gl, "clicked,double",
+ _gl_del_doubleclick_cb, NULL);
+
+ return gl;
+}
+
+static void
+_gl_del_item_append(Evas_Object *gl, Elm_Genlist_Item_Class *itc)
+{
+ int i = 0;
+ for (i = 0; i < 1000; i++)
+ {
+ elm_genlist_item_append(gl, itc,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ _gl_del_sel/* func */,
+ (void *)(uintptr_t)(i)/* func data */);
+ }
+}
+
+char *
+_gl_del_text_get(void *data, Evas_Object *obj EINA_UNUSED,
+ const char *part EINA_UNUSED)
+{
+ char buf[256] = { 0 };
+ int num = (int)(uintptr_t)data;
+ int num_category = num % 10;
+
+ if (num_category == 3)
+ snprintf(buf, sizeof(buf),
+ "Item #%.02i - 1. Item Del", num);
+ else if (num_category == 5)
+ snprintf(buf, sizeof(buf),
+ "Item #%.02i - 2. Genlist Clear and Item Append", num);
+ else if (num_category == 7)
+ snprintf(buf, sizeof(buf),
+ "Item #%.02i - 3. Genlist Del", num);
+ else if (num_category == 9)
+ snprintf(buf, sizeof(buf),
+ "Item #%.02i - 4. Genlist Clear on double-click", num);
+ else
+ snprintf(buf, sizeof(buf),
+ "Item #%.02i - Normal item", num);
+
+ return strdup(buf);
+}
+
+static void
+_gl_del_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ int num = (int)(uintptr_t)data;
+ int num_category = num % 10;
+ Elm_Object_Item *it = event_info;
+ Elm_Genlist_Item_Class *itc =
+ (Elm_Genlist_Item_Class *)elm_genlist_item_item_class_get(it);
+
+ if (num_category == 3)
+ elm_object_item_del(it);
+ else if (num_category == 5)
+ {
+ elm_genlist_clear(obj);
+ _gl_del_item_append(obj, itc);
+ }
+ else if (num_category == 7)
+ {
+ evas_object_del(obj);
+ }
+}
+
+static void
+_gl_del_del_cb(void *data, Evas_Object *obj EINA_UNUSED)
+{
+ printf("deleted item # %d\n", (int)(uintptr_t)data);
+}
+
+void
+test_genlist_del(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *fr, *lb, *gl;
+ Elm_Genlist_Item_Class *itc = NULL;
+
+ win = elm_win_util_standard_add("genlist-del", "Genlist Del");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ elm_box_align_set(bx, 0.5, 0.0);
+ evas_object_show(bx);
+
+ fr = elm_frame_add(bx);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(fr, "Information");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ lb = elm_label_add(fr);
+ elm_object_text_set(lb, "<align=left>This example tests the following cases"
+ " on item selection.<br/>"
+ " 1. genlist item deletion<br/>"
+ " 2. genlist clear and item append<br/>"
+ " 3. genlist del<br/>"
+ " 4. genlist clear on double-click</align>");
+ elm_object_content_set(fr, lb);
+ evas_object_show(lb);
+
+ itc = elm_genlist_item_class_new();
+ itc->item_style = "default";
+ itc->func.text_get = _gl_del_text_get;
+ itc->func.content_get = gl_content_get;
+ itc->func.state_get = NULL;
+ itc->func.del = _gl_del_del_cb;
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
+ _gl_del_win_del_cb, itc);
+
+ gl = _gl_del_genlist_add(bx);
+ _gl_del_item_append(gl, itc);
+
+ evas_object_resize(win, 320, 500);
+ evas_object_show(win);
+}
+
+
+/*** Genlist Focus *********************************************************/
+static unsigned _gl_focus_objects = 3;
+static const char *_gl_focus_object_names[] = {"None", "Square", "Button", "Check", "Box"};
+
+// for the top genlist items
+static char *
+gl_focus_top_items_text_get(void *data, Evas_Object *obj EINA_UNUSED,
+ const char *part EINA_UNUSED)
+{
+ if (!data) return NULL;
+
+ if (!strcmp(data, "do_nothing"))
+ return strdup("Genlist Item");
+ else if (!strcmp(data, "popup_sel"))
+ return strdup("Create a popup on Select (popup parent is gl)");
+ else if (!strcmp(data, "popup_mouse_down"))
+ return strdup("Create a popup on Mouse Down (popup parent is gl)");
+ else if (!strcmp(data, "popup_activate"))
+ return strdup("Create a popup on Activate (popup parent is win)");
+ else if (!strcmp(data, "clear_on_focus"))
+ return strdup("Genlist Clear on Focus");
+ else
+ return NULL;
+}
+
+static char *
+gl_focus_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ unsigned char op = (uintptr_t)data % 100;
+ unsigned char v1, v2;
+
+ v1 = op / 10;
+ if (v1 > 4) v1 = 4;
+ v2 = op % 10;
+ if (v2 > 4) v2 = 4;
+ snprintf(buf, sizeof(buf), " %s / %s ",
+ _gl_focus_object_names[v1], _gl_focus_object_names[v2]);
+ return strdup(buf);
+}
+
+static Evas_Object *
+gl_focus_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ Evas_Object *cnt = NULL;
+
+ char op = (uintptr_t)data % 100;
+ char type = (!strcmp(part,"elm.swallow.icon")) ? op / 10 : op % 10;
+
+ switch(type)
+ {
+ case 1:
+ cnt = elm_bg_add(obj);
+ evas_object_color_set(cnt, 128, 18, 128, 255);
+ break;
+ case 2:
+ cnt = elm_button_add(obj);
+ break;
+ case 3:
+ cnt = elm_check_add(obj);
+ break;
+ case 4:
+ cnt = elm_box_add(obj);
+ evas_object_size_hint_align_set(cnt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_horizontal_set(cnt, EINA_TRUE);
+ elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, ""));
+ elm_box_pack_end(cnt, gl_focus_content_get((void *)3, obj, ""));
+ elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, ""));
+ break;
+ default:
+ break;
+
+ }
+ if (cnt)
+ {
+ evas_object_size_hint_weight_set(cnt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(cnt);
+ }
+ return cnt;
+}
+
+static void
+_gl_focus_sel_popup_close_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static void
+_gl_focus_sel_popup_create(Evas_Object *parent)
+{
+ Evas_Object *popup = NULL, *btn = NULL;
+
+ popup = elm_popup_add(parent);
+ elm_object_text_set(popup, "Popup for the genlist focus test with popup creation.");
+
+ // popup buttons
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Close");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _gl_focus_sel_popup_close_btn_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+ elm_object_focus_set(btn, EINA_TRUE);
+}
+
+static void
+_gl_focus_0_item_sel_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ _gl_focus_sel_popup_create(obj);
+}
+
+static void
+_gl_focus_item_loop_enable_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *gl = data;
+ elm_object_scroll_item_loop_enabled_set(gl, elm_check_state_get(obj));
+}
+
+static void
+_gl_focus_focus_on_selection_set(Evas_Object *gl,
+ Evas_Object *chk, Eina_Bool focus)
+{
+ elm_genlist_focus_on_selection_set(gl, focus);
+ elm_check_state_set(chk, focus);
+ printf("genlist_focus_on_selection = %s\n", (focus) ? "true" : "false");
+}
+
+static void
+_gl_focus_focus_on_selection_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool nextstate = !elm_genlist_focus_on_selection_get(data);
+ _gl_focus_focus_on_selection_set(data, obj, nextstate);
+}
+
+static void
+_gl_focus_win_auto_focus_enable_changed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_window_auto_focus_enable_set(elm_check_state_get(obj));
+}
+
+static void
+_gl_focus_win_auto_focus_animate_changed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_window_auto_focus_animate_set(elm_check_state_get(obj));
+}
+
+static void
+_gl_focus_focus_highlight_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_enabled_set(data,
+ elm_check_state_get(obj));
+}
+
+static void
+_gl_focus_focus_animate_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_animate_set(data,
+ elm_check_state_get(obj));
+}
+
+static void
+_gl_focus_move_policy_changed_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ int val = elm_radio_value_get(obj);
+
+ if (val == 0)
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK);
+ else if (val == 1)
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN);
+}
+
+static void
+_gl_focus_item_focus_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ printf("item,focused: %p\n", event_info);
+
+ if (event_info == data)
+ elm_genlist_clear(obj);
+}
+
+static void
+_gl_focus_item_unfocus_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ printf("item,unfocused %p\n", event_info);
+}
+
+static void
+_gl_focus_item_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Object_Item *it = event_info;
+
+ printf("%s: %p\n", (char *)data, it);
+
+ if (!strcmp((char *)data, "activated") &&
+ !strcmp((char *)elm_object_item_data_get(it), "popup_activate"))
+ {
+ _gl_focus_sel_popup_create(elm_object_top_widget_get(obj));
+ }
+}
+
+static void
+_gl_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ printf("\n=== Key Down : %s ===\n", ev->keyname);
+}
+
+static void
+_gl_focus_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = event_info;
+ Elm_Object_Item *it = NULL;
+ int postret = 0;
+
+ it = elm_genlist_at_xy_item_get(obj, ev->canvas.x, ev->canvas.y, &postret);
+ if (!it) return;
+
+ if (elm_genlist_item_index_get(it) == 4)
+ _gl_focus_sel_popup_create(obj);
+}
+
+static Ecore_Timer *timer = NULL;
+static void
+_gl_focus_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_timer_del(timer);
+ timer = NULL;
+}
+
+static void
+_gl_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj));
+}
+
+static void
+_gl_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
+}
+
+static void
+_gl_wheel_disabled_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_scroller_wheel_disabled_set(data, elm_check_state_get(obj));
+}
+
+static Eina_Bool
+_focus_timer_cb(void *data)
+{
+ elm_object_item_focus_set(data, EINA_TRUE);
+ timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_select_timer_cb(void *data)
+{
+ elm_genlist_item_selected_set(data, EINA_TRUE);
+ timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_focus_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_timer_del(timer);
+ timer = ecore_timer_add(1.5, _focus_timer_cb, data);
+}
+
+static void
+_sel_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_timer_del(timer);
+ timer = ecore_timer_add(1.5, _select_timer_cb, data);
+}
+
+static void
+_dis_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ elm_object_item_disabled_set(data, EINA_TRUE);
+}
+
+static void
+_add_more_items_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Genlist_Item_Class *itc = NULL;
+ int i = 0;
+
+ itc = elm_genlist_item_class_new();
+ itc->item_style = "default";
+ itc->func.text_get = gl_text_get;
+ itc->func.content_get = NULL;
+ itc->func.state_get = NULL;
+ itc->func.del = NULL;
+
+
+ for (i = 0; i < 1000; i++)
+ {
+ elm_genlist_item_append(data, itc, (void *)(uintptr_t)i,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ }
+
+ elm_genlist_item_class_free(itc);
+}
+
+static void
+_focus_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Button clicked: %s\n", (char *)data);
+}
+
+void
+_focus_autoscroll_changed_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_focus_autoscroll_mode_set(elm_radio_value_get(obj));
+}
+
+/* this function is used in another tests such as list, gengrid, and toolbar. */
+Evas_Object *
+_focus_autoscroll_mode_frame_create(Evas_Object *parent)
+{
+ Evas_Object *fr, *bx, *rdg, *rd;
+
+ fr = elm_frame_add(parent);
+ elm_object_text_set(fr, "Focus Autoscroll Mode");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ rdg = rd = elm_radio_add(bx);
+ elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_SHOW);
+ elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_SHOW");
+ elm_object_tooltip_text_set(rd, "Directly show the focused region<br/>"
+ "or item automatically inside a scroller.");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed",
+ _focus_autoscroll_changed_cb,
+ NULL);
+
+ rd = elm_radio_add(bx);
+ elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_NONE);
+ elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_NONE");
+ elm_object_tooltip_text_set(rd, "Do not show the focused region or<br/>"
+ "item automatically inside a scroller.");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, rd);
+ elm_radio_group_add(rd, rdg);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed",
+ _focus_autoscroll_changed_cb,
+ NULL);
+
+
+ rd = elm_radio_add(bx);
+ elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN);
+ elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN");
+ elm_object_tooltip_text_set(rd, "Bring in the focused region or item<br/>"
+ "automatically which might invole the scrolling.");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, rd);
+ elm_radio_group_add(rd, rdg);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed",
+ _focus_autoscroll_changed_cb,
+ NULL);
+
+ elm_radio_value_set(rdg, elm_config_focus_autoscroll_mode_get());
+
+ return fr;
+}
+
+static void
+_test_genlist_focus_option_panel_create(Evas_Object *win, Evas_Object *bx,
+ Evas_Object *gl, Elm_Object_Item *it_0,
+ Elm_Object_Item *it_2)
+{
+ Evas_Object *fr = NULL, *bx_opt = NULL, *chk = NULL;
+ Evas_Object *bx_mv = NULL, *rd = NULL, *rdg = NULL;
+ Evas_Object *btn_box = NULL, *btn = NULL;
+
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Options");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_opt = elm_box_add(fr);
+ elm_box_layout_set(bx_opt, evas_object_box_layout_flow_horizontal, NULL, NULL);
+ evas_object_size_hint_weight_set(bx_opt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx_opt, EVAS_HINT_FILL, 0.0);
+ elm_box_align_set(bx_opt, 0.0, 0.5);
+ elm_object_content_set(fr, bx_opt);
+ evas_object_show(bx_opt);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Window Auto Focus Enable");
+ elm_check_state_set(chk, EINA_TRUE);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ _gl_focus_win_auto_focus_enable_changed,
+ NULL);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Window Auto Focus Animate");
+ elm_check_state_set(chk, EINA_TRUE);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ _gl_focus_win_auto_focus_animate_changed,
+ NULL);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Focus Highlight");
+ elm_check_state_set(chk, EINA_FALSE);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ _gl_focus_focus_highlight_changed_cb,
+ win);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Focus Animation");
+ elm_check_state_set(chk, EINA_FALSE);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ _gl_focus_focus_animate_changed_cb,
+ win);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Focus on selection");
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ _gl_focus_focus_on_selection_changed_cb, gl);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Item Looping Enable");
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ _gl_focus_item_loop_enable_changed_cb, gl);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Item Select on Focus disable");
+ elm_check_state_set(chk, elm_config_item_select_on_focus_disabled_get());
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ _gl_focus_item_select_on_focus_disable_changed_cb,
+ NULL);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "First item focus on first focus in");
+ elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get());
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ _gl_first_item_focus_on_first_focus_in_cb,
+ NULL);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Wheel Disabled");
+ elm_check_state_set(chk, elm_scroller_wheel_disabled_get(gl));
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed", _gl_wheel_disabled_cb, gl);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ // Focus Autoscroll Mode
+ fr = _focus_autoscroll_mode_frame_create(bx);
+ elm_box_pack_end(bx, fr);
+
+ // Focus Movement Policy
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Focus Movement Policy");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_mv = elm_box_add(fr);
+ elm_box_horizontal_set(bx_mv, EINA_TRUE);
+ elm_object_content_set(fr, bx_mv);
+ evas_object_show(bx_mv);
+
+ rdg = rd = elm_radio_add(bx_mv);
+ elm_object_text_set(rd, "Focus Move by Click");
+ elm_radio_state_value_set(rd, 0);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(rd, "changed",
+ _gl_focus_move_policy_changed_cb,
+ NULL);
+ elm_box_pack_end(bx_mv, rd);
+ evas_object_show(rd);
+
+ rd = elm_radio_add(bx_mv);
+ elm_object_text_set(rd, "Focus Move by Mouse-In");
+ elm_radio_group_add(rd, rdg);
+ elm_radio_state_value_set(rd, 1);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(rd, "changed",
+ _gl_focus_move_policy_changed_cb,
+ NULL);
+ elm_box_pack_end(bx_mv, rd);
+ evas_object_show(rd);
+
+ // Options
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Options");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ btn_box = elm_box_add(fr);
+ elm_object_content_set(fr, btn_box);
+ evas_object_show(btn_box);
+
+ btn = elm_button_add(btn_box);
+ elm_object_text_set(btn, "Focus 2nd Item after 1.5 seconds.");
+ evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(btn_box, btn);
+ evas_object_show(btn);
+ evas_object_smart_callback_add(btn, "clicked", _focus_btn_cb, it_2);
+
+ btn = elm_button_add(btn_box);
+ elm_object_text_set(btn, "Select 2nd Item after 1.5 seconds.");
+ evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(btn_box, btn);
+ evas_object_show(btn);
+ evas_object_smart_callback_add(btn, "clicked", _sel_btn_cb, it_2);
+
+ btn = elm_button_add(btn_box);
+ elm_object_text_set(btn, "Disable 1st Item.");
+ evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(btn_box, btn);
+ evas_object_show(btn);
+ evas_object_smart_callback_add(btn, "clicked", _dis_btn_cb, it_0);
+
+
+ btn = elm_button_add(btn_box);
+ elm_object_text_set(btn, "Add more Genlist items");
+ evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(btn_box, btn);
+ evas_object_show(btn);
+ evas_object_smart_callback_add(btn, "clicked", _add_more_items_btn_cb, gl);
+}
+
+void
+test_genlist_focus(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *gl, *btn;
+ unsigned lhand, rhand;
+ Elm_Object_Item *it = NULL, *it_1 = NULL, *it_2 = NULL;
+ Elm_Genlist_Item_Class *itc = NULL, *itc1 = NULL, *itc2 = NULL;
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-focus", "Genlist Focus");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
+ _gl_focus_win_del_cb, NULL);
+
+ elm_config_window_auto_focus_enable_set(EINA_TRUE);
+ elm_config_window_auto_focus_animate_set(EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_FALSE);
+ elm_win_focus_highlight_animate_set(win, EINA_FALSE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ btn = elm_button_add(bx);
+ elm_object_text_set(btn, "Up");
+ elm_box_pack_end(bx, btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _focus_button_clicked_cb, "Up");
+ evas_object_show(btn);
+
+ bx2 = elm_box_add(bx);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ btn = elm_button_add(bx2);
+ elm_object_text_set(btn, "Left");
+ elm_box_pack_end(bx2, btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _focus_button_clicked_cb, "Left");
+ evas_object_show(btn);
+
+ gl = elm_genlist_add(bx);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ elm_box_pack_end(bx2, gl);
+ api->gl = gl;
+ evas_object_show(gl);
+ evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected");
+ evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected");
+ evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated");
+ evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted");
+ evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted");
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _gl_focus_mouse_down_cb, NULL);
+
+ btn = elm_button_add(bx2);
+ elm_object_text_set(btn, "Right");
+ elm_box_pack_end(bx2, btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _focus_button_clicked_cb, "Right");
+ evas_object_show(btn);
+
+ btn = elm_button_add(bx);
+ elm_object_text_set(btn, "Down");
+ elm_box_pack_end(bx, btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _focus_button_clicked_cb, "Down");
+ evas_object_show(btn);
+
+ itc = elm_genlist_item_class_new();
+ itc->item_style = "default";
+ itc->func.text_get = gl_focus_top_items_text_get;
+ itc->func.content_get = NULL;
+ itc->func.state_get = NULL;
+ itc->func.del = NULL;
+
+ itc1 = elm_genlist_item_class_new();
+ itc1->item_style = "default";
+ itc1->func.text_get = gl_focus_text_get;
+ itc1->func.content_get = gl_focus_content_get;
+ itc1->func.state_get = NULL;
+ itc1->func.del = NULL;
+
+ itc2 = elm_genlist_item_class_new();
+ itc2->item_style = "tree_effect";
+ itc2->func.text_get = gl_focus_text_get;
+ itc2->func.content_get = gl_focus_content_get;
+ itc2->func.state_get = NULL;
+ itc2->func.del = NULL;
+
+ it_1 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE,
+ NULL, NULL);
+ it_2 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE,
+ NULL, NULL);
+ elm_genlist_item_append(gl, itc, "popup_sel", NULL, ELM_GENLIST_ITEM_NONE,
+ _gl_focus_0_item_sel_cb, NULL);
+ elm_genlist_item_append(gl, itc, "popup_mouse_down", NULL, ELM_GENLIST_ITEM_NONE,
+ NULL, NULL);
+ elm_genlist_item_append(gl, itc, "popup_activate", NULL, ELM_GENLIST_ITEM_NONE,
+ NULL, NULL);
+
+ it = elm_genlist_item_append(gl, itc, "clear_on_focus", NULL, ELM_GENLIST_ITEM_NONE,
+ NULL, NULL);
+ evas_object_smart_callback_add(gl, "item,focused", _gl_focus_item_focus_cb, it);
+ evas_object_smart_callback_add(gl, "item,unfocused", _gl_focus_item_unfocus_cb, NULL);
+
+ for (lhand = 0; lhand < _gl_focus_objects; lhand++)
+ {
+ for (rhand = 0; rhand < _gl_focus_objects; rhand++)
+ {
+ unsigned digit1 = lhand * 10 + rhand;
+ elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit1,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ unsigned digit2 = (_gl_focus_objects - lhand -1) * 10 +
+ (_gl_focus_objects - rhand -1);
+ it = elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit2,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if (rhand == 4)
+ elm_object_item_disabled_set(it, EINA_TRUE);
+
+ if (rhand == (_gl_focus_objects - 1))
+ elm_genlist_item_append(gl, itc2, (void*)(uintptr_t)digit1,
+ NULL, ELM_GENLIST_ITEM_TREE, NULL, NULL);
+ }
+ }
+
+ elm_genlist_item_class_free(itc);
+ elm_genlist_item_class_free(itc1);
+ elm_genlist_item_class_free(itc2);
+
+ // Options
+ _test_genlist_focus_option_panel_create(win, bx, gl, it_1, it_2);
+
+ evas_object_resize(win, 420, 600);
+ evas_object_show(win);
+}
+
+char *genlist_demo_names[] = {
+ "Aaliyah", "Aamir", "Aaralyn", "Aaron", "Abagail",
+ "Babitha", "Bahuratna", "Bandana", "Bulbul", "Cade", "Caldwell",
+ "Chandan", "Caster", "Dagan ", "Daulat", "Dag", "Earl", "Ebenzer",
+ "Ellison", "Elizabeth", "Filbert", "Fitzpatrick", "Florian", "Fulton",
+ "Frazer", "Gabriel", "Gage", "Galen", "Garland", "Gauhar", "Hadden",
+ "Hafiz", "Hakon", "Haleem", "Hank", "Hanuman", "Jabali ", "Jaimini",
+ "Jayadev", "Jake", "Jayatsena", "Jonathan", "Kamaal", "Jeirk",
+ "Jasper", "Jack", "Mac", "Macy", "Marlon", "Milson",
+ NULL
+};
+
+static char *
+glf_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "%s", genlist_demo_names[((int)(uintptr_t)data)%50]);
+ return strdup(buf);
+}
+
+Eina_Bool
+gl_filter_get(void *data, Evas_Object *obj EINA_UNUSED, void *key)
+{
+ if (!strlen((char *)key)) return EINA_TRUE;
+
+ if (strcasestr(genlist_demo_names[((int)(uintptr_t)data)%50], (char *)key))
+ return EINA_TRUE;
+ // Default case should return false (item fails filter hence will be hidden)
+ return EINA_FALSE;
+}
+
+static void
+_gl_filter_finished_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Filter finished, filtered items count is %d\n", elm_genlist_filtered_items_count((Evas_Object *)data));
+}
+
+void
+_entry_change_cb(void *data, Evas_Object *obj, void *event EINA_UNUSED)
+{
+ api_data *api = (api_data *)data;
+ char buf[100];
+ unsigned int count = 0;
+ Elm_Object_Item *item;
+
+ if (api->filter_data) free(api->filter_data);
+
+ sprintf(buf, "%s", elm_object_text_get(obj));
+ api->filter_data = strdup(buf);
+ elm_genlist_filter_set(api->gl, (void *)(api->filter_data));
+ if (!strlen(buf))
+ {
+ printf("Input data string empty; returning\n");
+ return;
+ }
+
+ item = elm_genlist_first_item_get(api->gl);
+ if (!item)
+ {
+ printf("No matches for the key %s\n", buf);
+ return;
+ }
+ while (item)
+ {
+ ++count;
+ item = elm_genlist_item_next_get(item);
+ }
+ printf("Number of matches for %s is %d\n", buf, count);
+}
+
+void
+test_genlist_filter(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *entry, *gl;
+ Elm_Genlist_Item_Class *itc = NULL;
+ int i;
+
+ api_data *api = calloc(1, sizeof(api_data));
+ win = elm_win_util_standard_add("genlist-filter", "Genlist filter");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
+ _gl_focus_win_del_cb, NULL);
+
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_focus_highlight_animate_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ entry = elm_entry_add(bx);
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.0);
+ elm_object_part_text_set(entry, "guide", "Search.");
+ elm_box_pack_end(bx, entry);
+ evas_object_show(entry);
+
+ bx2 = elm_box_add(bx);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ gl = elm_genlist_add(bx);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
+ elm_genlist_homogeneous_set(gl, EINA_TRUE);
+ elm_box_pack_end(bx2, gl);
+ api->gl = gl;
+ evas_object_show(gl);
+ evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected");
+ evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected");
+ evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated");
+ evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted");
+ evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted");
+ evas_object_smart_callback_add(gl, "filter,done", _gl_filter_finished_cb, gl);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL);
+
+ itc = elm_genlist_item_class_new();
+ itc->item_style = "default";
+ itc->func.text_get = glf_text_get;
+ itc->func.content_get = NULL;
+ itc->func.filter_get = gl_filter_get;
+ itc->func.state_get = NULL;
+ itc->func.del = NULL;
+
+ for (i = 0; i < 500; i++)
+ elm_genlist_item_append(gl, itc,
+ (void *)(long)i, NULL,
+ ELM_GENLIST_ITEM_NONE,
+ NULL, NULL);
+
+ evas_object_resize(win, 420, 600);
+ evas_object_show(win);
+ elm_object_focus_set(entry, EINA_TRUE);
+ evas_object_smart_callback_add(entry, "changed,user", _entry_change_cb, api);
+}
+
+static void
+_rd_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ api_data *ad = data;
+ ad->scrollto = elm_radio_state_value_get(obj);
+}
+
+static Evas_Object *
+_scrollto_mode_frame_new(Evas_Object *win, void *data)
+{
+ Evas_Object *fr, *bx, *rd, *rdg;
+ api_data *sd = data;
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Scrollto Mode");
+ evas_object_show(fr);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, 0);
+ elm_object_text_set(rd, "SCROLLTO_NONE");
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+ rdg = rd;
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, 1);
+ elm_object_text_set(rd, "SCROLLTO_IN");
+ elm_radio_group_add(rd, rdg);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, 2);
+ elm_object_text_set(rd, "SCROLLTO_TOP");
+ elm_radio_group_add(rd, rdg);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, 4);
+ elm_object_text_set(rd, "SCROLLTO_MIDDLE");
+ elm_radio_group_add(rd, rdg);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, 8);
+ elm_object_text_set(rd, "SCROLLTO_BOTTOM");
+ elm_radio_group_add(rd, rdg);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
+ evas_object_show(rd);
+ elm_box_pack_end(bx, rd);
+
+ return fr;
+}
+
+void
+_scrollto_item_show(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Elm_Object_Item *it = elm_genlist_selected_item_get(api->gl);
+ elm_genlist_item_show(it, api->scrollto);
+}
+
+void
+_scrollto_item_bring(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ Elm_Object_Item *it = elm_genlist_selected_item_get(api->gl);
+ elm_genlist_item_bring_in(it, api->scrollto);
+}
+
+void
+test_genlist_show_bring(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bt_show, *bt_bring, *bx, *bxx, *fr;
+ Elm_Object_Item *gli;
+ int i, max;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("genlist", "Genlist Item Show/Bring");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(bx);
+ elm_box_pack_end(bxx, bx);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(gl);
+ api->gl = gl;
+
+ api->itc1 = elm_genlist_item_class_new();
+ api->itc1->item_style = "default";
+ api->itc1->func.text_get = gl_text_get1;
+ api->itc1->func.content_get = gl_content_get;
+ api->itc1->func.state_get = NULL;
+ api->itc1->func.del = NULL;
+
+ bt_show = elm_button_add(win);
+ elm_object_text_set(bt_show, "Show");
+ evas_object_smart_callback_add(bt_show, "clicked", _scrollto_item_show, api);
+ evas_object_show(bt_show);
+ elm_box_pack_end(bx, bt_show);
+
+ bt_bring = elm_button_add(win);
+ elm_object_text_set(bt_bring, "Bring");
+ evas_object_smart_callback_add(bt_bring, "clicked", _scrollto_item_bring, api);
+ evas_object_show(bt_bring);
+ elm_box_pack_end(bx, bt_bring);
+
+ fr = _scrollto_mode_frame_new(win, api);
+ elm_box_pack_end(bx, fr);
+
+ max = 2000;
+ for (i = 0; i < max; i++)
+ elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ elm_genlist_item_class_free(api->itc1);
+ gli = elm_genlist_nth_item_get(gl, 1340);
+ elm_genlist_item_selected_set(gli, EINA_TRUE);
+ elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+
+ evas_object_resize(win, 480, 400);
+ explode_win_enable(win);
+ evas_object_show(win);
+}
+
diff --git a/src/bin/elementary/test_gesture_layer.c b/src/bin/elementary/test_gesture_layer.c
new file mode 100644
index 0000000000..5f75e6f32e
--- /dev/null
+++ b/src/bin/elementary/test_gesture_layer.c
@@ -0,0 +1,400 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+/* We zoom out to this value so we'll be able to use map and have a nice
+ * resolution when zooming in. */
+#define BASE_ZOOM 0.5
+/* The amount of zoom to do when "lifting" objects. */
+#define LIFT_FACTOR 1.3
+/* The base size of the shadow image. */
+#define SHADOW_W 118
+#define SHADOW_H 118
+
+static double zoom_out_animation_duration = 0.4;
+
+struct _Photo_Object {
+ Evas_Object *ic, *shadow;
+ Evas_Object *hit;
+ Evas_Object *gl;
+ Elm_Transit *zoom_out;
+ /* bx, by - current wanted coordinates of the photo object.
+ * bw, bh - original size of the "ic" object.
+ * dx, dy - Used to indicate the distance between the center point
+ * where we put down our fingers (when started moving the item) to
+ * the coords of the object, so we'll be able to calculate movement
+ * correctly. */
+ Evas_Coord bx, by, bw, bh, dx, dy;
+ /* Because gesture layer only knows the amount of rotation/zoom we do
+ * per gesture, we have to keep the current rotate/zoom factor and the
+ * one that was before we started the gesture. */
+ int base_rotate, rotate;
+ double base_zoom, zoom;
+ double shadow_zoom;
+};
+typedef struct _Photo_Object Photo_Object;
+
+/* This function applies the information from the Photo_Object to the actual
+ * evas objects. Zoom/rotate factors and etc. */
+static void
+apply_changes(Photo_Object *po)
+{
+ Evas_Map *map;
+
+ map = evas_map_new(4);
+ evas_map_point_coord_set(map, 0, po->bx, po->by, 0);
+ evas_map_point_coord_set(map, 1, po->bx + po->bw, po->by, 0);
+ evas_map_point_coord_set(map, 2, po->bx + po->bw, po->by + po->bh, 0);
+ evas_map_point_coord_set(map, 3, po->bx, po->by + po->bh, 0);
+ evas_map_point_image_uv_set(map, 0, 0, 0);
+ evas_map_point_image_uv_set(map, 1, po->bw, 0);
+ evas_map_point_image_uv_set(map, 2, po->bw, po->bh);
+ evas_map_point_image_uv_set(map, 3, 0, po->bh);
+ evas_map_util_rotate(map, po->rotate,
+ po->bx + po->bw / 2, po->by + po->bh /2);
+ evas_map_util_zoom(map, po->zoom, po->zoom,
+ po->bx + po->bw / 2, po->by + po->bh /2);
+ evas_object_map_enable_set(po->ic, EINA_TRUE);
+ evas_object_map_set(po->ic, map);
+
+ {
+ Evas_Map *shadow_map = evas_map_new(4);
+ evas_map_point_coord_set(shadow_map, 0, po->bx, po->by, 0);
+ evas_map_point_coord_set(shadow_map, 1, po->bx + po->bw, po->by, 0);
+ evas_map_point_coord_set(shadow_map, 2, po->bx + po->bw, po->by + po->bh, 0);
+ evas_map_point_coord_set(shadow_map, 3, po->bx, po->by + po->bh, 0);
+ evas_map_point_image_uv_set(shadow_map, 0, 0, 0);
+ evas_map_point_image_uv_set(shadow_map, 1, SHADOW_W, 0);
+ evas_map_point_image_uv_set(shadow_map, 2, SHADOW_W, SHADOW_H);
+ evas_map_point_image_uv_set(shadow_map, 3, 0, SHADOW_H);
+ evas_map_util_rotate(shadow_map, po->rotate,
+ po->bx + po->bw / 2, po->by + po->bh /2);
+ evas_map_util_zoom(shadow_map, po->zoom * po->shadow_zoom,
+ po->zoom * po->shadow_zoom,
+ po->bx + (po->bw / 2), po->by + (po->bh / 2));
+ evas_object_map_enable_set(po->shadow, EINA_TRUE);
+ evas_object_map_set(po->shadow, shadow_map);
+ evas_map_free(shadow_map);
+ }
+
+ /* Update the position of the hit box */
+ {
+ Evas_Coord minx, miny, maxx, maxy;
+ int i;
+ evas_object_polygon_points_clear(po->hit);
+ evas_map_point_coord_get(map, 0, &minx, &miny, NULL);
+ maxx = minx;
+ maxy = miny;
+ evas_object_polygon_point_add(po->hit, minx, miny);
+ for (i = 1 ; i <= 3 ; i++)
+ {
+ Evas_Coord x, y;
+ evas_map_point_coord_get(map, i, &x, &y, NULL);
+ evas_object_polygon_point_add(po->hit, x, y);
+ if (x < minx)
+ minx = x;
+ else if (x > maxx)
+ maxx = x;
+
+ if (y < miny)
+ miny = y;
+ else if (y > maxy)
+ maxy = y;
+ }
+ }
+
+ evas_object_raise(po->shadow);
+ evas_object_raise(po->ic);
+ evas_object_raise(po->hit);
+ evas_map_free(map);
+}
+
+/* Zoom out animation */
+static void
+zoom_out_animation_operation(void *_po, Elm_Transit *transit EINA_UNUSED,
+ double progress)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ po->zoom = BASE_ZOOM + ((po->base_zoom - BASE_ZOOM) * (1.0 - progress));
+ apply_changes(po);
+}
+
+static void
+zoom_out_animation_end(void *_po, Elm_Transit *transit EINA_UNUSED)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+
+ po->base_zoom = po->zoom = BASE_ZOOM;
+ apply_changes(po);
+
+ po->zoom_out = NULL;
+}
+
+static Evas_Event_Flags
+rotate_move(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
+ printf("rotate move <%d,%d> base=<%f> <%f>\n", p->x, p->y, p->base_angle, p->angle);
+ po->rotate = po->base_rotate + (int) p->angle - p->base_angle;
+ if (po->rotate < 0)
+ po->rotate += 360;
+ apply_changes(po);
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+rotate_end(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
+ printf("rotate end/abort <%d,%d> base=<%f> <%f>\n", p->x, p->y, p->base_angle, p->angle);
+ po->base_rotate += (int) p->angle - p->base_angle;
+ if (po->rotate < 0)
+ po->rotate += 360;
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+zoom_start(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
+ printf("zoom start <%d,%d> <%f>\n", p->x, p->y, p->zoom);
+
+ /* If there's an active animator, stop it */
+ if (po->zoom_out)
+ {
+ elm_transit_del(po->zoom_out);
+ po->zoom_out = NULL;
+ }
+
+ /* Give it a "lift" effect right from the start */
+ po->base_zoom = BASE_ZOOM * LIFT_FACTOR;
+ po->zoom = po->base_zoom;
+ po->shadow_zoom = 1.7;
+
+ apply_changes(po);
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+zoom_move(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
+ printf("zoom move <%d,%d> <%f>\n", p->x, p->y, p->zoom);
+ po->zoom = po->base_zoom * p->zoom;
+ apply_changes(po);
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+zoom_end(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
+ printf("zoom end/abort <%d,%d> <%f>\n", p->x, p->y, p->zoom);
+
+ /* Apply the zoom out animator */
+ po->shadow_zoom = 1.3;
+ po->base_zoom = po->zoom;
+ po->zoom_out = elm_transit_add();
+ elm_transit_duration_set(po->zoom_out, zoom_out_animation_duration);
+ elm_transit_effect_add(po->zoom_out, zoom_out_animation_operation, po, zoom_out_animation_end);
+ elm_transit_go(po->zoom_out);
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+momentum_start(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ printf("momentum_start <%d,%d>\n", p->x2, p->y2);
+
+ po->dx = p->x2 - po->bx;
+ po->dy = p->y2 - po->by;
+ apply_changes(po);
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+momentum_move(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ printf("momentum move <%d,%d>\n", p->x2, p->y2);
+
+ po->bx = p->x2 - po->dx;
+ po->by = p->y2 - po->dy;
+ apply_changes(po);
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+momentum_end(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ printf("momentum end/abort <%d,%d> <%d,%d>\n", p->x2, p->y2, p->mx, p->my);
+ (void) po;
+ (void) p;
+ /* Make sure middle is in the screen, if not, fix it. */
+ {
+ /* FIXME: Use actual window sizes instead of the hardcoded
+ * values */
+ Evas_Coord mx, my;
+ mx = po->bx + (po->bw / 2);
+ my = po->by + (po->bh / 2);
+ if (mx < 0)
+ po->bx = 0 - (po->bw / 2);
+ else if (mx > 480)
+ po->bx = 480 - (po->bw / 2);
+
+ if (my < 0)
+ po->by = 0 - (po->bw / 2);
+ else if (my > 800)
+ po->by = 800 - (po->bh / 2);
+ }
+ apply_changes(po);
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static void
+_win_del_req(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Photo_Object **photo_array = (Photo_Object **) data;
+
+ if (!photo_array)
+ return;
+
+ /* The content of the photo object is automatically deleted when the win
+ * is deleted. */
+ for ( ; *photo_array ; photo_array++)
+ free(*photo_array);
+
+ free(data);
+}
+
+Photo_Object *
+photo_object_add(Evas_Object *parent, Evas_Object *ic, const char *icon, Evas_Coord x,
+ Evas_Coord y, Evas_Coord w, Evas_Coord h, int angle)
+{
+ char buf[PATH_MAX];
+ Photo_Object *po;
+ po = calloc(1, sizeof(*po));
+ po->base_zoom = po->zoom = BASE_ZOOM;
+
+ if (ic)
+ {
+ po->ic = ic;
+ }
+ else
+ {
+ po->ic = elm_icon_add(parent);
+ elm_image_file_set(po->ic, icon, NULL);
+ }
+
+ po->bx = x;
+ po->by = y;
+ po->bw = w;
+ po->bh = h;
+
+ /* Add shadow */
+ {
+ po->shadow = elm_icon_add(po->ic);
+ snprintf(buf, sizeof(buf), "%s/images/pol_shadow.png", elm_app_data_dir_get());
+ elm_image_file_set(po->shadow, buf, NULL);
+ evas_object_resize(po->shadow, SHADOW_W, SHADOW_H);
+ evas_object_show(po->shadow);
+ }
+
+ po->hit = evas_object_polygon_add(evas_object_evas_get(parent));
+ evas_object_precise_is_inside_set(po->hit, EINA_TRUE);
+ evas_object_repeat_events_set(po->hit, EINA_TRUE);
+ evas_object_color_set(po->hit, 0, 0, 0, 0);
+
+ evas_object_move(po->ic, 0, 0);
+ evas_object_resize(po->ic, po->bw, po->bh);
+ evas_object_show(po->ic);
+
+ evas_object_show(po->hit);
+
+ po->gl = elm_gesture_layer_add(po->ic);
+ elm_gesture_layer_hold_events_set(po->gl, EINA_TRUE);
+ elm_gesture_layer_attach(po->gl, po->hit);
+
+ /* FIXME: Add a po->rotate start so we take the first angle!!!! */
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_MOVE, rotate_move, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_END, rotate_end, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_ABORT, rotate_end, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_START, zoom_start, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_MOVE, zoom_move, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_END, zoom_end, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_ABORT, zoom_end, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_START, momentum_start, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_MOVE, momentum_move, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_END, momentum_end, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_ABORT, momentum_end, po);
+
+ po->rotate = po->base_rotate = angle;
+ po->shadow_zoom = 1.3;
+
+ apply_changes(po);
+ return po;
+}
+
+void
+test_gesture_layer(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Coord w, h;
+ Evas_Object *win, *bg;
+ char buf[PATH_MAX];
+ int ind = 0;
+ Photo_Object **photo_array;
+ photo_array = calloc(4, sizeof(*photo_array));
+
+ w = 480;
+ h = 800;
+
+ win = elm_win_add(NULL, "gesture-layer", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Gesture Layer");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_resize(win, w, h);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/wood_01.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ snprintf(buf, sizeof(buf), "%s/images/pol_sky.png", elm_app_data_dir_get());
+ photo_array[ind++] = photo_object_add(win, NULL, buf, 200, 200, 365, 400, 0);
+ snprintf(buf, sizeof(buf), "%s/images/pol_twofish.png", elm_app_data_dir_get());
+ photo_array[ind++] = photo_object_add(win, NULL, buf, 40, 300, 365, 400, 45);
+
+ Evas_Object *en = elm_entry_add(win);
+ elm_object_text_set(en, "<font_size=40>You can use whatever object you want, "
+ "even entries like this.</font_size>");
+ elm_entry_line_wrap_set(en, ELM_WRAP_MIXED);
+
+ Evas_Object *postit = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/postit_ent.edj", elm_app_data_dir_get());
+ elm_layout_file_set(postit, buf, "main");
+ elm_object_part_content_set(postit, "ent", en);
+
+ photo_array[ind++] = photo_object_add(win, postit, NULL, 50, 50, 382, 400, 355);
+
+ photo_array[ind] = NULL;
+ evas_object_smart_callback_add(win, "delete,request", _win_del_req,
+ photo_array);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_gesture_layer2.c b/src/bin/elementary/test_gesture_layer2.c
new file mode 100644
index 0000000000..f74912a1e5
--- /dev/null
+++ b/src/bin/elementary/test_gesture_layer2.c
@@ -0,0 +1,808 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define TAP_NAME "tap"
+#define DOUBLE_TAP_NAME "double_tap"
+#define TRIPLE_TAP_NAME "triple_tap"
+#define LONG_TAP_NAME "long_tap"
+#define FLICK_NAME "flick"
+#define LINE_NAME "line"
+#define MOMENTUM_NAME "momentum"
+#define ROTATE_NAME "rotate"
+#define ZOOM_NAME "zoom"
+
+#define N_GESTURE_TYPE 9
+#define MAX_DOUBLE_TAP 5
+#define MAX_FLICK 5
+#define MAX_LINE 5
+#define MAX_LONG_TAP 5
+#define MAX_MOMENTUM 5
+#define MAX_ROTATE 1
+#define MAX_TAP 5
+#define MAX_TRIPLE_TAP 5
+#define MAX_ZOOM 1
+
+#define TB_PADDING_X 4
+#define TB_PADDING_Y 12
+
+#define BX_PADDING_X 0
+#define BX_PADDING_Y 2
+
+/* Define initial RGBA values for icons */
+#define INI_R 60
+#define INI_G 66
+#define INI_B 64
+#define INI_A 128
+#define COLOR_STEP 4
+
+#define START_COLOR 220, 220, 200, 255
+#define MOVE_COLOR 255, 255, 0, 255
+#define ABORT_COLOR 255, 0, 0, 255
+#define END_COLOR 0, 255, 0, 255
+
+struct _icon_properties
+{
+ Evas_Object *icon;
+ int r; /* current r */
+ int g;
+ int b;
+ int a;
+
+ const char *name;
+};
+typedef struct _icon_properties icon_properties;
+
+struct _infra_data
+{ /* Some data that is passed aroung between callbacks (replacing globals) */
+ icon_properties *icons;
+ Ecore_Timer *colortimer;
+ char buf[1024];
+ int long_tap_count;
+};
+typedef struct _infra_data infra_data;
+
+void
+_infra_data_free(infra_data *infra)
+{
+ if (infra)
+ {
+ if (infra->colortimer)
+ ecore_timer_del(infra->colortimer);
+
+ if (infra->icons)
+ free(infra->icons);
+
+ free (infra);
+ }
+}
+
+infra_data *
+_infra_data_alloc(void)
+{
+ infra_data *infra = malloc(sizeof(infra_data));
+ infra->icons = calloc(N_GESTURE_TYPE, sizeof(icon_properties ));
+ infra->colortimer = NULL;
+
+ return infra;
+}
+
+static void
+my_win_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{ /* called when my_win_main is requested to be deleted */
+ _infra_data_free(data);
+}
+
+icon_properties *
+_icon_properties_find(icon_properties *icons, char *name)
+{
+ int n;
+
+ for (n = 0; n < N_GESTURE_TYPE; n++)
+ if (!strcmp(icons[n].name, name))
+ return &icons[n];
+
+ return NULL;
+}
+
+void
+_icon_color_set(icon_properties *i, int r, int g, int b, int a)
+{
+ i->r = r;
+ i->g = g;
+ i->b = b;
+ i->a = a;
+ evas_object_color_set(i->icon, i->r, i->g, i->b, i->a);
+}
+
+static Eina_Bool
+_icon_color_set_cb(void *data)
+{
+#define INC_COLOR(C, NC) \
+ do { \
+ if (abs(i->C - NC) < COLOR_STEP) \
+ i->C = NC; \
+ else \
+ i->C += ((i->C < NC) ? COLOR_STEP : (-COLOR_STEP)); \
+ } while (0)
+
+ int n;
+ icon_properties *icons = data;
+ icon_properties *i;
+
+ for (n = 0; n < N_GESTURE_TYPE; n++)
+ {
+ i = &icons[n];
+
+ INC_COLOR(r,INI_R);
+ INC_COLOR(g,INI_G);
+ INC_COLOR(b,INI_B);
+ INC_COLOR(a,INI_A);
+
+ /* Change Icon color */
+ evas_object_color_set(i->icon, i->r, i->g, i->b, i->a);
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+void
+_color_and_icon_set(infra_data *infra, char *name, int n, int max,
+ int r, int g, int b, int a)
+{
+ icon_properties *i;
+ int nn = n;
+ i = _icon_properties_find(infra->icons, name);
+ if (i)
+ {
+ if (n < 1)
+ nn = 1;
+
+ if (n > max)
+ nn = max;
+
+ snprintf(infra->buf, sizeof(infra->buf),
+ "%s/images/g_layer/%s_%d.png", elm_app_data_dir_get(), i->name, nn);
+ elm_image_file_set(i->icon, infra->buf, NULL);
+ _icon_color_set(i, r, g, b, a);
+ }
+}
+
+/* START - Callbacks for gestures */
+static Evas_Event_Flags
+n_finger_tap_start(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+ _color_and_icon_set(data, TAP_NAME, p->n, MAX_TAP, START_COLOR);
+ printf("N tap started <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+n_finger_tap_end(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+
+ printf("N tap ended <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ _color_and_icon_set(data, TAP_NAME, p->n, MAX_TAP, END_COLOR);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+n_finger_tap_abort(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+ printf("N tap abort\n");
+ _color_and_icon_set(data, TAP_NAME, p->n, MAX_TAP, ABORT_COLOR);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+n_long_tap_start(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+ infra_data *infra = data;
+
+ printf("N long tap started <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, START_COLOR);
+ infra->long_tap_count = 0;
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+n_long_tap_move(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+ infra_data *infra = data;
+
+ infra->long_tap_count++;
+ _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, MOVE_COLOR);
+
+ printf("N long tap moved <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ if (infra->long_tap_count == 1)
+ printf("This is a first long tap.\n");
+
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+n_long_tap_end(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+
+ printf("N long tap ended <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, END_COLOR);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+n_long_tap_abort(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+ _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, ABORT_COLOR);
+ printf("N long tap abort\n");
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+dbl_click_start(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+
+ _color_and_icon_set(data,DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, START_COLOR);
+ printf("Double click started <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+dbl_click_move(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+ _color_and_icon_set(data, DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, MOVE_COLOR);
+
+ printf("Double click move <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+dbl_click_end(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+ _color_and_icon_set(data, DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, END_COLOR);
+
+ printf("Double click ended <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+dbl_click_abort(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+ _color_and_icon_set(data,DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, ABORT_COLOR);
+
+ printf("Double click abort\n");
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+triple_click_start(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+ _color_and_icon_set(data,TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, START_COLOR);
+
+ printf("Triple click started <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+triple_click_move(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+
+ _color_and_icon_set(data, TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, MOVE_COLOR);
+ printf("Triple click move <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+triple_click_end(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+
+ _color_and_icon_set(data, TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, END_COLOR);
+ printf("Triple click ended <%p> x,y=<%d,%d> count=<%d>\n",
+ event_info, p->x, p->y, p->n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+triple_click_abort(void *data , void *event_info)
+{
+ Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
+ _color_and_icon_set(data,TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, ABORT_COLOR);
+
+ printf("Triple click abort\n");
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+momentum_start(void *data , void *event_info)
+{
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, START_COLOR);
+
+ printf("momentum started x1,y1=<%d,%d> tx,ty=<%u,%u> n=<%u>\n",
+ p->x1, p->y1, p->tx, p->ty, p->n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+momentum_end(void *data , void *event_info)
+{
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, END_COLOR);
+ printf("momentum ended x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=<%u>\n",p->x1, p->y1, p->x2, p->y2, p->tx, p->ty, p->mx, p->my, p->n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+momentum_abort(void *data , void *event_info)
+{
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ printf("momentum abort\n");
+ _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, ABORT_COLOR);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+momentum_move(void *data , void *event_info)
+{
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, MOVE_COLOR);
+ printf("momentum move x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=<%u>\n", p->x1, p->y1, p->x2, p->y2, p->tx, p->ty, p->mx, p->my, p->n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+line_start(void *data , void *event_info)
+{
+ Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
+ _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, START_COLOR);
+
+ printf("line started x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+line_move(void *data , void *event_info)
+{
+ Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
+ _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, MOVE_COLOR);
+ printf("line move x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.n);
+
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+line_end(void *data , void *event_info)
+{
+ Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
+ _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, END_COLOR);
+ printf("line end x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+line_abort(void *data , void *event_info)
+{
+ Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
+ _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, ABORT_COLOR);
+ printf("line abort\n");
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+flick_start(void *data , void *event_info)
+{
+ Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
+ _color_and_icon_set(data, FLICK_NAME, p->momentum.n, MAX_FLICK, START_COLOR);
+
+ printf("flick started x1,y1=<%d,%d> tx,ty=<%u,%u> n=<%u>\n",
+ p->momentum.x1, p->momentum.y1, p->momentum.tx,
+ p->momentum.ty, p->momentum.n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+flick_end(void *data , void *event_info)
+{
+ Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
+ _color_and_icon_set(data, FLICK_NAME, p->momentum.n, MAX_FLICK, END_COLOR);
+
+ printf("flick ended x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=<%u>\n",p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.mx, p->momentum.my, p->momentum.n);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+flick_abort(void *data , void *event_info)
+{
+ Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
+ _color_and_icon_set(data, FLICK_NAME, p->momentum.n, MAX_FLICK, ABORT_COLOR);
+ printf("flick abort\n");
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+zoom_start(void *data , void *event_info)
+{
+ Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
+ _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, START_COLOR);
+ printf("zoom started <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n",
+ p->x, p->y, p->zoom, p->radius, p->momentum);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+zoom_move(void *data , void *event_info)
+{
+ Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
+ _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, MOVE_COLOR);
+ printf("zoom move <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n",
+ p->x, p->y, p->zoom, p->radius, p->momentum);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+zoom_end(void *data , void *event_info)
+{
+ Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
+ _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, END_COLOR);
+ printf("zoom end <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n",
+ p->x, p->y, p->zoom, p->radius, p->momentum);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+zoom_abort(void *data , void *event_info EINA_UNUSED)
+{
+ printf("zoom abort\n");
+ _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, ABORT_COLOR);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+rotate_start(void *data , void *event_info)
+{
+ Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
+ _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, START_COLOR);
+ printf("rotate started <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n", p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+rotate_move(void *data , void *event_info)
+{
+ Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
+ _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, MOVE_COLOR);
+ printf("rotate move <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n", p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+rotate_end(void *data , void *event_info)
+{
+ Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
+ _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, END_COLOR);
+ printf("rotate end <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n", p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum);
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+rotate_abort(void *data , void *event_info EINA_UNUSED)
+{
+ _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, ABORT_COLOR);
+ printf("rotate abort\n");
+ return EVAS_EVENT_FLAG_ON_HOLD;
+}
+/* END - Callbacks for gestures */
+
+Evas_Object *create_gesture_box(Evas_Object *win, icon_properties *icons,
+ int idx, const char *name, const char *lb_txt)
+{ /* Creates a box with icon and label, later placed in a table */
+ Evas_Object *lb, *bx = elm_box_add(win);
+ char buf[1024];
+
+ elm_box_padding_set(bx, BX_PADDING_X, BX_PADDING_Y);
+ icons[idx].icon = elm_icon_add(win);
+ icons[idx].name = name;
+ snprintf(buf, sizeof(buf), "%s/images/g_layer/%s_1.png",
+ elm_app_data_dir_get(), icons[idx].name);
+ elm_image_file_set(icons[idx].icon, buf, NULL);
+ elm_image_resizable_set(icons[idx].icon, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(icons[idx].icon, 0.5, 0.5);
+ _icon_color_set(&icons[idx], INI_R, INI_G, INI_B, INI_A);
+ elm_box_pack_end(bx, icons[idx].icon);
+ evas_object_show(icons[idx].icon);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, lb_txt);
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, 0.5, 0.5);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+ evas_object_show(bx);
+
+ return bx;
+}
+
+void
+test_gesture_layer2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *tb, *lb, *bx;
+ Evas_Object *r; /* Gesture layer transparent object */
+ Evas_Object *g; /* The Gesture Layer object */
+
+ infra_data *infra = _infra_data_alloc();
+
+ win = elm_win_util_standard_add("gesture-layer2", "Gesture Layer 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_smart_callback_add(win, "delete,request", my_win_del, infra);
+
+ /* START - Building icons table */
+ bx = elm_box_add(win);
+ tb = elm_table_add(win);
+ elm_box_pack_end(bx, tb);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, 0.5, 0.5);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(tb);
+ evas_object_show(bx);
+
+ /* Box of Tap icon and label */
+ bx = create_gesture_box(win, infra->icons, 0, TAP_NAME, "Tap");
+ elm_table_pack(tb, bx, 0, 0, 1, 1);
+
+ /* Box of Double Tap icon and label */
+ bx = create_gesture_box(win, infra->icons, 1, DOUBLE_TAP_NAME, "Double Tap");
+ elm_table_pack(tb, bx, 1, 0, 1, 1);
+
+ /* Box of Triple Tap icon and label */
+ bx = create_gesture_box(win, infra->icons, 2, TRIPLE_TAP_NAME, "Triple Tap");
+ elm_table_pack(tb, bx, 2, 0, 1, 1);
+
+ /* Box of Long Tap icon and label */
+ bx = create_gesture_box(win, infra->icons, 3, LONG_TAP_NAME, "Long Tap");
+ elm_table_pack(tb, bx, 3, 0, 1, 1);
+
+ /* Box of Momentum icon and label */
+ bx = create_gesture_box(win, infra->icons, 4, MOMENTUM_NAME, "Momentum");
+ elm_table_pack(tb, bx, 0, 2, 1, 1);
+
+ /* Box of Line icon and label */
+ bx = create_gesture_box(win, infra->icons, 5, LINE_NAME, "Line");
+ elm_table_pack(tb, bx, 1, 2, 1, 1);
+
+ /* Box of Flick icon and label */
+ bx = create_gesture_box(win, infra->icons, 6, FLICK_NAME, "Flick");
+ elm_table_pack(tb, bx, 2, 2, 1, 1);
+
+ /* Box of Zoom icon and label */
+ bx = create_gesture_box(win, infra->icons, 7, ZOOM_NAME, "Zoom");
+ elm_table_pack(tb, bx, 0, 3, 1, 1);
+
+ /* Box of Rotate icon and label */
+ bx = create_gesture_box(win, infra->icons, 8, ROTATE_NAME, "Rotate");
+ elm_table_pack(tb, bx, 1, 3, 1, 1);
+
+ /* Legend of gestures - states */
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "<b>Gesture States</b>");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, lb, 0, 6, 4, 2);
+ evas_object_show(lb);
+
+ r = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_resize(r, 64, 64);
+ evas_object_color_set(r, INI_R, INI_G, INI_B, INI_A);
+ evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, r, 0, 7, 1, 1);
+ evas_object_show(r);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Not Started");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, lb, 1, 7, 3, 1);
+ evas_object_show(lb);
+
+ r = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_resize(r, 64, 64);
+ evas_object_color_set(r, START_COLOR);
+ evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, r, 0, 8, 1, 1);
+ evas_object_show(r);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Gesture START");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, lb, 1, 8, 3, 1);
+ evas_object_show(lb);
+
+ r = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_resize(r, 64, 64);
+ evas_object_color_set(r, MOVE_COLOR);
+ evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, r, 0, 9, 1, 1);
+ evas_object_show(r);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Gesture MOVE");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, lb, 1, 9, 3, 1);
+ evas_object_show(lb);
+
+ r = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_resize(r, 64, 64);
+ evas_object_color_set(r, END_COLOR);
+ evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, r, 0, 10, 1, 1);
+ evas_object_show(r);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Gesture END");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, lb, 1, 10, 3, 1);
+ evas_object_show(lb);
+
+ r = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_resize(r, 64, 64);
+ evas_object_color_set(r, ABORT_COLOR);
+ evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, r, 0, 11, 1, 1);
+ evas_object_show(r);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Gesture ABORT");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, lb, 1, 11, 3, 1);
+
+ elm_table_padding_set(tb, TB_PADDING_X, TB_PADDING_Y);
+ evas_object_show(lb);
+ /* END - Building icons table */
+
+ /* Gesture layer transparent object */
+ r = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_move(r, 0, 0);
+ evas_object_color_set(r, 0, 0, 0, 0);
+ elm_win_resize_object_add(win, r);
+
+ g = elm_gesture_layer_add(win);
+ elm_gesture_layer_attach(g, r);
+ evas_object_show(r);
+
+ /* START - Setting gestures callbacks */
+#if 1
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
+ ELM_GESTURE_STATE_START, triple_click_start, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
+ ELM_GESTURE_STATE_MOVE, triple_click_move, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
+ ELM_GESTURE_STATE_END, triple_click_end, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
+ ELM_GESTURE_STATE_ABORT, triple_click_abort, infra);
+#endif
+
+#if 1
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
+ ELM_GESTURE_STATE_START, dbl_click_start, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
+ ELM_GESTURE_STATE_MOVE, dbl_click_move, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
+ ELM_GESTURE_STATE_END, dbl_click_end, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
+ ELM_GESTURE_STATE_ABORT, dbl_click_abort, infra);
+#endif
+
+#if 1
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
+ ELM_GESTURE_STATE_START, n_finger_tap_start, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
+ ELM_GESTURE_STATE_END, n_finger_tap_end, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
+ ELM_GESTURE_STATE_ABORT, n_finger_tap_abort, infra);
+#endif
+
+#if 1
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS,
+ ELM_GESTURE_STATE_START, n_long_tap_start, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS,
+ ELM_GESTURE_STATE_MOVE, n_long_tap_move, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS,
+ ELM_GESTURE_STATE_END, n_long_tap_end, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS,
+ ELM_GESTURE_STATE_ABORT, n_long_tap_abort, infra);
+#endif
+
+#if 1
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
+ ELM_GESTURE_STATE_START, momentum_start, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
+ ELM_GESTURE_STATE_END, momentum_end, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
+ ELM_GESTURE_STATE_ABORT, momentum_abort, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
+ ELM_GESTURE_STATE_MOVE, momentum_move, infra);
+#endif
+
+#if 1
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
+ ELM_GESTURE_STATE_START, line_start, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
+ ELM_GESTURE_STATE_MOVE, line_move, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
+ ELM_GESTURE_STATE_END, line_end, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
+ ELM_GESTURE_STATE_ABORT, line_abort, infra);
+#endif
+
+#if 1
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
+ ELM_GESTURE_STATE_START, flick_start, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
+ ELM_GESTURE_STATE_END, flick_end, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
+ ELM_GESTURE_STATE_ABORT, flick_abort, infra);
+#endif
+
+#if 1
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
+ ELM_GESTURE_STATE_START, zoom_start, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
+ ELM_GESTURE_STATE_END, zoom_end, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
+ ELM_GESTURE_STATE_ABORT, zoom_abort, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
+ ELM_GESTURE_STATE_MOVE, zoom_move, infra);
+ /* elm_gesture_layer_zoom_step_set(g, 0.2); */
+#endif
+
+#if 1
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
+ ELM_GESTURE_STATE_START, rotate_start, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
+ ELM_GESTURE_STATE_END, rotate_end, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
+ ELM_GESTURE_STATE_ABORT, rotate_abort, infra);
+ elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
+ ELM_GESTURE_STATE_MOVE, rotate_move, infra);
+ /* elm_gesture_layer_rotate_step_set(g, 5.2); */
+#endif
+ /* END - Setting gestures callbacks */
+
+ /* Update color state 20 times a second */
+ infra->colortimer = ecore_timer_add(0.05, _icon_color_set_cb, infra->icons);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_gesture_layer3.c b/src/bin/elementary/test_gesture_layer3.c
new file mode 100644
index 0000000000..9d89ca921c
--- /dev/null
+++ b/src/bin/elementary/test_gesture_layer3.c
@@ -0,0 +1,585 @@
+#ifdef HAVE_CONFIG_H
+#include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+/* We zoom out to this value so we'll be able to use map and have a nice
+ * resolution when zooming in. */
+#define BASE_ZOOM 0.8
+#define MIN_ZOOM 0.4
+/* The amount of zoom to do when "lifting" objects. */
+#define LIFT_FACTOR 1.3
+/* The base size of the shadow image. */
+#define SHADOW_W 118
+#define SHADOW_H 118
+//#define RAD2DEG(x) ((x) * 57.295779513)
+
+#define MOMENTUM_FACTOR 30
+#define MOMENTUM_FRICTION 1000
+#define ROTATE_MOMENTUM_FRICTION 30
+#define ZOOM_MOMENTUM_FRICTION 8
+
+struct _Photo_Object {
+ Evas_Object *ic, *shadow;
+ Evas_Object *hit;
+ Evas_Object *gl;
+
+ /* 3 transit object to implement momentum animation */
+ Elm_Transit *zoom_momentum;
+ Ecore_Animator *rot_timer;
+ Ecore_Animator *mom_timer;
+ double rot_tot_time;
+ double rot_progress;
+ /* bx, by - current wanted coordinates of the photo object.
+ * bw, bh - original size of the "ic" object.
+ * dx, dy - Used to indicate the distance between the center point
+ * m_dx, m_dy - momentum delta to apply with momentum transit
+ * where we put down our fingers (when started moving the item) to
+ * the coords of the object, so we'll be able to calculate movement
+ * correctly. */
+ Evas_Coord bx, by, bw, bh, dx, dy, m_dx, m_dy;
+ /* Because gesture layer only knows the amount of rotation/zoom we do
+ * per gesture, we have to keep the current rotate/zoom factor and the
+ * one that was before we started the gesture. */
+ int base_rotate, rotate; /* base - initial angle */
+ double mx, my; /* momentum on x, y */
+ double mom_x_acc, mom_y_acc;
+ double rot_momentum, zoom_mom;
+ double mom_tot_time;
+ double zoom_mom_time;
+ double base_zoom, zoom;
+ double shadow_zoom;
+};
+typedef struct _Photo_Object Photo_Object;
+
+/* This function applies the information from the Photo_Object to the actual
+ * evas objects. Zoom/rotate factors and etc. */
+static void
+apply_changes(Photo_Object *po)
+{
+ Evas_Map *map;
+
+ map = evas_map_new(4);
+ evas_map_point_coord_set(map, 0, po->bx, po->by, 0);
+ evas_map_point_coord_set(map, 1, po->bx + po->bw, po->by, 0);
+ evas_map_point_coord_set(map, 2, po->bx + po->bw, po->by + po->bh, 0);
+ evas_map_point_coord_set(map, 3, po->bx, po->by + po->bh, 0);
+ evas_map_point_image_uv_set(map, 0, 0, 0);
+ evas_map_point_image_uv_set(map, 1, po->bw, 0);
+ evas_map_point_image_uv_set(map, 2, po->bw, po->bh);
+ evas_map_point_image_uv_set(map, 3, 0, po->bh);
+ evas_map_util_rotate(map, po->rotate,
+ po->bx + po->bw / 2, po->by + po->bh /2);
+ evas_map_util_zoom(map, po->zoom, po->zoom,
+ po->bx + po->bw / 2, po->by + po->bh /2);
+ evas_object_map_enable_set(po->ic, EINA_TRUE);
+ evas_object_map_set(po->ic, map);
+
+ {
+ Evas_Map *shadow_map = evas_map_new(4);
+ evas_map_point_coord_set(shadow_map, 0, po->bx, po->by, 0);
+ evas_map_point_coord_set(shadow_map, 1, po->bx + po->bw, po->by, 0);
+ evas_map_point_coord_set(shadow_map, 2,
+ po->bx + po->bw, po->by + po->bh, 0);
+ evas_map_point_coord_set(shadow_map, 3, po->bx, po->by + po->bh, 0);
+ evas_map_point_image_uv_set(shadow_map, 0, 0, 0);
+ evas_map_point_image_uv_set(shadow_map, 1, SHADOW_W, 0);
+ evas_map_point_image_uv_set(shadow_map, 2, SHADOW_W, SHADOW_H);
+ evas_map_point_image_uv_set(shadow_map, 3, 0, SHADOW_H);
+ evas_map_util_rotate(shadow_map, po->rotate,
+ po->bx + po->bw / 2, po->by + po->bh /2);
+ evas_map_util_zoom(shadow_map, po->zoom * po->shadow_zoom,
+ po->zoom * po->shadow_zoom,
+ po->bx + (po->bw / 2), po->by + (po->bh / 2));
+ evas_object_map_enable_set(po->shadow, EINA_TRUE);
+ evas_object_map_set(po->shadow, shadow_map);
+ evas_map_free(shadow_map);
+ }
+
+ /* Update the position of the hit box */
+ {
+ Evas_Coord minx, miny, maxx, maxy;
+ int i;
+ evas_object_polygon_points_clear(po->hit);
+ evas_map_point_coord_get(map, 0, &minx, &miny, NULL);
+ maxx = minx;
+ maxy = miny;
+ evas_object_polygon_point_add(po->hit, minx, miny);
+ for (i = 1 ; i <= 3 ; i++)
+ {
+ Evas_Coord x, y;
+ evas_map_point_coord_get(map, i, &x, &y, NULL);
+ evas_object_polygon_point_add(po->hit, x, y);
+ if (x < minx)
+ minx = x;
+ else if (x > maxx)
+ maxx = x;
+
+ if (y < miny)
+ miny = y;
+ else if (y > maxy)
+ maxy = y;
+ }
+ }
+
+ evas_object_raise(po->shadow);
+ evas_object_raise(po->ic);
+ evas_object_raise(po->hit);
+ evas_map_free(map);
+}
+
+/* Zoom momentum animation */
+static void
+zoom_momentum_animation_operation(void *_po, Elm_Transit *transit EINA_UNUSED,
+ double progress)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ double time_prog = po->zoom_mom_time * progress;
+ double zoom_fric = ZOOM_MOMENTUM_FRICTION;
+
+ if (po->zoom_mom > 0)
+ zoom_fric *= -1;
+
+ /* Current = rot0 + (rotv0 * t) + (a * t^2 / 2) */
+ po->zoom = po->base_zoom +
+ ((po->zoom_mom * time_prog) +
+ (zoom_fric * (time_prog * time_prog) / 2));
+ printf("%f = %f + (%f + %f)\n", po->zoom, po->base_zoom,
+ (po->zoom_mom * time_prog),
+ (zoom_fric * (time_prog * time_prog) / 2));
+
+ if (po->zoom < MIN_ZOOM)
+ po->zoom = MIN_ZOOM;
+
+ apply_changes(po);
+}
+
+static void
+zoom_momentum_animation_end(void *_po, Elm_Transit *transit EINA_UNUSED)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ po->base_zoom = po->zoom;
+ po->zoom_momentum = NULL;
+}
+
+/* Rotate momentum animation */
+static Eina_Bool
+rotate_momentum_animation_operation(void *_po)
+{
+ Eina_Bool rc = ECORE_CALLBACK_RENEW;
+ int deg_friction = ROTATE_MOMENTUM_FRICTION;
+ Photo_Object *po = (Photo_Object *) _po;
+ po->rot_progress += ecore_animator_frametime_get();
+ if (po->rot_progress > po->rot_tot_time)
+ {
+ po->rot_timer = NULL;
+ po->rot_progress = po->rot_tot_time;
+ rc = ECORE_CALLBACK_CANCEL;
+ }
+
+ if (po->rot_momentum > 0)
+ deg_friction *= -1;
+
+ /* Current = rot0 + (rotv0 * t) + (a * t^2 / 2) */
+ po->rotate = po->base_rotate -
+ ((po->rot_momentum * po->rot_progress) +
+ (deg_friction * (po->rot_progress * po->rot_progress) / 2));
+ po->rotate = (po->rotate % 360);
+ if (po->rotate < 0)
+ po->rotate += 360;
+ printf("%d = %d - (%f + %f)\n", po->rotate, po->base_rotate,
+ (po->rot_momentum * po->rot_progress),
+ (deg_friction * (po->rot_progress * po->rot_progress) / 2));
+
+ if (rc == ECORE_CALLBACK_CANCEL)
+ {
+ po->base_rotate = po->rotate;
+ printf("%s po->rotate=<%d>\n", __func__, po->rotate);
+ }
+
+ apply_changes(po);
+ return rc;
+}
+
+static void
+pic_obj_keep_inframe(void *_po)
+{ /* Make sure middle is in the screen, if not, fix it. */
+ /* FIXME: Use actual window sizes instead of the hardcoded
+ * values */
+ Photo_Object *po = (Photo_Object *) _po;
+
+ Evas_Coord mx, my;
+ mx = po->bx + (po->bw / 2);
+ my = po->by + (po->bh / 2);
+ if (mx < 0)
+ po->bx = 0 - (po->bw / 2);
+ else if (mx > 480)
+ po->bx = 480 - (po->bw / 2);
+
+ if (my < 0)
+ po->by = 0 - (po->bw / 2);
+ else if (my > 800)
+ po->by = 800 - (po->bh / 2);
+}
+
+static Evas_Event_Flags
+rotate_start(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
+ printf("rotate start <%d,%d> po->rotate=<%d> base=<%f> p->angle=<%f>\n", p->x, p->y, po->rotate,
+ p->base_angle, p->angle);
+
+ /* If there's an active animator, stop it */
+ if (po->rot_timer)
+ {
+ po->base_rotate = po->rotate;
+ ecore_animator_del(po->rot_timer);
+ po->rot_timer = NULL;
+ }
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+rotate_move(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
+ printf("rotate move <%d,%d> base=<%f> <%f> m=<%f>\n", p->x, p->y,
+ p->base_angle, p->angle, p->momentum);
+ po->rotate = po->base_rotate + (int) (p->angle - p->base_angle);
+
+ if (po->rotate < 0)
+ po->rotate += 360;
+ apply_changes(po);
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+rotate_end(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Rotate_Info *r_info = (Elm_Gesture_Rotate_Info *) event_info;
+ printf("rotate end <%d,%d> base=<%f> <%f> m=<%f>\n", r_info->x, r_info->y,
+ r_info->base_angle, r_info->angle, r_info->momentum);
+ if (po->rotate < 0)
+ po->rotate += 360;
+
+ po->base_rotate = po->rotate;
+
+ /* Apply the rotate-momentum */
+ po->rot_tot_time = fabs(r_info->momentum) / ROTATE_MOMENTUM_FRICTION;
+ po->rot_momentum = r_info->momentum;
+ po->rot_progress = 0.0;
+ if (po->rot_momentum)
+ {
+ po->rot_timer = ecore_animator_add(rotate_momentum_animation_operation, po);
+ }
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+rotate_abort(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
+ printf("rotate abort <%d,%d> base=<%f> <%f>\n", p->x, p->y,
+ p->base_angle, p->angle);
+ po->base_rotate = po->rotate;
+ if (po->rotate < 0)
+ po->rotate += 360;
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+zoom_start(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
+ printf("zoom start <%d,%d> <%f>\n", p->x, p->y, p->zoom);
+
+ /* If there's an active animator, stop it */
+ if (po->zoom_momentum)
+ {
+ elm_transit_del(po->zoom_momentum);
+ po->zoom_momentum = NULL;
+ }
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+zoom_move(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
+ printf("zoom move <%d,%d> <%f> momentum=<%f>\n", p->x, p->y, p->zoom, p->momentum);
+ po->zoom = po->base_zoom * p->zoom;
+ apply_changes(po);
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+zoom_end(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
+ printf("zoom end/abort <%d,%d> <%f> momentum=<%f>\n", p->x, p->y,
+ p->zoom, p->momentum);
+
+ /* Apply the zoom-momentum or zoom out animator */
+ double tot_time = fabs(p->momentum) / ZOOM_MOMENTUM_FRICTION;
+ po->zoom_mom_time = tot_time;
+ po->zoom_mom = p->momentum;
+ po->base_zoom = po->zoom;
+ if (po->zoom_mom)
+ {
+ po->zoom_momentum = elm_transit_add();
+ elm_transit_duration_set(po->zoom_momentum,
+ tot_time);
+ elm_transit_effect_add(po->zoom_momentum,
+ zoom_momentum_animation_operation, po,
+ zoom_momentum_animation_end);
+ elm_transit_go(po->zoom_momentum);
+ }
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+momentum_start(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ printf("momentum_start po->rotate=<%d> <%d,%d>\n", po->rotate, p->x2, p->y2);
+
+ /* If there's an active animator, stop it */
+ if (po->mom_timer)
+ {
+ ecore_animator_del(po->mom_timer);
+ po->mom_timer = NULL;
+ }
+
+ po->dx = p->x2 - po->bx;
+ po->dy = p->y2 - po->by;
+ apply_changes(po);
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+momentum_move(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ printf("momentum move <%d,%d> fingers=<%d> mx,my=<%d,%d>\n", p->x2, p->y2, p->n, p->mx, p->my);
+
+ po->bx = p->x2 - po->dx;
+ po->by = p->y2 - po->dy;
+ apply_changes(po);
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+/* Momentum animation */
+static Eina_Bool
+momentum_animation_operation(void *_po)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Eina_Bool rc = ECORE_CALLBACK_RENEW;
+ Evas_Coord x = po->bx;
+ Evas_Coord y = po->by;
+ po->mom_tot_time -= ecore_animator_frametime_get();
+ if (po->mom_tot_time <= 0)
+ {
+ po->mom_timer = NULL;
+ rc = ECORE_CALLBACK_CANCEL;
+ }
+
+ /* x = v0t + 0.5at^2 */
+ po->bx += ((po->mx * po->mom_tot_time) +
+ (0.5 * po->mom_x_acc * (po->mom_tot_time * po->mom_tot_time)));
+
+ po->by += ((po->my * po->mom_tot_time) +
+ (0.5 * po->mom_y_acc * (po->mom_tot_time * po->mom_tot_time)));
+
+ printf("%s prev_bx-new_bx,y=(%d,%d)\n", __func__, x-po->bx, y-po->by);
+ if (rc == ECORE_CALLBACK_CANCEL)
+ pic_obj_keep_inframe(po);
+
+ apply_changes(po);
+ return rc;
+}
+
+static Evas_Event_Flags
+momentum_end(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ printf("momentum end x2,y2=<%d,%d> mx,my=<%d,%d>\n", p->x2, p->y2, p->mx, p->my);
+ pic_obj_keep_inframe(po);
+ apply_changes(po);
+ /* Make up some total-time for the movement */
+ po->mom_tot_time = sqrt((p->mx * p->mx) + (p->my * p->my))
+ / MOMENTUM_FRICTION;
+
+ if (po->mom_tot_time)
+ { /* Compute acceleration for both compenents, and launch timer */
+ po->mom_x_acc = (p->mx) / po->mom_tot_time; /* a = (v-v0) / t */
+ po->mom_y_acc = (p->my) / po->mom_tot_time; /* a = (v-v0) / t */
+ po->mom_x_acc /= MOMENTUM_FACTOR;
+ po->mom_y_acc /= MOMENTUM_FACTOR;
+ po->mom_timer = ecore_animator_add(momentum_animation_operation, po);
+ }
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+momentum_abort(void *_po, void *event_info)
+{
+ Photo_Object *po = (Photo_Object *) _po;
+ Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
+ printf("momentum abort <%d,%d> <%d,%d>\n", p->x2, p->y2, p->mx, p->my);
+ pic_obj_keep_inframe(po);
+ apply_changes(po);
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+static void
+_win_del_req(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Photo_Object **photo_array = (Photo_Object **) data;
+
+ if (!photo_array)
+ return;
+
+ /* The content of the photo object is automatically deleted when the win
+ * is deleted. */
+ for ( ; *photo_array ; photo_array++)
+ free(*photo_array);
+
+ free(data);
+}
+
+static Photo_Object *
+photo_object_add(Evas_Object *parent, Evas_Object *ic, const char *icon,
+ Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, int angle)
+{
+ char buf[PATH_MAX];
+ Photo_Object *po;
+ po = calloc(1, sizeof(*po));
+ po->base_zoom = po->zoom = BASE_ZOOM;
+
+ if (ic)
+ {
+ po->ic = ic;
+ }
+ else
+ {
+ po->ic = elm_icon_add(parent);
+ elm_image_file_set(po->ic, icon, NULL);
+ }
+
+ po->bx = x;
+ po->by = y;
+ po->bw = w;
+ po->bh = h;
+
+ /* Add shadow */
+ {
+ po->shadow = elm_icon_add(po->ic);
+ snprintf(buf, sizeof(buf), "%s/images/pol_shadow.png", elm_app_data_dir_get());
+ elm_image_file_set(po->shadow, buf, NULL);
+ evas_object_resize(po->shadow, SHADOW_W, SHADOW_H);
+ evas_object_show(po->shadow);
+ }
+
+ po->hit = evas_object_polygon_add(evas_object_evas_get(parent));
+ evas_object_precise_is_inside_set(po->hit, EINA_TRUE);
+ evas_object_repeat_events_set(po->hit, EINA_TRUE);
+ evas_object_color_set(po->hit, 0, 0, 0, 0);
+
+ evas_object_move(po->ic, 0, 0);
+ evas_object_resize(po->ic, po->bw, po->bh);
+ evas_object_show(po->ic);
+
+ evas_object_show(po->hit);
+
+ po->gl = elm_gesture_layer_add(po->ic);
+ elm_gesture_layer_hold_events_set(po->gl, EINA_TRUE);
+ elm_gesture_layer_attach(po->gl, po->hit);
+
+ /* FIXME: Add a po->rotate start so we take the first angle!!!! */
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM,
+ ELM_GESTURE_STATE_START, momentum_start, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM,
+ ELM_GESTURE_STATE_MOVE, momentum_move, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM,
+ ELM_GESTURE_STATE_END, momentum_end, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM,
+ ELM_GESTURE_STATE_ABORT, momentum_abort, po);
+
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM,
+ ELM_GESTURE_STATE_START, zoom_start, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM,
+ ELM_GESTURE_STATE_MOVE, zoom_move, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM,
+ ELM_GESTURE_STATE_END, zoom_end, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM,
+ ELM_GESTURE_STATE_ABORT, zoom_end, po);
+
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE,
+ ELM_GESTURE_STATE_START, rotate_start, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE,
+ ELM_GESTURE_STATE_MOVE, rotate_move, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE,
+ ELM_GESTURE_STATE_END, rotate_end, po);
+ elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE,
+ ELM_GESTURE_STATE_ABORT, rotate_abort, po);
+
+ po->rotate = po->base_rotate = angle;
+ po->shadow_zoom = 1.3;
+
+ apply_changes(po);
+ return po;
+}
+
+void
+test_gesture_layer3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Coord w, h;
+ Evas_Object *win, *bg;
+ char buf[PATH_MAX];
+ int ind = 0;
+ Photo_Object **photo_array;
+ photo_array = calloc(4, sizeof(*photo_array));
+
+ w = 480;
+ h = 800;
+
+ win = elm_win_add(NULL, "gesture-layer3", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Gesture Layer 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_resize(win, w, h);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/wood_01.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ snprintf(buf, sizeof(buf), "%s/images/pol_sky.png", elm_app_data_dir_get());
+ photo_array[ind++] = photo_object_add(win, NULL, buf, 50, 200, 365, 400, 0);
+
+ photo_array[ind] = NULL;
+ evas_object_smart_callback_add(win, "delete,request", _win_del_req,
+ photo_array);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_glview.c b/src/bin/elementary/test_glview.c
new file mode 100644
index 0000000000..31c76cffe3
--- /dev/null
+++ b/src/bin/elementary/test_glview.c
@@ -0,0 +1,717 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#include <Elementary.h>
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+typedef struct _Gear Gear;
+typedef struct _GLData GLData;
+struct _Gear
+{
+ GLfloat *vertices;
+ GLuint vbo;
+ int count;
+};
+
+// GL related data here..
+struct _GLData
+{
+ Evas_GL_API *glapi;
+ GLuint program;
+ GLuint vtx_shader;
+ GLuint fgmt_shader;
+ int initialized : 1;
+ int mouse_down : 1;
+
+ // Gear Stuff
+ GLfloat view_rotx;
+ GLfloat view_roty;
+ GLfloat view_rotz;
+
+ Gear *gear1;
+ Gear *gear2;
+ Gear *gear3;
+
+ GLfloat angle;
+
+ GLuint proj_location;
+ GLuint light_location;
+ GLuint color_location;
+
+ GLfloat proj[16];
+ GLfloat light[3];
+};
+
+static void gears_init(GLData *gld);
+static void free_gear(Gear *gear);
+static void gears_reshape(GLData *gld, int width, int height);
+static void render_gears(GLData *gld);
+
+//--------------------------------//
+// Gear Stuff....
+static GLfloat *
+vert(GLfloat *p, GLfloat x, GLfloat y, GLfloat z, GLfloat *n)
+{
+ p[0] = x;
+ p[1] = y;
+ p[2] = z;
+ p[3] = n[0];
+ p[4] = n[1];
+ p[5] = n[2];
+
+ return p + 6;
+}
+
+/* Draw a gear wheel. You'll probably want to call this function when
+ * building a display list since we do a lot of trig here.
+ *
+ * Input: inner_radius - radius of hole at center
+ * outer_radius - radius at center of teeth
+ * width - width of gear
+ * teeth - number of teeth
+ * tooth_depth - depth of tooth
+ */
+static Gear *
+make_gear(GLData *gld, GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+ GLint teeth, GLfloat tooth_depth)
+{
+ GLint i;
+ GLfloat r0, r1, r2;
+ GLfloat da;
+ GLfloat *v;
+ Gear *gear;
+ double s[5], c[5];
+ GLfloat normal[3];
+ const int tris_per_tooth = 20;
+ Evas_GL_API *gl = gld->glapi;
+
+ gear = (Gear*)malloc(sizeof(Gear));
+ if (gear == NULL)
+ return NULL;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0;
+ r2 = outer_radius + tooth_depth / 2.0;
+
+ da = 2.0 * M_PI / teeth / 4.0;
+
+ gear->vertices = calloc(teeth * tris_per_tooth * 3 * 6,
+ sizeof *gear->vertices);
+ s[4] = 0;
+ c[4] = 1;
+ v = gear->vertices;
+ for (i = 0; i < teeth; i++)
+ {
+ s[0] = s[4];
+ c[0] = c[4];
+ s[1] = sin(i * 2.0 * M_PI / teeth + da);
+ c[1] = cos(i * 2.0 * M_PI / teeth + da);
+ s[2] = sin(i * 2.0 * M_PI / teeth + da * 2);
+ c[2] = cos(i * 2.0 * M_PI / teeth + da * 2);
+ s[3] = sin(i * 2.0 * M_PI / teeth + da * 3);
+ c[3] = cos(i * 2.0 * M_PI / teeth + da * 3);
+ s[4] = sin(i * 2.0 * M_PI / teeth + da * 4);
+ c[4] = cos(i * 2.0 * M_PI / teeth + da * 4);
+
+ normal[0] = 0.0;
+ normal[1] = 0.0;
+ normal[2] = 1.0;
+
+ v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal);
+
+ v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal);
+ v = vert(v, r2 * c[2], r2 * s[2], width * 0.5, normal);
+ v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal);
+ v = vert(v, r1 * c[3], r1 * s[3], width * 0.5, normal);
+ v = vert(v, r0 * c[0], r0 * s[0], width * 0.5, normal);
+ v = vert(v, r1 * c[4], r1 * s[4], width * 0.5, normal);
+ v = vert(v, r0 * c[4], r0 * s[4], width * 0.5, normal);
+
+ v = vert(v, r0 * c[4], r0 * s[4], width * 0.5, normal);
+ v = vert(v, r0 * c[0], r0 * s[0], width * 0.5, normal);
+ v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal);
+ v = vert(v, r0 * c[0], r0 * s[0], -width * 0.5, normal);
+
+ normal[0] = 0.0;
+ normal[1] = 0.0;
+ normal[2] = -1.0;
+
+ v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal);
+
+ v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal);
+ v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal);
+ v = vert(v, r0 * c[0], r0 * s[0], -width * 0.5, normal);
+ v = vert(v, r1 * c[3], r1 * s[3], -width * 0.5, normal);
+ v = vert(v, r1 * c[0], r1 * s[0], -width * 0.5, normal);
+ v = vert(v, r2 * c[2], r2 * s[2], -width * 0.5, normal);
+ v = vert(v, r2 * c[1], r2 * s[1], -width * 0.5, normal);
+
+ v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal);
+
+ v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal);
+ v = vert(v, r1 * c[0], r1 * s[0], -width * 0.5, normal);
+ v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal);
+ v = vert(v, r2 * c[1], r2 * s[1], -width * 0.5, normal);
+ v = vert(v, r2 * c[2], r2 * s[2], width * 0.5, normal);
+ v = vert(v, r2 * c[2], r2 * s[2], -width * 0.5, normal);
+ v = vert(v, r1 * c[3], r1 * s[3], width * 0.5, normal);
+ v = vert(v, r1 * c[3], r1 * s[3], -width * 0.5, normal);
+ v = vert(v, r1 * c[4], r1 * s[4], width * 0.5, normal);
+ v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal);
+
+ v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal);
+ }
+
+ gear->count = (v - gear->vertices) / 6;
+
+ gl->glGenBuffers(1, &gear->vbo);
+ gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo);
+ gl->glBufferData(GL_ARRAY_BUFFER, gear->count * 6 * 4,
+ gear->vertices, GL_STATIC_DRAW);
+
+ return gear;
+}
+
+static void
+free_gear(Gear *gear)
+{
+ free(gear->vertices);
+ free(gear);
+ gear = NULL;
+}
+
+static void
+multiply(GLfloat *m, const GLfloat *n)
+{
+ GLfloat tmp[16];
+ const GLfloat *row, *column;
+ div_t d;
+ int i, j;
+
+ for (i = 0; i < 16; i++)
+ {
+ tmp[i] = 0;
+ d = div(i, 4);
+ row = n + d.quot * 4;
+ column = m + d.rem;
+ for (j = 0; j < 4; j++)
+ tmp[i] += row[j] * column[j * 4];
+ }
+ memcpy(m, &tmp, sizeof tmp);
+}
+
+static void
+rotate(GLfloat *m, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ double s, c;
+
+ s = sin(angle);
+ c = cos(angle);
+ GLfloat r[16] =
+ {
+ x * x * (1 - c) + c, y * x * (1 - c) + z * s, x * z * (1 - c) - y * s, 0,
+ x * y * (1 - c) - z * s, y * y * (1 - c) + c, y * z * (1 - c) + x * s, 0,
+ x * z * (1 - c) + y * s, y * z * (1 - c) - x * s, z * z * (1 - c) + c, 0,
+ 0, 0, 0, 1
+ };
+
+ multiply(m, r);
+}
+
+static void
+translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z)
+{
+ GLfloat t[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 };
+
+ multiply(m, t);
+}
+
+static void
+draw_gear(GLData *gld, Gear *gear, GLfloat *m,
+ GLfloat x, GLfloat y, GLfloat angle, const GLfloat *color)
+{
+ Evas_GL_API *gl = gld->glapi;
+ GLfloat tmp[16];
+
+ memcpy(tmp, m, sizeof tmp);
+ translate(tmp, x, y, 0);
+ rotate(tmp, 2 * M_PI * angle / 360.0, 0, 0, 1);
+ gl->glUniformMatrix4fv(gld->proj_location, 1, GL_FALSE, tmp);
+ gl->glUniform3fv(gld->light_location, 1, gld->light);
+ gl->glUniform4fv(gld->color_location, 1, color);
+
+ gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo);
+
+ gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
+ 6 * sizeof(GLfloat), NULL);
+ gl->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE,
+ 6 * sizeof(GLfloat), (GLfloat *) 0 + 3);
+ gl->glEnableVertexAttribArray(0);
+ gl->glEnableVertexAttribArray(1);
+ gl->glDrawArrays(GL_TRIANGLE_STRIP, 0, gear->count);
+}
+
+static void
+gears_draw(GLData *gld)
+{
+ Evas_GL_API *gl = gld->glapi;
+
+ static const GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };
+ static const GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 };
+ static const GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };
+ GLfloat m[16];
+
+ gl->glClearColor(0x25 / 255., 0x13 / 255., 0.0, 1.0);
+ gl->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ memcpy(m, gld->proj, sizeof m);
+ rotate(m, 2 * M_PI * gld->view_rotx / 360.0, 1, 0, 0);
+ rotate(m, 2 * M_PI * gld->view_roty / 360.0, 0, 1, 0);
+ rotate(m, 2 * M_PI * gld->view_rotz / 360.0, 0, 0, 1);
+
+ draw_gear(gld, gld->gear1, m, -3.0, -2.0, gld->angle, red);
+ draw_gear(gld, gld->gear2, m, 3.1, -2.0, -2 * gld->angle - 9.0, green);
+ draw_gear(gld, gld->gear3, m, -3.1, 4.2, -2 * gld->angle - 25.0, blue);
+}
+
+static void render_gears(GLData *gld)
+{
+ gears_draw(gld);
+
+ gld->angle += 2.0;
+}
+
+/* new window size or exposure */
+static void
+gears_reshape(GLData *gld, int width, int height)
+{
+ Evas_GL_API *gl = gld->glapi;
+
+ GLfloat ar, m[16] = {
+ 1.0, 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0, 0.0,
+ 0.0, 0.0, 0.1, 0.0,
+ 0.0, 0.0, 0.0, 1.0
+ };
+
+ if (width < height)
+ ar = width;
+ else
+ ar = height;
+
+ m[0] = 0.1 * ar / width;
+ m[5] = 0.1 * ar / height;
+ memcpy(gld->proj, m, sizeof gld->proj);
+ gl->glViewport(0, 0, (GLint) width, (GLint) height);
+}
+
+static const char vertex_shader[] =
+ "uniform mat4 proj;\n"
+ "attribute vec4 position;\n"
+ "attribute vec4 normal;\n"
+ "varying vec3 rotated_normal;\n"
+ "varying vec3 rotated_position;\n"
+ "vec4 tmp;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = proj * position;\n"
+ " rotated_position = gl_Position.xyz;\n"
+ " tmp = proj * normal;\n"
+ " rotated_normal = tmp.xyz;\n"
+ "}\n";
+
+ static const char fragment_shader[] =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "uniform vec4 color;\n"
+ "uniform vec3 light;\n"
+ "varying vec3 rotated_normal;\n"
+ "varying vec3 rotated_position;\n"
+ "vec3 light_direction;\n"
+ "vec4 white = vec4(0.5, 0.5, 0.5, 1.0);\n"
+ "void main()\n"
+ "{\n"
+ " light_direction = normalize(light - rotated_position);\n"
+ " gl_FragColor = color + white * dot(light_direction, rotated_normal);\n"
+ "}\n";
+
+static void
+_print_gl_log(Evas_GL_API *gl, GLuint id)
+{
+ GLint log_len = 0;
+ char *log_info;
+
+ if (gl->glIsShader(id))
+ gl->glGetShaderiv(id, GL_INFO_LOG_LENGTH, &log_len);
+ else if (gl->glIsProgram(id))
+ gl->glGetProgramiv(id, GL_INFO_LOG_LENGTH, &log_len);
+
+ log_info = malloc(log_len * sizeof(char));
+
+ if (gl->glIsShader(id))
+ gl->glGetShaderInfoLog(id, log_len, NULL, log_info);
+ else if (gl->glIsProgram(id))
+ gl->glGetProgramInfoLog(id, log_len, NULL, log_info);
+
+ printf("%s", log_info);
+ free(log_info);
+}
+
+static void
+gears_init(GLData *gld)
+{
+ Evas_GL_API *gl = gld->glapi;
+
+ const char *p;
+
+ gl->glEnable(GL_CULL_FACE);
+ gl->glEnable(GL_DEPTH_TEST);
+
+ p = vertex_shader;
+ gld->vtx_shader = gl->glCreateShader(GL_VERTEX_SHADER);
+ gl->glShaderSource(gld->vtx_shader, 1, &p, NULL);
+ gl->glCompileShader(gld->vtx_shader);
+ _print_gl_log(gl, gld->vtx_shader);
+
+ p = fragment_shader;
+ gld->fgmt_shader = gl->glCreateShader(GL_FRAGMENT_SHADER);
+ gl->glShaderSource(gld->fgmt_shader, 1, &p, NULL);
+ gl->glCompileShader(gld->fgmt_shader);
+ _print_gl_log(gl, gld->fgmt_shader);
+
+ gld->program = gl->glCreateProgram();
+ gl->glAttachShader(gld->program, gld->vtx_shader);
+ gl->glAttachShader(gld->program, gld->fgmt_shader);
+ gl->glBindAttribLocation(gld->program, 0, "position");
+ gl->glBindAttribLocation(gld->program, 1, "normal");
+
+ gl->glLinkProgram(gld->program);
+ _print_gl_log(gl, gld->program);
+
+ gl->glUseProgram(gld->program);
+ gld->proj_location = gl->glGetUniformLocation(gld->program, "proj");
+ gld->light_location = gl->glGetUniformLocation(gld->program, "light");
+ gld->color_location = gl->glGetUniformLocation(gld->program, "color");
+
+ /* make the gears */
+ gld->gear1 = make_gear(gld, 1.0, 4.0, 1.0, 20, 0.7);
+ gld->gear2 = make_gear(gld, 0.5, 2.0, 2.0, 10, 0.7);
+ gld->gear3 = make_gear(gld, 1.3, 2.0, 0.5, 10, 0.7);
+}
+
+static void
+gldata_init(GLData *gld)
+{
+ gld->initialized = 0;
+ gld->mouse_down = 0;
+
+ gld->view_rotx = -20.0;
+ gld->view_roty = -30.0;
+ gld->view_rotz = 0.0;
+ gld->angle = 0.0;
+
+ gld->light[0] = 1.0;
+ gld->light[1] = 1.0;
+ gld->light[2] = -5.0;
+}
+
+//-------------------------//
+
+static void
+_init_gl(Evas_Object *obj)
+{
+ GLData *gld = evas_object_data_get(obj, "gld");
+
+ gears_init(gld);
+}
+
+static void
+_del_gl(Evas_Object *obj)
+{
+ GLData *gld = evas_object_data_get(obj, "gld");
+ if (!gld)
+ {
+ printf("Unable to get GLData. \n");
+ return;
+ }
+ Evas_GL_API *gl = gld->glapi;
+
+ gl->glDeleteShader(gld->vtx_shader);
+ gl->glDeleteShader(gld->fgmt_shader);
+ gl->glDeleteProgram(gld->program);
+ gl->glDeleteBuffers(1, &gld->gear1->vbo);
+ gl->glDeleteBuffers(1, &gld->gear2->vbo);
+ gl->glDeleteBuffers(1, &gld->gear3->vbo);
+
+ free_gear(gld->gear1);
+ free_gear(gld->gear2);
+ free_gear(gld->gear3);
+
+ evas_object_data_del((Evas_Object*)obj, "..gld");
+ free(gld);
+}
+
+static void
+_resize_gl(Evas_Object *obj)
+{
+ int w, h;
+ GLData *gld = evas_object_data_get(obj, "gld");
+
+ elm_glview_size_get(obj, &w, &h);
+
+ // GL Viewport stuff. you can avoid doing this if viewport is all the
+ // same as last frame if you want
+ gears_reshape(gld, w,h);
+}
+
+static void
+_draw_gl(Evas_Object *obj)
+{
+ Evas_GL_API *gl = elm_glview_gl_api_get(obj);
+ GLData *gld = evas_object_data_get(obj, "gld");
+ if (!gld) return;
+
+ render_gears(gld);
+ gl->glFinish();
+}
+
+static Eina_Bool
+_anim(void *data)
+{
+ elm_glview_changed_set(data);
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_quit_idler(void *data)
+{
+ evas_object_del(data);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_on_done(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_idler_add(_quit_idler, data);
+}
+
+static void
+_on_direct(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ if (!data) return;
+
+ // ON_DEMAND is necessary for Direct Rendering
+ elm_glview_render_policy_set(data, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND);
+ elm_glview_mode_set(data, 0
+ | ELM_GLVIEW_ALPHA
+ | ELM_GLVIEW_DEPTH
+ | ELM_GLVIEW_DIRECT
+ );
+}
+
+static void
+_on_indirect(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ if (!data) return;
+
+ // note that with policy ALWAYS the window will flicker on resize
+ elm_glview_render_policy_set(data, ELM_GLVIEW_RENDER_POLICY_ALWAYS);
+ elm_glview_mode_set(data, 0
+ | ELM_GLVIEW_ALPHA
+ | ELM_GLVIEW_DEPTH
+ );
+}
+
+static void
+_del(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Ecore_Animator *ani = evas_object_data_get(obj, "ani");
+ ecore_animator_del(ani);
+}
+
+static void
+_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Key_Down *ev;
+ ev = (Evas_Event_Key_Down *)event_info;
+ GLData *gld = evas_object_data_get(obj, "gld");
+
+ if (strcmp(ev->key, "Left") == 0)
+ {
+ gld->view_roty += 5.0;
+ return;
+ }
+
+ if (strcmp(ev->key, "Right") == 0)
+ {
+ gld->view_roty -= 5.0;
+ return;
+ }
+
+ if (strcmp(ev->key, "Up") == 0)
+ {
+ gld->view_rotx += 5.0;
+ return;
+ }
+
+ if (strcmp(ev->key, "Down") == 0)
+ {
+ gld->view_rotx -= 5.0;
+ return;
+ }
+ if ((strcmp(ev->key, "Escape") == 0) ||
+ (strcmp(ev->key, "Return") == 0))
+ {
+ //_on_done(data, obj, event_info);
+ return;
+ }
+}
+
+static void
+_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ GLData *gld = evas_object_data_get(obj, "gld");
+ gld->mouse_down = 1;
+}
+
+static void
+_mouse_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Event_Mouse_Move *ev;
+ ev = (Evas_Event_Mouse_Move *)event_info;
+ GLData *gld = evas_object_data_get(obj, "gld");
+ float dx = 0, dy = 0;
+
+ if (gld->mouse_down)
+ {
+ dx = ev->cur.canvas.x - ev->prev.canvas.x;
+ dy = ev->cur.canvas.y - ev->prev.canvas.y;
+
+ gld->view_roty += -1.0 * dx;
+ gld->view_rotx += -1.0 * dy;
+ }
+}
+
+static void
+_mouse_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ GLData *gld = evas_object_data_get(obj, "gld");
+ gld->mouse_down = 0;
+}
+
+void
+test_glview(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt, *gl, *lb;
+ Ecore_Animator *ani;
+ GLData *gld = NULL;
+ const char *accel;
+
+ // alloc a data struct to hold our relevant gl info in
+ if (!(gld = calloc(1, sizeof(GLData)))) return;
+ gldata_init(gld);
+
+ // add a Z-depth buffer to the window and try to use GL
+ accel = eina_stringshare_add(elm_config_accel_preference_get());
+ elm_config_accel_preference_set("gl:depth");
+
+ // new window - do the usual and give it a name, title and delete handler
+ win = elm_win_util_standard_add("glview", "GLView");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ // restore previous accel preference
+ elm_config_accel_preference_set(accel);
+ eina_stringshare_del(accel);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ // Add a GLView
+ gl = elm_glview_add(win);
+ if (gl)
+ {
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_glview_mode_set(gl, 0
+ | ELM_GLVIEW_ALPHA
+ | ELM_GLVIEW_DEPTH
+ );
+ elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE);
+ elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ALWAYS);
+ elm_glview_init_func_set(gl, _init_gl);
+ elm_glview_del_func_set(gl, _del_gl);
+ elm_glview_resize_func_set(gl, _resize_gl);
+ elm_glview_render_func_set(gl, _draw_gl);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(gl);
+
+ // Add Mouse/Key Event Callbacks
+ elm_object_focus_set(gl, EINA_TRUE);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _key_down, gl);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, gl);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_UP, _mouse_up, gl);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, gl);
+
+ // Animator and other vars
+ ani = ecore_animator_add(_anim, gl);
+ gld->glapi = elm_glview_gl_api_get(gl);
+ evas_object_data_set(gl, "ani", ani);
+ evas_object_data_set(gl, "gld", gld);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _del, gl);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Direct Mode");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", _on_direct, gl);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Indirect Mode");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", _on_indirect, gl);
+ }
+ else
+ {
+ lb = elm_label_add(bx);
+ elm_object_text_set(lb, "<align=left> GL backend engine is not supported.<br/>"
+ " 1. Check your back-end engine or<br/>"
+ " 2. Run elementary_test with engine option or<br/>"
+ " ex) $ <b>ELM_ENGINE=gl</b> elementary_test<br/>"
+ " 3. Change your back-end engine from elementary_config.<br/></align>");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+ free(gld);
+ }
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", _on_done, win);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_glview_manygears.c b/src/bin/elementary/test_glview_manygears.c
new file mode 100644
index 0000000000..34627a510f
--- /dev/null
+++ b/src/bin/elementary/test_glview_manygears.c
@@ -0,0 +1,951 @@
+/*
+ * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Ported to GLES2.
+ * Kristian Høgsberg <krh@bitplanet.net>
+ * May 3, 2010
+ *
+ * Improve GLES2 port:
+ * * Refactor gear drawing.
+ * * Use correct normals for surfaces.
+ * * Improve shader.
+ * * Use perspective projection transformation.
+ * * Add FPS count.
+ * * Add comments.
+ * Alexandros Frantzis <alexandros.frantzis@linaro.org>
+ * Jul 13, 2010
+ *
+ * Ported to Elm_GLView and added features for testing purposes:
+ * * Has 5 gears
+ * * Number of teeth can be increased to test under many vertices
+ * * Up/Down button increases the teeth number
+ * Sung W. Park <sungwoo@gmail.com>
+ * (Some positioning and numbers taken from KHCho's example)
+ * Oct 27, 2011
+ *
+ */
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+#define STRIPS_PER_TOOTH 7
+#define VERTICES_PER_TOOTH 34
+#define GEAR_VERTEX_STRIDE 6
+
+/* A set of macros for making the creation of the gears easier */
+#define GEAR_POINT(r, da) { (r) * c[(da)], (r) * s[(da)] }
+#define SET_NORMAL(x, y, z) do { \
+ normal[0] = (x); normal[1] = (y); normal[2] = (z); \
+} while(0);
+
+#define GEAR_VERT(v, point, sign) vert((v), p[(point)].x, p[(point)].y, \
+ (sign) * width * 0.5, normal);
+
+#define START_STRIP do { \
+ gear->strips[cur_strip].first = v - gear->vertices; \
+} while(0);
+
+#define END_STRIP do { \
+ int _tmp = (v - gear->vertices); \
+ gear->strips[cur_strip].count = _tmp - gear->strips[cur_strip].first; \
+ cur_strip++; \
+} while (0);
+
+#define QUAD_WITH_NORMAL(p1, p2) do { \
+ SET_NORMAL((p[(p1)].y - p[(p2)].y), -(p[(p1)].x - p[(p2)].x), 0); \
+ v = GEAR_VERT(v, (p1), -1); \
+ v = GEAR_VERT(v, (p1), 1); \
+ v = GEAR_VERT(v, (p2), -1); \
+ v = GEAR_VERT(v, (p2), 1); \
+} while(0);
+
+// Struct describing a point
+typedef struct _Point
+{
+ GLfloat x;
+ GLfloat y;
+} Point;
+
+// Struct describing the vertices in triangle strip
+typedef struct _VertexStrip
+{
+ GLint first;
+ GLint count;
+} VertexStrip;
+
+// Each vertex consist of GEAR_VERTEX_STRIDE GLfloat attributes
+typedef GLfloat GearVertex[GEAR_VERTEX_STRIDE];
+
+// Struct representing a gear.
+typedef struct _Gear
+{
+ GearVertex *vertices;
+ int nvertices;
+ VertexStrip *strips;
+ int nstrips;
+ GLuint vbo;
+} Gear;
+
+// GL related data here..
+typedef struct _GLData
+{
+ Evas_GL_API *glapi;
+ GLuint program;
+ GLuint vtx_shader;
+ GLuint fgmt_shader;
+ int initialized : 1;
+ int mouse_down : 1;
+
+ // Gear Stuff
+ Gear *gear[6];
+ GLfloat view_rot[3];
+ GLfloat light_pos[4];
+ GLfloat proj_mat[16];
+
+ GLfloat angle;
+
+ GLuint mvp_loc; // ModelViewPorjection Matrix Loc
+ GLuint norm_mat_loc;
+ GLuint light_pos_loc;
+ GLuint material_loc;
+
+ GLuint gear_teeth;
+ GLuint tot_vertices;
+
+ int recreate_gears;
+} GLData;
+
+static void gears_init(GLData *gld);
+static void create_gears(GLData *gld);
+static void render_gears(GLData *gld);
+static void gears_reshape(GLData *gld, int width, int height);
+
+//--------------------------------//
+// Fills a gear vertex.
+static GearVertex *
+vert(GearVertex *v, GLfloat x, GLfloat y, GLfloat z, GLfloat n[3])
+{
+ v[0][0] = x;
+ v[0][1] = y;
+ v[0][2] = z;
+ v[0][3] = n[0];
+ v[0][4] = n[1];
+ v[0][5] = n[2];
+
+ return v + 1;
+}
+
+// Create a gear wheel.
+static Gear *
+create_gear(GLData *gld, GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+ GLint teeth, GLfloat tooth_depth)
+{
+ GLfloat r0, r1, r2;
+ GLfloat da;
+ Gear *gear;
+ GearVertex *v;
+ double s[5], c[5];
+ GLfloat normal[3];
+ int cur_strip = 0;
+ int i;
+ Evas_GL_API *gl = gld->glapi;
+
+ gear = (Gear*)malloc(sizeof(Gear));
+ if (gear == NULL)
+ return NULL;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0;
+ r2 = outer_radius + tooth_depth / 2.0;
+
+ da = 2.0 * M_PI / teeth / 4.0;
+
+ // Allocate memory for the triangle strip information
+ gear->nstrips = STRIPS_PER_TOOTH * teeth;
+ gear->strips = calloc(gear->nstrips, sizeof (*gear->strips));
+
+ // Allocate memory for the vertices
+ gear->vertices = calloc(VERTICES_PER_TOOTH * teeth,
+ sizeof(*gear->vertices));
+
+ v = gear->vertices;
+ for (i = 0; i < teeth; i++)
+ {
+ // Calculate needed sin/cos for varius angles
+ s[0] = sin(i * 2.0 * M_PI / teeth);
+ c[0] = cos(i * 2.0 * M_PI / teeth);
+ s[1] = sin(i * 2.0 * M_PI / teeth + da);
+ c[1] = cos(i * 2.0 * M_PI / teeth + da);
+ s[2] = sin(i * 2.0 * M_PI / teeth + da * 2);
+ c[2] = cos(i * 2.0 * M_PI / teeth + da * 2);
+ s[3] = sin(i * 2.0 * M_PI / teeth + da * 3);
+ c[3] = cos(i * 2.0 * M_PI / teeth + da * 3);
+ s[4] = sin(i * 2.0 * M_PI / teeth + da * 4);
+ c[4] = cos(i * 2.0 * M_PI / teeth + da * 4);
+
+ // Create the 7 points (only x,y coords) used to draw a tooth
+ Point p[7] =
+ {
+ GEAR_POINT(r2, 1), // 0
+ GEAR_POINT(r2, 2), // 1
+ GEAR_POINT(r1, 0), // 2
+ GEAR_POINT(r1, 3), // 3
+ GEAR_POINT(r0, 0), // 4
+ GEAR_POINT(r1, 4), // 5
+ GEAR_POINT(r0, 4), // 6
+ };
+
+ // Front face
+ START_STRIP;
+ SET_NORMAL(0, 0, 1.0);
+ v = GEAR_VERT(v, 0, +1);
+ v = GEAR_VERT(v, 1, +1);
+ v = GEAR_VERT(v, 2, +1);
+ v = GEAR_VERT(v, 3, +1);
+ v = GEAR_VERT(v, 4, +1);
+ v = GEAR_VERT(v, 5, +1);
+ v = GEAR_VERT(v, 6, +1);
+ END_STRIP;
+
+ // Inner face
+ START_STRIP;
+ QUAD_WITH_NORMAL(4, 6);
+ END_STRIP;
+
+ // Back face
+ START_STRIP;
+ SET_NORMAL(0, 0, -1.0);
+ v = GEAR_VERT(v, 6, -1);
+ v = GEAR_VERT(v, 5, -1);
+ v = GEAR_VERT(v, 4, -1);
+ v = GEAR_VERT(v, 3, -1);
+ v = GEAR_VERT(v, 2, -1);
+ v = GEAR_VERT(v, 1, -1);
+ v = GEAR_VERT(v, 0, -1);
+ END_STRIP;
+
+ // Outer face
+ START_STRIP;
+ QUAD_WITH_NORMAL(0, 2);
+ END_STRIP;
+
+ START_STRIP;
+ QUAD_WITH_NORMAL(1, 0);
+ END_STRIP;
+
+ START_STRIP;
+ QUAD_WITH_NORMAL(3, 1);
+ END_STRIP;
+
+ START_STRIP;
+ QUAD_WITH_NORMAL(5, 3);
+ END_STRIP;
+ }
+
+ gear->nvertices = (v - gear->vertices);
+
+ // Store the vertices in a vertex buffer object (VBO)
+ gl->glGenBuffers(1, &gear->vbo);
+ gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo);
+ gl->glBufferData(GL_ARRAY_BUFFER, gear->nvertices * sizeof(GearVertex),
+ gear->vertices, GL_STATIC_DRAW);
+
+ return gear;
+}
+
+static void
+free_gear(GLData *gld, Gear *gear)
+{
+ Evas_GL_API *gl = gld->glapi;
+
+ gl->glDeleteBuffers(1, &gear->vbo);
+ free(gear->strips);
+ free(gear->vertices);
+ free(gear);
+}
+
+
+static void
+multiply(GLfloat *m, const GLfloat *n)
+{
+ GLfloat tmp[16];
+ const GLfloat *row, *column;
+ div_t d;
+ int i, j;
+
+ for (i = 0; i < 16; i++)
+ {
+ tmp[i] = 0;
+ d = div(i, 4);
+ row = n + d.quot * 4;
+ column = m + d.rem;
+ for (j = 0; j < 4; j++)
+ tmp[i] += row[j] * column[j * 4];
+ }
+ memcpy(m, &tmp, sizeof tmp);
+}
+
+static void
+rotate(GLfloat *m, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ double s, c;
+
+ s = sin(angle);
+ c = cos(angle);
+ GLfloat r[16] =
+ {
+ x * x * (1 - c) + c, y * x * (1 - c) + z * s, x * z * (1 - c) - y * s, 0,
+ x * y * (1 - c) - z * s, y * y * (1 - c) + c, y * z * (1 - c) + x * s, 0,
+ x * z * (1 - c) + y * s, y * z * (1 - c) - x * s, z * z * (1 - c) + c, 0,
+ 0, 0, 0, 1
+ };
+
+ multiply(m, r);
+}
+
+static void
+translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z)
+{
+ GLfloat t[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 };
+
+ multiply(m, t);
+}
+
+static void
+identity(GLfloat *m)
+{
+ GLfloat t[16] =
+ {
+ 1.0, 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0,
+ };
+
+ memcpy(m, t, sizeof(t));
+}
+
+// Transposes a 4x4 matrix.
+static void
+transpose(GLfloat *m)
+{
+ GLfloat t[16] =
+ {
+ m[0], m[4], m[8], m[12],
+ m[1], m[5], m[9], m[13],
+ m[2], m[6], m[10], m[14],
+ m[3], m[7], m[11], m[15]
+ };
+
+ memcpy(m, t, sizeof(t));
+}
+
+/*
+ Inverts a 4x4 matrix.
+
+ This function can currently handle only pure translation-rotation matrices.
+ Read http://www.gamedev.net/community/forums/topic.asp?topic_id=425118
+ for an explanation.
+ */
+static void
+invert(GLfloat *m)
+{
+ GLfloat t[16];
+ identity(t);
+
+ // Extract and invert the translation part 't'. The inverse of a
+ // translation matrix can be calculated by negating the translation
+ // coordinates.
+ t[12] = -m[12]; t[13] = -m[13]; t[14] = -m[14];
+
+ // Invert the rotation part 'r'. The inverse of a rotation matrix is
+ // equal to its transpose.
+ m[12] = m[13] = m[14] = 0;
+ transpose(m);
+
+ // inv(m) = inv(r) * inv(t)
+ multiply(m, t);
+}
+
+// Calculate a perspective projection transformation.
+static void
+perspective(GLfloat *m, GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar)
+{
+ GLfloat tmp[16];
+ identity(tmp);
+
+ double sine, cosine, cotangent, deltaZ;
+ GLfloat radians = fovy / 2 * M_PI / 180;
+
+ deltaZ = zFar - zNear;
+ sine = sin(radians);
+ cosine = cos(radians);
+
+ if ((deltaZ == 0) || (sine == 0) || (aspect == 0))
+ return;
+
+ cotangent = cosine / sine;
+
+ tmp[0] = cotangent / aspect;
+ tmp[5] = cotangent;
+ tmp[10] = -(zFar + zNear) / deltaZ;
+ tmp[11] = -1;
+ tmp[14] = -2 * zNear * zFar / deltaZ;
+ tmp[15] = 0;
+
+ memcpy(m, tmp, sizeof(tmp));
+}
+
+// Draws a gear
+static void
+draw_gear(GLData *gld, Gear *gear, GLfloat *transform,
+ GLfloat tx, GLfloat ty, GLfloat tz,
+ GLfloat angle, int rotate_gear, const GLfloat color[4])
+{
+ Evas_GL_API *gl = gld->glapi;
+ GLfloat model_view[16];
+ GLfloat normal_matrix[16];
+ GLfloat model_view_projection[16];
+ int i;
+
+ // Translate and rotate the gear
+ memcpy(model_view, transform, sizeof (model_view));
+ translate(model_view, tx, ty, tz);
+ if (rotate_gear)
+ rotate(model_view, 2 * M_PI * 90.0 / 360.0, 0, 1, 0);
+ rotate(model_view, 2 * M_PI * angle / 360.0, 0, 0, 1);
+
+ // Create and set the ModelViewProjectionMatrix
+ memcpy(model_view_projection, gld->proj_mat, sizeof(model_view_projection));
+ multiply(model_view_projection, model_view);
+
+ gl->glUniformMatrix4fv(gld->mvp_loc, 1, GL_FALSE,
+ model_view_projection);
+
+ // Create/set normal matrix: inverse transpose of the mvp
+ memcpy(normal_matrix, model_view, sizeof (normal_matrix));
+ invert(normal_matrix);
+ transpose(normal_matrix);
+
+ gl->glUniformMatrix4fv(gld->norm_mat_loc, 1, GL_FALSE, normal_matrix);
+
+ // Set the gear color
+ gl->glUniform4fv(gld->material_loc, 1, color);
+
+ // Set the vertex buffer object to use
+ gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo);
+
+ // Set up the position of the attributes in the vertex buffer object
+ gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), NULL);
+ gl->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLfloat *) 0 + 3);
+
+ // Enable the attributes
+ gl->glEnableVertexAttribArray(0);
+ gl->glEnableVertexAttribArray(1);
+
+ // Draw the triangle strips that comprise the gear
+ for (i = 0; i < gear->nstrips; i++)
+ {
+ gl->glDrawArrays(GL_TRIANGLE_STRIP, gear->strips[i].first, gear->strips[i].count);
+ }
+
+
+ // Disable the attributes
+ gl->glDisableVertexAttribArray(1);
+ gl->glDisableVertexAttribArray(0);
+}
+
+static void
+gears_draw(GLData *gld)
+{
+ Evas_GL_API *gl = gld->glapi;
+
+ static const GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };
+ static const GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 };
+ static const GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };
+ static const GLfloat yellow[4] = { 1.0, 1.0, 0.2, 1.0 };
+ static const GLfloat purple[4] = { 0.2, 1.0, 1.0, 1.0 };
+ static const GLfloat cyan[4] = { 1.0, 0.2, 1.0, 1.0 };
+ GLfloat transform[16];
+ identity(transform);
+
+ gl->glClearColor(0.0, 0.0, 0.0, 0.0);
+ gl->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ // Translate and rotate the view
+ translate(transform, 0, -2.5, -20);
+ rotate(transform, 2 * M_PI * gld->view_rot[0] / 360.0, 1, 0, 0);
+ rotate(transform, 2 * M_PI * gld->view_rot[1] / 360.0, 0, 1, 0);
+ rotate(transform, 2 * M_PI * gld->view_rot[2] / 360.0, 0, 0, 1);
+
+ draw_gear(gld, gld->gear[0], transform, -2.0, -4.0, 0.0, gld->angle , 0, red);
+ draw_gear(gld, gld->gear[1], transform, 4.1, -4.0, 0.0, -2 * gld->angle - 9.0 , 0, green);
+ draw_gear(gld, gld->gear[2], transform, -2.1, 2.2, 0.0, -2 * gld->angle - 25.0, 0, blue);
+ draw_gear(gld, gld->gear[3], transform, -2.1, 8.4, 0.0, gld->angle , 0, yellow);
+ draw_gear(gld, gld->gear[4], transform, 6.4, -4.0, -4.5, gld->angle , 1, purple);
+ draw_gear(gld, gld->gear[5], transform, 6.4, 4.4, -4.5, -1 * gld->angle - 23.0, 1, cyan);
+}
+
+//-------------------------//
+
+static void render_gears(GLData *gld)
+{
+ if (gld->recreate_gears)
+ {
+ create_gears(gld);
+ gld->recreate_gears = 0;
+ }
+
+ gears_draw(gld);
+
+ gld->angle += 2.0;
+}
+
+// new window size or exposure
+static void
+gears_reshape(GLData *gld, int width, int height)
+{
+ Evas_GL_API *gl = gld->glapi;
+
+ // Update the projection matrix
+ perspective(gld->proj_mat, 60.0, width / (float)height, 1.0, 1024.0);
+
+ // Set the viewport
+ gl->glViewport(0, 0, (GLint) width, (GLint) height);
+
+}
+
+static const char vertex_shader[] =
+ "attribute vec3 position;\n"
+ "attribute vec3 normal;\n"
+ "uniform mat4 mvp;\n"
+ "uniform mat4 norm_mat;\n"
+ "uniform vec4 light_pos;\n"
+ "uniform vec4 material;\n"
+ "varying vec4 color;\n"
+ "\n"
+ "void main(void)\n"
+ "{\n"
+ " // Transform the normal to eye coordinates\n"
+ " vec3 N = normalize(vec3(norm_mat * vec4(normal, 1.0)));\n"
+ "\n"
+ " // The LightSourcePosition is actually its direction for directional ight\n"
+ " vec3 L = normalize(light_pos.xyz);\n"
+ "\n"
+ " // Multiply the diffuse value by the vertex color (which is fixed in this ase)\n"
+ " // to get the actual color that we will use to draw this vertex with\n"
+ " float diffuse = clamp(dot(N, L), 0.0, 1.0);\n"
+ " color = material*0.2 + diffuse * material;\n"
+ " color.a = 1.0; \n"
+ "\n"
+ " // Transform the position to clip coordinates\n"
+ " gl_Position = mvp * vec4(position, 1.0);\n"
+ "}";
+
+static const char fragment_shader[] =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "varying vec4 color;\n"
+ "\n"
+ "void main(void)\n"
+ "{\n"
+ " gl_FragColor = color;\n"
+ "}";
+
+static void
+create_gears(GLData *gld)
+{
+ int i;
+
+ for (i = 0; i < 6; i++)
+ if (gld->gear[i]) free_gear(gld, gld->gear[i]);
+
+ // make the gears
+ gld->gear[0] = create_gear(gld, 1.0, 4.0, 1.0, gld->gear_teeth*2, 0.7);
+ gld->gear[1] = create_gear(gld, 0.5, 2.0, 2.0, gld->gear_teeth , 0.7);
+ gld->gear[2] = create_gear(gld, 1.3, 2.0, 0.5, gld->gear_teeth , 0.7);
+ gld->gear[3] = create_gear(gld, 2.0, 4.0, 2.0, gld->gear_teeth*2, 0.7);
+ gld->gear[4] = create_gear(gld, 1.5, 4.0, 0.5, gld->gear_teeth*2, 1.0);
+ gld->gear[5] = create_gear(gld, 2.5, 4.0, 2.5, gld->gear_teeth*2, 1.0);
+
+ gld->tot_vertices = 0;
+ for (i = 0; i < 6; i++)
+ gld->tot_vertices += gld->gear[i]->nvertices;
+
+ //printf("Teeth: %d, Total Number of vertices %d\n", gld->gear_teeth, gld->tot_vertices);
+}
+
+static void
+gears_init(GLData *gld)
+{
+ Evas_GL_API *gl = gld->glapi;
+
+ const char *p;
+ char msg[512];
+
+ gl->glEnable(GL_CULL_FACE);
+ gl->glEnable(GL_DEPTH_TEST);
+
+ p = vertex_shader;
+ gld->vtx_shader = gl->glCreateShader(GL_VERTEX_SHADER);
+ gl->glShaderSource(gld->vtx_shader, 1, &p, NULL);
+ gl->glCompileShader(gld->vtx_shader);
+ gl->glGetShaderInfoLog(gld->vtx_shader, sizeof msg, NULL, msg);
+ printf("vertex shader info: %s\n", msg);
+
+ p = fragment_shader;
+ gld->fgmt_shader = gl->glCreateShader(GL_FRAGMENT_SHADER);
+ gl->glShaderSource(gld->fgmt_shader, 1, &p, NULL);
+ gl->glCompileShader(gld->fgmt_shader);
+ gl->glGetShaderInfoLog(gld->fgmt_shader, sizeof msg, NULL, msg);
+ printf("fragment shader info: %s\n", msg);
+
+ gld->program = gl->glCreateProgram();
+ gl->glAttachShader(gld->program, gld->vtx_shader);
+ gl->glAttachShader(gld->program, gld->fgmt_shader);
+ gl->glBindAttribLocation(gld->program, 0, "position");
+ gl->glBindAttribLocation(gld->program, 1, "normal");
+
+ gl->glLinkProgram(gld->program);
+ gl->glGetProgramInfoLog(gld->program, sizeof msg, NULL, msg);
+ printf("info: %s\n", msg);
+
+ gl->glUseProgram(gld->program);
+ gld->mvp_loc = gl->glGetUniformLocation(gld->program, "mvp");
+ gld->norm_mat_loc = gl->glGetUniformLocation(gld->program, "norm_mat");
+ gld->light_pos_loc = gl->glGetUniformLocation(gld->program, "light_pos");
+ gld->material_loc = gl->glGetUniformLocation(gld->program, "material");
+ gl->glUniform4fv(gld->light_pos_loc, 1, gld->light_pos);
+
+ create_gears(gld);
+}
+
+static void
+gldata_init(GLData *gld)
+{
+ gld->initialized = 0;
+ gld->mouse_down = 0;
+
+ gld->view_rot[0] = 20.0;
+ gld->view_rot[1] = 30.0;
+ gld->view_rot[2] = 0.0;
+
+ gld->light_pos[0] = 5.0;
+ gld->light_pos[1] = 5.0;
+ gld->light_pos[2] = 10.0;
+ gld->light_pos[3] = 1.0;
+
+ gld->angle = 0.0;
+
+ gld->tot_vertices = 0;
+ gld->gear_teeth = 10;
+}
+
+//-------------------------//
+
+static void
+_init_gl(Evas_Object *obj)
+{
+ GLData *gld = evas_object_data_get(obj, "gld");
+ if (!gld) return;
+
+ gears_init(gld);
+}
+
+static void
+_del_gl(Evas_Object *obj)
+{
+ int i;
+ GLData *gld = evas_object_data_get(obj, "gld");
+ if (!gld)
+ {
+ printf("Unable to get GLData. \n");
+ return;
+ }
+ Evas_GL_API *gl = gld->glapi;
+
+ gl->glDeleteShader(gld->vtx_shader);
+ gl->glDeleteShader(gld->fgmt_shader);
+ gl->glDeleteProgram(gld->program);
+
+ for (i = 0; i < 6; i++)
+ if (gld->gear[i]) free_gear(gld, gld->gear[i]);
+
+ evas_object_data_del((Evas_Object*)obj, "gld");
+ free(gld);
+
+ Ecore_Animator *ani = evas_object_data_get(obj, "ani");
+ ecore_animator_del(ani);
+
+}
+
+static void
+_resize_gl(Evas_Object *obj)
+{
+ int w, h;
+ GLData *gld = evas_object_data_get(obj, "gld");
+ if (!gld) return;
+
+ elm_glview_size_get(obj, &w, &h);
+ gears_reshape(gld, w, h);
+}
+
+
+static void
+_draw_gl(Evas_Object *obj)
+{
+ GLData *gld = evas_object_data_get(obj, "gld");
+ if (!gld) return;
+ Evas_GL_API *gl = gld->glapi;
+
+ render_gears(gld);
+ gl->glFinish();
+}
+
+static Eina_Bool
+_anim(void *data)
+{
+ elm_glview_changed_set((Evas_Object*)data);
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_quit_idler(void *data)
+{
+ evas_object_del(data);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_on_done(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ ecore_idler_add(_quit_idler, data);
+}
+
+static void
+_on_plus(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ GLData *gld = evas_object_data_get(data, "gld");
+ gld->gear_teeth += 1;
+ gld->recreate_gears = 1;
+}
+
+static void
+_on_minus(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ GLData *gld = evas_object_data_get(data, "gld");
+ if (gld->gear_teeth > 0)
+ {
+ gld->gear_teeth -= 1;
+ gld->recreate_gears -= 1;
+ }
+}
+
+static void
+_del(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Ecore_Animator *ani = evas_object_data_get(obj, "ani");
+ ecore_animator_del(ani);
+}
+
+static void
+_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Key_Down *ev;
+ ev = (Evas_Event_Key_Down *)event_info;
+ GLData *gld = evas_object_data_get(obj, "gld");
+
+ if (strcmp(ev->keyname, "Up") == 0)
+ {
+ gld->gear_teeth += 1;
+ gld->recreate_gears = 1;
+ return;
+ }
+
+ if (strcmp(ev->keyname, "Down") == 0)
+ {
+ gld->gear_teeth -= 1;
+ gld->recreate_gears = 1;
+ return;
+ }
+}
+
+static void
+_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ GLData *gld = evas_object_data_get(obj, "gld");
+ gld->mouse_down = 1;
+}
+
+static void
+_mouse_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev;
+ ev = (Evas_Event_Mouse_Move *)event_info;
+ GLData *gld = evas_object_data_get(obj, "gld");
+ float dx = 0, dy = 0;
+
+ if (gld->mouse_down)
+ {
+ dx = ev->cur.canvas.x - ev->prev.canvas.x;
+ dy = ev->cur.canvas.y - ev->prev.canvas.y;
+
+ gld->view_rot[1] += 1.0 * dx;
+ gld->view_rot[0] += 1.0 * dy;
+ }
+}
+
+static void
+_mouse_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ GLData *gld = evas_object_data_get(obj, "gld");
+ gld->mouse_down = 0;
+}
+
+//---------------------------//
+void
+test_glview_manygears(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *bx1, *bx2, *bt_ok, *bt_up, *bt_dn, *gl, *lb;
+ Ecore_Animator *ani;
+ GLData *gld = NULL;
+ char buf[PATH_MAX];
+
+ // alloc a data struct to hold our relevant gl info in
+ if (!(gld = calloc(1, sizeof(GLData)))) return;
+ gldata_init(gld);
+
+ // new window - do the usual and give it a name, title and delete handler
+ win = elm_win_util_standard_add("glview_manygears", "GLView Many Gears");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+
+ // add an image bg
+ bg = elm_bg_add(win);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_bg_color_set(bg, 150, 150, 150);
+ snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bx1 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx1);
+ evas_object_show(bx1);
+
+
+ // Add a GLView
+ gl = elm_glview_add(win);
+ if (gl)
+ {
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ // Add a glview
+ elm_glview_mode_set(gl, 0
+ | ELM_GLVIEW_ALPHA
+ | ELM_GLVIEW_DEPTH
+ );
+ elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE);
+ elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ALWAYS);
+ elm_glview_init_func_set(gl, (Elm_GLView_Func_Cb)_init_gl);
+ elm_glview_del_func_set(gl, (Elm_GLView_Func_Cb)_del_gl);
+ elm_glview_resize_func_set(gl, (Elm_GLView_Func_Cb)_resize_gl);
+ elm_glview_render_func_set(gl, (Elm_GLView_Func_Cb)_draw_gl);
+ elm_box_pack_end(bx1, gl);
+ evas_object_show(gl);
+
+ // Add Mouse/Key Event Callbacks
+ elm_object_focus_set(gl, EINA_TRUE);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _key_down, gl);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, gl);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_UP, _mouse_up, gl);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, gl);
+
+ // Add animator for rendering
+ ani = ecore_animator_add(_anim, gl);
+ gld->glapi = elm_glview_gl_api_get(gl);
+ evas_object_data_set(gl, "ani", ani);
+ evas_object_data_set(gl, "gld", gld);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _del, gl);
+
+ // Add Up/Down Buttons
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_show(bx2);
+
+ bt_up = elm_button_add(win);
+ elm_object_text_set(bt_up, "+ Teeth");
+ evas_object_size_hint_align_set(bt_up, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt_up, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx2, bt_up);
+ evas_object_show(bt_up);
+ evas_object_smart_callback_add(bt_up, "clicked", _on_plus, gl);
+
+ bt_dn = elm_button_add(win);
+ elm_object_text_set(bt_dn, "- Teeth");
+ evas_object_size_hint_align_set(bt_dn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt_dn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx2, bt_dn);
+ evas_object_show(bt_dn);
+ evas_object_smart_callback_add(bt_dn, "clicked", _on_minus, gl);
+
+ elm_box_pack_end(bx1, bx2);
+ }
+ else
+ {
+ lb = elm_label_add(bx1);
+ elm_object_text_set(lb, "<align=left> GL backend engine is not supported.<br/>"
+ " 1. Check your back-end engine or<br/>"
+ " 2. Run elementary_test with engine option or<br/>"
+ " ex) $ <b>ELM_ENGINE=gl</b> elementary_test<br/>"
+ " 3. Change your back-end engine from elementary_config.<br/></align>");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx1, lb);
+ evas_object_show(lb);
+ free(gld);
+ }
+
+ // Add Close Button
+ bt_ok = elm_button_add(win);
+ elm_object_text_set(bt_ok, "Close");
+ evas_object_size_hint_align_set(bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt_ok, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx1, bt_ok);
+ evas_object_show(bt_ok);
+ evas_object_smart_callback_add(bt_ok, "clicked", _on_done, win);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_glview_simple.c b/src/bin/elementary/test_glview_simple.c
new file mode 100644
index 0000000000..dcc418316b
--- /dev/null
+++ b/src/bin/elementary/test_glview_simple.c
@@ -0,0 +1,290 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct _GL_Data GL_Data;
+
+// GL related data here..
+struct _GL_Data
+{
+ Evas_GL_API *glapi;
+ GLuint program;
+ GLuint vtx_shader;
+ GLuint fgmt_shader;
+ GLuint vbo;
+};
+
+static float red = 1.0;
+
+static void
+_win_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+static GLuint
+load_shader(GL_Data *gld, GLenum type, const char *shader_src)
+{
+ Evas_GL_API *gl = gld->glapi;
+ GLuint shader;
+ GLint compiled;
+
+ // Create the shader object
+ shader = gl->glCreateShader(type);
+ if (shader==0)
+ return 0;
+
+ // Load/Compile shader source
+ gl->glShaderSource(shader, 1, &shader_src, NULL);
+ gl->glCompileShader(shader);
+ gl->glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
+
+ if (!compiled)
+ {
+ GLint info_len = 0;
+ gl->glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_len);
+ if (info_len > 1)
+ {
+ char* info_log = malloc(sizeof(char) * info_len);
+
+ gl->glGetShaderInfoLog(shader, info_len, NULL, info_log);
+ printf("Error compiling shader:\n%s\n======\n%s\n======\n", info_log, shader_src );
+ free(info_log);
+ }
+ gl->glDeleteShader(shader);
+ return 0;
+ }
+
+ return shader;
+}
+
+// Initialize the shader and program object
+static int
+init_shaders(GL_Data *gld)
+{
+ Evas_GL_API *gl = gld->glapi;
+ GLbyte vShaderStr[] =
+ "attribute vec4 vPosition;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = vPosition;\n"
+ "}\n";
+
+ GLbyte fShaderStr[] =
+ "#ifdef GL_ES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );\n"
+ "}\n";
+
+ GLint linked;
+
+ // Load the vertex/fragment shaders
+ gld->vtx_shader = load_shader(gld, GL_VERTEX_SHADER, (const char*)vShaderStr);
+ gld->fgmt_shader = load_shader(gld, GL_FRAGMENT_SHADER, (const char*)fShaderStr);
+
+ // Create the program object
+ gld->program = gl->glCreateProgram( );
+ if (gld->program==0)
+ return 0;
+
+ gl->glAttachShader(gld->program, gld->vtx_shader);
+ gl->glAttachShader(gld->program, gld->fgmt_shader);
+
+ gl->glBindAttribLocation(gld->program, 0, "vPosition");
+ gl->glLinkProgram(gld->program);
+ gl->glGetProgramiv(gld->program, GL_LINK_STATUS, &linked);
+
+ if (!linked)
+ {
+ GLint info_len = 0;
+ gl->glGetProgramiv(gld->program, GL_INFO_LOG_LENGTH, &info_len);
+ if (info_len > 1)
+ {
+ char* info_log = malloc(sizeof(char) * info_len);
+
+ gl->glGetProgramInfoLog(gld->program, info_len, NULL, info_log);
+ printf("Error linking program:\n%s\n", info_log);
+ free(info_log);
+ }
+ gl->glDeleteProgram(gld->program);
+ return 0;
+ }
+ return 1;
+}
+
+// Callbacks
+static void
+_init_gl(Evas_Object *obj)
+{
+ GL_Data *gld = evas_object_data_get(obj, "gld");
+ Evas_GL_API *gl = gld->glapi;
+ GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f,
+ -0.5f, -0.5f, 0.0f,
+ 0.5f, -0.5f, 0.0f };
+
+ if (!init_shaders(gld))
+ {
+ printf("Error Initializing Shaders\n");
+ return;
+ }
+
+ gl->glGenBuffers(1, &gld->vbo);
+ gl->glBindBuffer(GL_ARRAY_BUFFER, gld->vbo);
+ gl->glBufferData(GL_ARRAY_BUFFER, sizeof(vVertices), vVertices, GL_STATIC_DRAW);
+ gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
+ 0, 0);
+ gl->glEnableVertexAttribArray(0);
+}
+
+static void
+_del_gl(Evas_Object *obj)
+{
+ GL_Data *gld = evas_object_data_get(obj, "gld");
+ if (!gld)
+ {
+ printf("Unable to get GL_Data. \n");
+ return;
+ }
+ Evas_GL_API *gl = gld->glapi;
+
+ gl->glDeleteShader(gld->vtx_shader);
+ gl->glDeleteShader(gld->fgmt_shader);
+ gl->glDeleteProgram(gld->program);
+ gl->glDeleteBuffers(1, &gld->vbo);
+
+ evas_object_data_del(obj, "gld");
+}
+
+static void
+_resize_gl(Evas_Object *obj)
+{
+ int w, h;
+ GL_Data *gld = evas_object_data_get(obj, "gld");
+ Evas_GL_API *gl = gld->glapi;
+
+ elm_glview_size_get(obj, &w, &h);
+
+ // GL Viewport stuff. you can avoid doing this if viewport is all the
+ // same as last frame if you want
+ gl->glViewport(0, 0, w, h);
+}
+
+static void
+_draw_gl(Evas_Object *obj)
+{
+ Evas_GL_API *gl = elm_glview_gl_api_get(obj);
+ GL_Data *gld = evas_object_data_get(obj, "gld");
+ if (!gld) return;
+ int w, h;
+
+ elm_glview_size_get(obj, &w, &h);
+
+ gl->glViewport(0, 0, w, h);
+ gl->glClearColor(red, 0.8, 0.3, 1);
+ gl->glClear(GL_COLOR_BUFFER_BIT);
+
+ // Draw a Triangle
+ gl->glEnable(GL_BLEND);
+
+ gl->glUseProgram(gld->program);
+
+ gl->glBindBuffer(GL_ARRAY_BUFFER, gld->vbo);
+
+ gl->glDrawArrays(GL_TRIANGLES, 0, 3);
+
+ // Optional - Flush the GL pipeline
+ gl->glFinish();
+
+ red -= 0.1;
+ if (red < 0.0) red = 1.0;
+}
+
+static Eina_Bool
+_anim(void *data)
+{
+ elm_glview_changed_set(data);
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_close_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static void
+_gl_del_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ ecore_animator_del(data);
+}
+
+void
+test_glview_simple(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt, *gl, *lb;
+ Ecore_Animator *ani;
+ GL_Data *gld = NULL;
+
+ if (!(gld = calloc(1, sizeof(GL_Data)))) return;
+
+ win = elm_win_util_standard_add("glview-simple", "GLView Simple");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _win_free_cb, gld);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_glview_add(win);
+ if (gl)
+ {
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_glview_mode_set(gl, ELM_GLVIEW_ALPHA | ELM_GLVIEW_DEPTH);
+ elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE);
+ elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND);
+ elm_glview_init_func_set(gl, _init_gl);
+ elm_glview_del_func_set(gl, _del_gl);
+ elm_glview_resize_func_set(gl, _resize_gl);
+ elm_glview_render_func_set(gl, _draw_gl);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(gl);
+
+ elm_object_focus_set(gl, EINA_TRUE);
+
+ ani = ecore_animator_add(_anim, gl);
+ gld->glapi = elm_glview_gl_api_get(gl);
+ evas_object_data_set(gl, "gld", gld);
+ evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _gl_del_cb, ani);
+ }
+ else
+ {
+ lb = elm_label_add(bx);
+ elm_object_text_set(lb, "<align=left> GL backend engine is not supported.<br/>"
+ " 1. Check your back-end engine or<br/>"
+ " 2. Run elementary_test with engine option or<br/>"
+ " ex) $ <b>ELM_ENGINE=gl</b> elementary_test<br/>"
+ " 3. Change your back-end engine from elementary_config.<br/></align>");
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+ }
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", _close_cb, win);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_grid.c b/src/bin/elementary/test_grid.c
new file mode 100644
index 0000000000..fc34ded8ed
--- /dev/null
+++ b/src/bin/elementary/test_grid.c
@@ -0,0 +1,189 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+struct _Api_Data
+{
+ Evas_Object *grid;
+ Evas_Object *child;
+};
+typedef struct _Api_Data Api_Data;
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ Api_Data data;
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ GRID_PACK_SET,
+ GRID_UNPACK,
+ GRID_SIZE,
+ GRID_CLEAR,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+ Api_Data *dt = &api->data;
+ int w, h;
+
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case GRID_PACK_SET: /* 0 */
+ elm_grid_pack_set(dt->child, 5, 15, 60, 40);
+ break;
+
+ case GRID_UNPACK: /* 1 */
+ elm_grid_unpack(dt->grid, dt->child);
+ evas_object_del(dt->child);
+ break;
+
+ case GRID_SIZE: /* 2 */
+ elm_grid_size_get(dt->grid, &w, &h);
+ printf("size w=<%d> h=<%d>\n", w, h);
+ w = h = 100; /* grid size returns wrong values */
+ w += 30;
+ h += 10;
+
+ elm_grid_size_set(dt->grid, w, h);
+ break;
+
+ case GRID_CLEAR: /* 3 */
+ elm_grid_clear(dt->grid, EINA_TRUE);
+ break;
+
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+_ch_grid(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ int x, y, w, h;
+
+ elm_grid_pack_get(obj, &x, &y, &w, &h);
+ elm_grid_pack_set(obj, x - 1, y - 1, w + 2, h + 2);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_grid(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gd, *bt, *rc, *en;
+
+ win = elm_win_util_standard_add("grid", "Grid");
+ elm_win_autodel_set(win, EINA_TRUE);
+ api_data *api = calloc(1, sizeof(api_data));
+
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ gd = elm_grid_add(win);
+ elm_grid_size_set(gd, 100, 100);
+ evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, gd);
+ api->data.grid = gd;
+ evas_object_show(gd);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_object_text_set(en, "Entry text");
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_grid_pack(gd, en, 50, 10, 40, 10);
+ evas_object_show(en);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_object_text_set(en, "Entry text 2");
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_grid_pack(gd, en, 60, 20, 30, 10);
+ evas_object_show(en);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_grid_pack(gd, bt, 30, 0, 40, 10);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button");
+ elm_grid_pack(gd, bt, 0, 0, 20, 20);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button");
+ elm_grid_pack(gd, bt, 10, 10, 40, 20);
+ api->data.child = bt;
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button");
+ elm_grid_pack(gd, bt, 10, 30, 20, 50);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button");
+ elm_grid_pack(gd, bt, 80, 80, 20, 20);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Change");
+ elm_grid_pack(gd, bt, 40, 40, 20, 20);
+ evas_object_smart_callback_add(bt, "clicked", _ch_grid, gd);
+ evas_object_show(bt);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rc, 128, 0, 0, 128);
+ elm_grid_pack(gd, rc, 40, 70, 20, 10);
+ evas_object_show(rc);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rc, 0, 128, 0, 128);
+ elm_grid_pack(gd, rc, 60, 70, 10, 10);
+ evas_object_show(rc);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rc, 0, 0, 128, 128);
+ elm_grid_pack(gd, rc, 40, 80, 10, 10);
+ evas_object_show(rc);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rc, 128, 0, 128, 128);
+ elm_grid_pack(gd, rc, 50, 80, 10, 10);
+ evas_object_show(rc);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rc, 128, 64, 0, 128);
+ elm_grid_pack(gd, rc, 60, 80, 10, 10);
+ evas_object_show(rc);
+
+ evas_object_resize(win, 480, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_hover.c b/src/bin/elementary/test_hover.c
new file mode 100644
index 0000000000..a2edea4c64
--- /dev/null
+++ b/src/bin/elementary/test_hover.c
@@ -0,0 +1,249 @@
+#include "elementary_config.h"
+#include <Elementary.h>
+
+static void
+_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("hover dismissed callback is called!\n");
+}
+
+static void
+my_hover_bt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *hv = data;
+
+ evas_object_show(hv);
+}
+
+static void
+_dismiss_hover(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *hv = data;
+
+ elm_hover_dismiss(hv);
+}
+
+void
+test_hover(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt, *hv, *ic;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("hover", "Hover");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ hv = elm_hover_add(win);
+ evas_object_smart_callback_add(hv, "dismissed", _dismissed_cb, NULL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button");
+ evas_object_smart_callback_add(bt, "clicked", my_hover_bt, hv);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ elm_hover_parent_set(hv, win);
+ elm_hover_target_set(hv, bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Popup");
+ elm_object_part_content_set(hv, "middle", bt);
+ evas_object_show(bt);
+
+ bx = elm_box_add(win);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Top 1");
+ evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Top 2");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Top 3");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_show(bx);
+ elm_object_part_content_set(hv, "top", bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Bottom");
+ elm_object_part_content_set(hv, "bottom", bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Left");
+ elm_object_part_content_set(hv, "left", bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Right");
+ elm_object_part_content_set(hv, "right", bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 440, 440);
+ evas_object_show(win);
+}
+
+void
+test_hover2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt, *hv, *ic;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("hover2", "Hover 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ hv = elm_hover_add(win);
+ elm_object_style_set(hv, "popout");
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button");
+ evas_object_smart_callback_add(bt, "clicked", my_hover_bt, hv);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ elm_hover_parent_set(hv, win);
+ elm_hover_target_set(hv, bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Popup");
+ elm_object_part_content_set(hv, "middle", bt);
+ evas_object_show(bt);
+
+ bx = elm_box_add(win);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Top 1");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Top 2");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Top 3");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_show(bx);
+ elm_object_part_content_set(hv, "top", bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Bot");
+ elm_object_part_content_set(hv, "bottom", bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Left");
+ elm_object_part_content_set(hv, "left", bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Right");
+ elm_object_part_content_set(hv, "right", bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 440, 440);
+ evas_object_show(win);
+}
+
+static void
+_hover_show_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+ void *event_info)
+{
+ Evas_Object *fake_obj = evas_object_data_get(obj, "fake_obj");
+ if (!fake_obj) return;
+
+ Evas_Event_Mouse_Down *ev = event_info;
+ printf("position x: %d, y: %d \n", ev->canvas.x, ev->canvas.y);
+
+ evas_object_move(fake_obj, ev->canvas.x, ev->canvas.y);
+ evas_object_show(data);
+}
+
+/*
+ * hover acts like elm_menu but it has all the hover features such as:
+ * 1. positioning: left, top-left, top, top-right, right, bottom-right, bottom,
+ * bottom-left, middle
+ * 2. content: one can set any object object as hover content
+ */
+void
+test_hover3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fake_obj, *bx, *bt, *hv, *ic, *rect;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("hover3", "Hover 3");
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, rect);
+ evas_object_color_set(rect, 0, 0, 0, 0);
+ evas_object_show(rect);
+
+ // fake object to move hover object as we wish
+ fake_obj = elm_box_add(win);
+ evas_object_data_set(rect, "fake_obj", fake_obj);
+
+ hv = elm_hover_add(win);
+ elm_hover_parent_set(hv, win);
+ elm_hover_target_set(hv, fake_obj);
+
+ evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_DOWN,
+ _hover_show_cb, hv);
+
+ bx = elm_box_add(win);
+ elm_object_part_content_set(hv, "smart", bx);
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png",
+ elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv);
+
+ evas_object_resize(win, 440, 440);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_hoversel.c b/src/bin/elementary/test_hoversel.c
new file mode 100644
index 0000000000..b59a6c3efe
--- /dev/null
+++ b/src/bin/elementary/test_hoversel.c
@@ -0,0 +1,416 @@
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ void *box; /* Use this to get box content */
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ HOVERSEL_HORIZ,
+ HOVERSEL_END,
+ HOVERSEL_LABAL_SET,
+ HOVERSEL_ICON_UNSET,
+ HOVERSEL_CLEAR_OPEN,
+ HOVERSEL_CLEAR,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+ Evas_Object *icon;
+
+ const Eina_List *items = elm_box_children_get(api->box);
+ if (!eina_list_count(items))
+ return;
+
+ /* use elm_box_children_get() to get list of children */
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case HOVERSEL_HORIZ: /* Make first hover horiz (0) */
+ elm_hoversel_horizontal_set(eina_list_nth(items, 0), EINA_TRUE);
+ elm_hoversel_hover_begin(eina_list_nth(items, 0));
+ break;
+
+ case HOVERSEL_END: /* Make first hover horiz (1) */
+ elm_hoversel_hover_begin(eina_list_nth(items, 1));
+ elm_hoversel_hover_end(eina_list_nth(items, 1));
+ break;
+
+ case HOVERSEL_LABAL_SET: /* set second hover label (2) */
+ elm_object_text_set(eina_list_nth(items, 1), "Label from API");
+ break;
+
+ case HOVERSEL_ICON_UNSET: /* 3 */
+ elm_object_text_set(eina_list_nth(items, 5), "Label only");
+ icon = elm_object_part_content_unset(eina_list_nth(items, 5), "icon");
+ evas_object_del(icon);
+ break;
+
+ case HOVERSEL_CLEAR_OPEN: /* 4 */
+ elm_hoversel_hover_begin(eina_list_nth(items, 1));
+ elm_hoversel_clear(eina_list_nth(items, 1));
+ break;
+
+ case HOVERSEL_CLEAR: /* 5 */
+ elm_hoversel_clear(eina_list_nth(items, 0));
+ break;
+
+ case API_STATE_LAST:
+ break;
+
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+static void
+_hoversel_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Hover button is clicked and 'clicked' callback is called.\n");
+}
+
+static void
+_hoversel_clicked_populate_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ printf("Hover button is clicked and 'clicked' callback is called.\n");
+ elm_hoversel_item_add(obj, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(obj, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(obj, "Item 3", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(obj, "Item 4", NULL, ELM_ICON_NONE, NULL, NULL);
+}
+
+static void
+_hoversel_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ const char *txt = elm_object_item_text_get(event_info);
+
+ printf("'selected' callback is called. (selected item : %s)\n", txt);
+}
+
+static void
+_hoversel_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("'dismissed' callback is called.\n");
+}
+
+static void
+_hoversel_expanded_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *it = data;
+
+ printf("'expanded' callback is called.\n");
+ if (it)
+ {
+ printf("old style: %s\n", elm_object_item_style_get(it));
+ //item type is button. set the style of button
+ elm_object_item_style_set(it, "anchor");
+ printf("new style: %s\n", elm_object_item_style_get(it));
+ }
+}
+
+void
+test_hoversel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt, *ic, *bxx, *hoversel;
+ Elm_Object_Item *it;
+ char buf[PATH_MAX];
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("hoversel", "HoverSel");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ api->box = bx;
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, bx);
+
+ hoversel = elm_hoversel_add(win);
+// FIXME: need to add horizontal hoversel theme to default some day
+// elm_hoversel_horizontal_set(bt, EINA_TRUE);
+ elm_hoversel_auto_update_set(hoversel, EINA_TRUE);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "Labels");
+ elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 3", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 4 - Long Label Here", "close", ELM_ICON_STANDARD, NULL, NULL);
+ it = elm_hoversel_item_add(hoversel, "Item 5 - Disabled", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_object_item_disabled_set(it, EINA_TRUE);
+ evas_object_smart_callback_add(hoversel, "clicked",
+ _hoversel_clicked_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "selected",
+ _hoversel_selected_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "dismissed",
+ _hoversel_dismissed_cb, NULL);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+
+ hoversel = elm_hoversel_add(win);
+ elm_hoversel_auto_update_set(hoversel, EINA_TRUE);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "Some Icons");
+ elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 5 - Long Label Here", NULL, ELM_ICON_NONE, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 6", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 7", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 8", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 9", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 10", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 11", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 12", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+
+ hoversel = elm_hoversel_add(win);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "All Icons");
+ elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 2", "arrow_down", ELM_ICON_STANDARD,
+ NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+
+ hoversel = elm_hoversel_add(win);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "All Icons");
+ elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL,
+ NULL);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_hoversel_item_add(hoversel, "Item 2", buf, ELM_ICON_FILE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+
+ hoversel = elm_hoversel_add(win);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "Disabled Hoversel");
+ elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 2", "close", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_object_disabled_set(hoversel, EINA_TRUE);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+
+ hoversel = elm_hoversel_add(win);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "Icon + Label");
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_object_part_content_set(hoversel, "icon", ic);
+ evas_object_show(ic);
+
+ elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 2", "arrow_down", ELM_ICON_STANDARD,
+ NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+
+ hoversel = elm_hoversel_add(win);
+ elm_hoversel_auto_update_set(hoversel, EINA_TRUE);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "Custom Item Style");
+ elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 3", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 4", NULL, ELM_ICON_NONE, NULL, NULL);
+ it = elm_hoversel_item_add(hoversel, "Manage items", NULL, ELM_ICON_NONE, NULL, NULL);
+ evas_object_smart_callback_add(hoversel, "clicked",
+ _hoversel_clicked_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "selected",
+ _hoversel_selected_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "dismissed",
+ _hoversel_dismissed_cb, NULL);
+ //pass the last item as data and use elm_object_item_style_set() to change the item style.
+ evas_object_smart_callback_add(hoversel, "expanded",
+ _hoversel_expanded_cb, it);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+
+ hoversel = elm_hoversel_add(win);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "Add items when clicked");
+ evas_object_smart_callback_add(hoversel, "clicked",
+ _hoversel_clicked_populate_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "selected",
+ _hoversel_selected_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "dismissed",
+ _hoversel_dismissed_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "expanded",
+ _hoversel_expanded_cb, NULL);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+
+ evas_object_resize(win, 320, 500);
+
+ evas_object_show(win);
+}
+
+static void
+_item_focused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *it = event_info;
+
+ printf("item,focused: %p\n", it);
+}
+
+static void
+_item_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *it = event_info;
+
+ printf("item,unfocused: %p\n", it);
+}
+static void
+_hoversel_expanded_cb2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *it = data;
+
+ printf("expanded\n");
+ elm_object_item_focus_set(it, EINA_TRUE);
+ printf("focus set to item: %p\n", it);
+}
+
+void
+test_hoversel_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *hoversel;
+ Elm_Object_Item *it;
+
+ win = elm_win_util_standard_add("hoversel focus", "Hoversel Focus");
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_focus_highlight_animate_set(win, EINA_TRUE);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ hoversel = elm_hoversel_add(win);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "Vertical");
+ elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 3", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 4 - Long Label Here", "close", ELM_ICON_STANDARD, NULL, NULL);
+ evas_object_smart_callback_add(hoversel, "clicked",
+ _hoversel_clicked_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "selected",
+ _hoversel_selected_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "dismissed",
+ _hoversel_dismissed_cb, NULL);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+ elm_object_focus_set(hoversel, EINA_TRUE);
+ evas_object_smart_callback_add(hoversel, "item,focused", _item_focused_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "item,unfocused", _item_unfocused_cb, NULL);
+
+ hoversel = elm_hoversel_add(win);
+ elm_hoversel_horizontal_set(hoversel, EINA_TRUE);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "Horizontal");
+ elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+ evas_object_smart_callback_add(hoversel, "item,focused", _item_focused_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "item,unfocused", _item_unfocused_cb, NULL);
+
+ hoversel = elm_hoversel_add(win);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "Icons");
+ elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL,
+ NULL);
+ it = elm_hoversel_item_add(hoversel, "Item 2", "arrow_down", ELM_ICON_STANDARD,
+ NULL, NULL);
+ elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL,
+ NULL);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+ evas_object_smart_callback_add(hoversel, "item,focused", _item_focused_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "item,unfocused", _item_unfocused_cb, NULL);
+ evas_object_smart_callback_add(hoversel, "expanded",
+ _hoversel_expanded_cb2, it);
+
+ evas_object_resize(win, 320, 500);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_icon.c b/src/bin/elementary/test_icon.c
new file mode 100644
index 0000000000..e84d075c82
--- /dev/null
+++ b/src/bin/elementary/test_icon.c
@@ -0,0 +1,437 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+aspect_fixed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ic = (Evas_Object *)data;
+ elm_image_aspect_fixed_set(ic, elm_check_state_get(obj));
+}
+
+static void
+fill_outside_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ic = (Evas_Object *)data;
+ elm_image_fill_outside_set(ic, elm_check_state_get(obj));
+}
+
+static void
+smooth_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ic = (Evas_Object *)data;
+ elm_image_smooth_set(ic, elm_check_state_get(obj));
+}
+
+static void
+bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *ic;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("preload-prescale", "Preload & Prescale");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ic = elm_icon_add(win);
+ evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, ic);
+ snprintf(buf, sizeof(buf), "%s/images/insanely_huge_test_image.jpg",
+ elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+
+ elm_image_aspect_fixed_set(ic, EINA_FALSE);
+ elm_image_preload_disabled_set(ic, EINA_TRUE);
+ elm_image_prescale_set(ic, EINA_TRUE);
+ evas_object_show(ic);
+
+ evas_object_resize(win, 350, 350);
+ evas_object_show(win);
+}
+
+void
+test_icon(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *ic, *hbox, *tg, *bt;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("icon-test", "Icon Test");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ ic = elm_icon_add(box);
+ snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, ic);
+ evas_object_show(ic);
+
+ hbox = elm_box_add(box);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(box, hbox);
+ evas_object_show(hbox);
+
+ /* Test Aspect Fixed */
+ tg = elm_check_add(hbox);
+ elm_object_text_set(tg, "Aspect Fixed");
+ elm_check_state_set(tg, EINA_TRUE);
+ evas_object_smart_callback_add(tg, "changed", aspect_fixed_cb, ic);
+ elm_box_pack_end(hbox, tg);
+ evas_object_show(tg);
+
+ /* Test Fill Outside */
+ tg = elm_check_add(hbox);
+ elm_object_text_set(tg, "Fill Outside");
+ evas_object_smart_callback_add(tg, "changed", fill_outside_cb, ic);
+ elm_box_pack_end(hbox, tg);
+ evas_object_show(tg);
+
+ /* Test Smooth */
+ tg = elm_check_add(hbox);
+ elm_object_text_set(tg, "Smooth");
+ elm_check_state_set(tg, EINA_TRUE);
+ evas_object_smart_callback_add(tg, "changed", smooth_cb, ic);
+ elm_box_pack_end(hbox, tg);
+ evas_object_show(tg);
+
+ /* Test Preload, Prescale */
+ bt = elm_button_add(hbox);
+ elm_object_text_set(bt, "Preload & Prescale");
+ evas_object_smart_callback_add(bt, "clicked", bt_clicked, NULL);
+ elm_box_pack_end(hbox, bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
+
+/* Test: Icon Transparent */
+static void
+icon_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("clicked!\n");
+}
+
+void
+test_icon_transparent(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *ic;
+ char buf[PATH_MAX];
+
+ win = elm_win_add(NULL, "icon-transparent", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Icon Transparent");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_alpha_set(win, EINA_TRUE);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_image_no_scale_set(ic, EINA_TRUE);
+ evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(ic, 0.5, 0.5);
+ elm_win_resize_object_add(win, ic);
+ evas_object_show(ic);
+
+ evas_object_smart_callback_add(ic, "clicked", icon_clicked, NULL);
+
+ evas_object_show(win);
+}
+
+/* Test: Icon Standard */
+static void
+_standard_list_populate(Evas_Object *list, Elm_Icon_Lookup_Order order, int size)
+{
+ Evas_Object *ic;
+ Eina_List *l;
+ const char *group;
+ char name[128], *p;
+
+ elm_list_clear(list);
+ l = elm_theme_group_base_list(NULL, "elm/icon/");
+ EINA_LIST_FREE(l, group)
+ {
+ // group = "/elm/icon/standard-name/style/maybe_another_style??"
+ snprintf(name, sizeof(name), "%s", group + 9);
+ if ((p = strrchr(name, '/')))
+ *p = '\0';
+ // printf("Found group:%s Name:%s\n", group, name);
+
+ // quick hack to show only standard-compliant icons
+ // apart from the "folder" one, all the others have "-" in the name
+ if ((strrchr(name, '-') != NULL) || !strcmp(name, "folder"))
+ {
+ ic = elm_icon_add(list);
+ elm_icon_order_lookup_set(ic, order);
+ elm_icon_standard_set(ic, name);
+ if (size)
+ evas_object_size_hint_min_set(ic, size, size);
+ elm_list_item_append(list, name, ic, NULL, NULL, NULL);
+ }
+
+ eina_stringshare_del(group);
+ }
+ elm_list_go(list);
+}
+
+static void
+_rdg_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *li = data;
+ Evas_Object *icon = evas_object_data_get(li, "resize_icon");
+ Evas_Object *order_rdg = evas_object_data_get(li, "order_rdg");
+ Evas_Object *size_rdg = evas_object_data_get(li, "size_rdg");
+
+ _standard_list_populate(li, elm_radio_value_get(order_rdg),
+ elm_radio_value_get(size_rdg));
+
+ elm_icon_order_lookup_set(icon, elm_radio_value_get(order_rdg));
+}
+
+static void
+_slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *icon = data;
+ int size = (int)elm_slider_value_get(obj);
+
+ evas_object_size_hint_min_set(icon, size, size);
+}
+
+static void
+_list_selected_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Elm_Object_Item *list_it = event_info;
+ Evas_Object *icon = evas_object_data_get(obj, "resize_icon");
+
+ elm_icon_standard_set(icon, elm_object_item_text_get(list_it));
+}
+
+static void
+_std_btn_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *panes, *icon;
+
+ win = elm_win_util_standard_add("icon-test-std-auto", "Icon Standard");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ panes = elm_panes_add(win);
+ evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_panes_content_left_min_size_set(panes, 16);
+ elm_panes_content_right_min_size_set(panes, 16);
+ elm_win_resize_object_add(win, panes);
+ evas_object_show(panes);
+
+ icon = elm_icon_add(panes);
+ evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_icon_order_lookup_set(icon, ELM_ICON_LOOKUP_FDO_THEME);
+ elm_icon_standard_set(icon, "folder");
+ elm_object_part_content_set(panes, "left", icon);
+ evas_object_show(icon);
+
+ icon = elm_icon_add(panes);
+ evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_icon_order_lookup_set(icon, ELM_ICON_LOOKUP_FDO_THEME);
+ elm_icon_standard_set(icon, "user-home");
+ elm_object_part_content_set(panes, "right", icon);
+ evas_object_show(icon);
+
+ evas_object_resize(win, 300, 200);
+ evas_object_show(win);
+}
+
+void
+test_icon_standard(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *li, *box, *hbox, *fr, *rd, *rdg, *icon, *sl, *bt;
+
+ win = elm_win_util_standard_add("icon-test-std", "Icon Standard");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ li = elm_list_add(box);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(li, "selected", _list_selected_cb, NULL);
+ _standard_list_populate(li, ELM_ICON_LOOKUP_FDO_THEME, 0);
+ evas_object_show(li);
+
+ // lookup order
+ fr = elm_frame_add(box);
+ elm_object_text_set(fr, "standard icon order lookup");
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ hbox = elm_box_add(fr);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_object_content_set(fr, hbox);
+ evas_object_show(hbox);
+
+ rdg = elm_radio_add(hbox);
+ elm_radio_state_value_set(rdg, ELM_ICON_LOOKUP_FDO_THEME);
+ elm_object_text_set(rdg, "fdo, theme");
+ elm_box_pack_end(hbox, rdg);
+ evas_object_show(rdg);
+ evas_object_smart_callback_add(rdg, "changed", _rdg_changed_cb, li);
+ evas_object_data_set(li, "order_rdg", rdg);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, ELM_ICON_LOOKUP_THEME_FDO);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "theme, fdo");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, ELM_ICON_LOOKUP_FDO);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "fdo only");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, ELM_ICON_LOOKUP_THEME);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "theme only");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li);
+
+ // size
+ fr = elm_frame_add(box);
+ elm_object_text_set(fr, "standard icon size");
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ hbox = elm_box_add(fr);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_object_content_set(fr, hbox);
+ evas_object_show(hbox);
+
+ rdg = elm_radio_add(hbox);
+ elm_radio_state_value_set(rdg, 0);
+ elm_object_text_set(rdg, "Free");
+ elm_box_pack_end(hbox, rdg);
+ evas_object_show(rdg);
+ evas_object_smart_callback_add(rdg, "changed", _rdg_changed_cb, li);
+ evas_object_data_set(li, "size_rdg", rdg);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, 16);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "16");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, 22);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "22");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, 24);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "24");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, 32);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "32");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, 48);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "48");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, 64);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "64");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li);
+
+ rd = elm_radio_add(hbox);
+ elm_radio_state_value_set(rd, 128);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "128");
+ elm_box_pack_end(hbox, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li);
+
+ // pack the list
+ elm_box_pack_end(box, li);
+
+ // live resize
+ fr = elm_frame_add(box);
+ elm_object_text_set(fr, "live resize");
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(box, fr);
+ evas_object_show(fr);
+
+ hbox = elm_box_add(fr);
+ elm_object_content_set(fr, hbox);
+ evas_object_show(hbox);
+
+ icon = elm_icon_add(hbox);
+ elm_icon_order_lookup_set(icon, ELM_ICON_LOOKUP_FDO_THEME);
+ elm_icon_standard_set(icon, "folder");
+ evas_object_size_hint_min_set(icon, 16, 16);
+ elm_box_pack_end(hbox, icon);
+ evas_object_show(icon);
+ evas_object_data_set(li, "resize_icon", icon);
+
+ sl = elm_slider_add(hbox);
+ elm_object_text_set(sl, "min_size");
+ elm_slider_min_max_set(sl, 16, 256);
+ elm_slider_value_set(sl, 16);
+ elm_slider_unit_format_set(sl, "%.0f px");
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.0);
+ evas_object_smart_callback_add(sl, "changed", _slider_changed_cb, icon);
+ elm_box_pack_end(hbox, sl);
+ evas_object_show(sl);
+
+ bt = elm_button_add(box);
+ elm_object_text_set(bt, "Another size test, without using min_size");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.0);
+ evas_object_smart_callback_add(bt, "clicked", _std_btn_clicked_cb, NULL);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ // show the win
+ evas_object_resize(win, 300, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_icon_animated.c b/src/bin/elementary/test_icon_animated.c
new file mode 100644
index 0000000000..3ecfa26950
--- /dev/null
+++ b/src/bin/elementary/test_icon_animated.c
@@ -0,0 +1,57 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_icon_clicked_cb(void *data , Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *ic = data;
+ Eina_Bool play = EINA_FALSE;
+
+ play = !elm_image_animated_play_get(ic);
+ printf("image clicked! play = %d\n", play);
+ elm_image_animated_play_set(ic, play);
+}
+
+void
+test_icon_animated(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *lbl, *ic;
+ char buf[PATH_MAX];
+
+ elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+
+ win = elm_win_add(NULL, "icon-animated-gif", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Icon Animated Gif");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ lbl = elm_label_add(bx);
+ elm_object_text_set(lbl, "Clicking the image will play/pause animation.");
+ elm_box_pack_end(bx, lbl);
+ evas_object_show(lbl);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/animated_logo.gif", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ if (elm_image_animated_available_get(ic))
+ {
+ printf("animation is available for this image.\n");
+ elm_image_animated_set(ic, EINA_TRUE);
+ elm_image_animated_play_set(ic, EINA_TRUE);
+ }
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ evas_object_smart_callback_add(ic, "clicked", _icon_clicked_cb, ic);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_icon_desktops.c b/src/bin/elementary/test_icon_desktops.c
new file mode 100644
index 0000000000..6ab9511162
--- /dev/null
+++ b/src/bin/elementary/test_icon_desktops.c
@@ -0,0 +1,106 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static Elm_Genlist_Item_Class *it_desk = NULL;
+
+static char *
+desk_gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+#ifdef ELM_EFREET
+ Efreet_Desktop *d = (Efreet_Desktop *)data;
+ return strdup(d->name);
+#else
+ return NULL;
+ (void)data;
+#endif
+}
+static Evas_Object *
+desk_gl_content_get(void *data, Evas_Object *obj, const char *part)
+{
+#ifdef ELM_EFREET
+ Efreet_Desktop *d = (Efreet_Desktop *)data;
+ Evas_Object *ic;
+
+ ic = elm_icon_add(obj);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ if (!(!strcmp(part, "elm.swallow.icon"))) return ic;
+ if (!d->icon) return ic;
+ elm_icon_standard_set(ic, d->icon);
+ return ic;
+#else
+ return NULL;
+ (void)data;
+ (void)obj;
+ (void)part;
+#endif
+}
+static void
+desk_gl_del(void *data, Evas_Object *obj EINA_UNUSED)
+{
+#ifdef ELM_EFREET
+ Efreet_Desktop *d = (Efreet_Desktop *)data;
+ efreet_desktop_free(d);
+#else
+ return;
+ (void)data;
+#endif
+}
+
+#ifdef ELM_EFREET
+static void
+desktop_sel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Efreet_Desktop *d = data;
+ if (!d) return;
+ printf("Selected Desktop Icon:\n");
+ printf("\tname : %s\n", d->name);
+ printf("\ticon : %s\n", d->icon);
+ printf("\tgeneric_name : %s\n", d->generic_name);
+}
+#endif
+
+void
+test_icon_desktops(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl;
+#ifdef ELM_EFREET
+ Eina_List *desktops;
+#endif
+
+ win = elm_win_util_standard_add("icon-desktops", "Icon Desktops");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ it_desk = elm_genlist_item_class_new();
+ it_desk->item_style = "default";
+ it_desk->func.text_get = desk_gl_text_get;
+ it_desk->func.content_get = desk_gl_content_get;
+ it_desk->func.state_get = NULL;
+ it_desk->func.del = desk_gl_del;
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, gl);
+ evas_object_show(gl);
+
+#ifdef ELM_EFREET
+ if (elm_need_efreet())
+ {
+ desktops = efreet_util_desktop_name_glob_list("*");
+ if (desktops)
+ {
+ Efreet_Desktop *d;
+
+ EINA_LIST_FREE(desktops, d)
+ elm_genlist_item_append(gl, it_desk, d,
+ NULL, ELM_GENLIST_ITEM_NONE,
+ desktop_sel, d);
+ }
+ }
+#endif
+
+ elm_genlist_item_class_free(it_desk);
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_image.c b/src/bin/elementary/test_image.c
new file mode 100644
index 0000000000..f8f3d859ca
--- /dev/null
+++ b/src/bin/elementary/test_image.c
@@ -0,0 +1,193 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static const struct {
+ Evas_Image_Orient orient;
+ const char *name;
+} images_orient[] = {
+ { EVAS_IMAGE_ORIENT_NONE, "None" },
+ { EVAS_IMAGE_ORIENT_90, "Rotate 90" },
+ { EVAS_IMAGE_ORIENT_180, "Rotate 180" },
+ { EVAS_IMAGE_ORIENT_270, "Rotate 270" },
+ { EVAS_IMAGE_FLIP_HORIZONTAL, "Horizontal Flip" },
+ { EVAS_IMAGE_FLIP_VERTICAL, "Vertical Flip" },
+ { EVAS_IMAGE_FLIP_TRANSPOSE, "Transpose" },
+ { EVAS_IMAGE_FLIP_TRANSVERSE, "Transverse" },
+ { 0, NULL }
+};
+
+static void
+my_im_ch(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *im = evas_object_data_get(win, "im");
+ Evas_Object *rdg = evas_object_data_get(win, "rdg");
+ Evas_Image_Orient v = elm_radio_value_get(rdg);
+
+ elm_image_orient_set(im, v);
+ fprintf(stderr, "Set %i and got %i\n",
+ v, elm_image_orient_get(im));
+}
+
+void
+test_image(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *im, *rd, *rdg = NULL;
+ int i;
+
+ win = elm_win_util_standard_add("image test", "Image Test");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ im = elm_image_add(win);
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
+ elm_image_file_set(im, buf, NULL);
+ evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(im, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, im);
+ evas_object_show(im);
+
+ evas_object_data_set(win, "im", im);
+
+ for (i = 0; images_orient[i].name; ++i)
+ {
+ rd = elm_radio_add(win);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ elm_radio_state_value_set(rd, images_orient[i].orient);
+ elm_object_text_set(rd, images_orient[i].name);
+ elm_box_pack_end(box, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", my_im_ch, win);
+ if (!rdg)
+ {
+ rdg = rd;
+ evas_object_data_set(win, "rdg", rdg);
+ }
+ else
+ {
+ elm_radio_group_add(rd, rdg);
+ }
+ }
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+void
+test_remote_image(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *im, *rd, *rdg = NULL;
+ int i;
+
+ win = elm_win_util_standard_add("image test", "Image Test");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ im = elm_image_add(win);
+ elm_image_file_set(im, "http://41.media.tumblr.com/29f1ecd4f98aaff73fb21f479b450d4c/tumblr_mqsxdciQmB1rrju89o1_1280.jpg", NULL);
+ evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(im, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ elm_box_pack_end(box, im);
+ evas_object_show(im);
+
+ evas_object_data_set(win, "im", im);
+
+ for (i = 0; images_orient[i].name; ++i)
+ {
+ rd = elm_radio_add(win);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ elm_radio_state_value_set(rd, images_orient[i].orient);
+ elm_object_text_set(rd, images_orient[i].name);
+ elm_box_pack_end(box, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", my_im_ch, win);
+ if (!rdg)
+ {
+ rdg = rd;
+ evas_object_data_set(win, "rdg", rdg);
+ }
+ else
+ {
+ elm_radio_group_add(rd, rdg);
+ }
+ }
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+static void
+_img_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans;
+ static int degree = 0;
+
+ fprintf(stderr, "%p - clicked\n", obj);
+
+ trans = elm_transit_add();
+ elm_transit_object_add(trans, data);
+ if (degree == 0)
+ {
+ elm_transit_effect_rotation_add(trans, 0, 180);
+ degree = 180;
+ }
+ else
+ {
+ elm_transit_effect_rotation_add(trans, 180, 360);
+ degree = 0;
+ }
+ elm_transit_duration_set(trans, 3.0);
+ elm_transit_objects_final_state_keep_set(trans, EINA_TRUE);
+ elm_transit_go(trans);
+}
+
+void
+test_click_image(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *im, *label;
+
+ win = elm_win_util_standard_add("image test", "Image Test");
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ im = elm_image_add(win);
+ elm_object_focus_allow_set(im, EINA_TRUE);
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
+ elm_image_file_set(im, buf, NULL);
+ evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(im, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(im, "clicked", _img_clicked_cb, im);
+ elm_box_pack_end(box, im);
+ evas_object_show(im);
+ elm_object_focus_set(im, EINA_TRUE);
+
+ label = elm_label_add(win);
+ elm_object_text_set(label, "<b>Press Return/Space/KP_Return key on image to transit.</b>");
+ evas_object_size_hint_weight_set(label, 0.0, 0.0);
+ evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, label);
+ evas_object_show(label);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_index.c b/src/bin/elementary/test_index.c
new file mode 100644
index 0000000000..085f8493db
--- /dev/null
+++ b/src/bin/elementary/test_index.c
@@ -0,0 +1,585 @@
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+struct _Idx_Data_Type
+{
+ Evas_Object *id; /* Pointer to Index */
+ Elm_Object_Item *item; /* Item we use for search */
+};
+typedef struct _Idx_Data_Type Idx_Data_Type;
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ Idx_Data_Type dt;
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ INDEX_LEVEL_SET,
+ INDEX_ACTIVE_SET,
+ INDEX_DELAY_CHANGE_TIME_SET,
+ INDEX_APPEND_RELATIVE,
+ INDEX_PREPEND,
+ INDEX_ITEM_DEL,
+ INDEX_ITEM_FIND,
+ INDEX_HORIZONTAL,
+ INDEX_INDICATOR_DISABLED,
+ INDEX_CLEAR,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+ Idx_Data_Type *d = &api->dt;
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case INDEX_LEVEL_SET:
+ elm_index_autohide_disabled_set(d->id, EINA_TRUE);
+ elm_index_item_level_set(d->id, (elm_index_item_level_get(d->id) ? 0 : 1));
+ break;
+
+ case INDEX_ACTIVE_SET:
+ elm_index_autohide_disabled_set(d->id, EINA_FALSE);
+ break;
+
+ case INDEX_DELAY_CHANGE_TIME_SET:
+ elm_index_delay_change_time_set(d->id, 1.0);
+ break;
+
+ case INDEX_APPEND_RELATIVE:
+ elm_index_item_insert_after(d->id,
+ elm_index_item_find(d->id, d->item),
+ "W", NULL, d->item);
+ elm_index_item_insert_before(d->id,
+ elm_index_item_find(d->id, d->item),
+ "V", NULL, d->item);
+ break;
+
+ case INDEX_PREPEND:
+ elm_index_item_prepend(d->id, "D", NULL, d->item);
+ break;
+
+ case INDEX_ITEM_DEL:
+ elm_object_item_del(elm_index_item_find(d->id, d->item));
+ break;
+
+ case INDEX_ITEM_FIND:
+ {
+ Elm_Object_Item *i = elm_index_item_find(d->id, d->item);
+ if (i)
+ {
+ printf("Item Find - Found Item.\n");
+ elm_object_item_del(i);
+ }
+ }
+ break;
+
+ case INDEX_HORIZONTAL:
+ elm_index_horizontal_set(d->id, EINA_TRUE);
+ break;
+
+ case INDEX_INDICATOR_DISABLED:
+ elm_index_indicator_disabled_set(d->id, EINA_TRUE);
+ break;
+
+ case INDEX_CLEAR:
+ elm_index_item_clear(d->id);
+ break;
+
+ case API_STATE_LAST:
+ break;
+
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static Elm_Genlist_Item_Class itci;
+static char *
+_gli_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ int j = (uintptr_t)data;
+ snprintf(buf, sizeof(buf), "%c%c",
+ 'A' + ((j >> 4) & 0xf),
+ 'a' + ((j ) & 0xf)
+ );
+ return strdup(buf);
+}
+
+static void
+_index_delay_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ // called on a change but delayed in case multiple changes happen in a
+ // short timespan
+ elm_genlist_item_bring_in(elm_object_item_data_get(event_info),
+ ELM_GENLIST_ITEM_SCROLLTO_TOP);
+}
+
+static void
+_index_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ // this is called on every change, no matter how often
+ // elm_genlist_item_bring_in(event_info);
+}
+
+static void
+_index_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ // called on final select
+ elm_genlist_item_bring_in(elm_object_item_data_get(event_info),
+ ELM_GENLIST_ITEM_SCROLLTO_TOP);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+static void
+_id_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("Current Index : %s\n", elm_index_item_letter_get((const Elm_Object_Item *)event_info));
+}
+
+static void
+_omit_check_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *id = data;
+ Eina_Bool omit = elm_check_state_get(obj);
+ if (!id) return;
+
+ printf("Omit feature enabled : %d\n", omit);
+ elm_index_omit_enabled_set(id, omit);
+}
+
+void
+test_index(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bxx, *gl, *id, *bt, *tb, *ck;
+ Elm_Object_Item *glit;
+ int i, j;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("index", "Index");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(tb);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, gl, 0, 0, 1, 1);
+ evas_object_show(gl);
+
+ api->dt.id = id = elm_index_add(win);
+ evas_object_size_hint_weight_set(id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(id, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_index_autohide_disabled_set(id, EINA_FALSE);
+ elm_table_pack(tb, id, 0, 0, 1, 1);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Omit mode : ");
+ elm_object_style_set(ck, "toggle");
+ elm_box_pack_end(bxx, ck);
+ evas_object_smart_callback_add(ck, "changed", _omit_check_changed_cb, id);
+ evas_object_show(ck);
+
+ elm_box_pack_end(bxx, tb);
+
+ evas_object_show(id);
+
+ itci.item_style = "default";
+ itci.func.text_get = _gli_text_get;
+ itci.func.content_get = NULL;
+ itci.func.state_get = NULL;
+ itci.func.del = NULL;
+
+ j = 0;
+ for (i = 0; i < 100; i++)
+ {
+ glit = elm_genlist_item_append(gl, &itci,
+ (void *)(uintptr_t)j/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ NULL/* func */, NULL/* func data */);
+ if (!(j & 0xf))
+ {
+ char buf[32];
+
+ snprintf(buf, sizeof(buf), "%c", 'A' + ((j >> 4) & 0xf));
+ elm_index_item_append(id, buf, _id_cb, glit);
+ if (*buf == 'G') /* Just init dt->item later used in API test */
+ api->dt.item = glit;
+ }
+ j += 2;
+ }
+ evas_object_smart_callback_add(id, "delay,changed", _index_delay_changed_cb, NULL);
+ evas_object_smart_callback_add(id, "changed", _index_changed_cb, NULL);
+ evas_object_smart_callback_add(id, "selected", _index_selected_cb, NULL);
+ elm_index_level_go(id, 0);
+
+ evas_object_resize(win, 320, 270);
+ evas_object_show(win);
+}
+
+/***********/
+
+typedef struct _Test_Index2_Elements
+{
+ Evas_Object *entry, *lst, *id;
+} Test_Index2_Elements;
+
+static void
+_test_index2_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ /* FIXME it won't be called if elm_test main window is closed */
+ free(data);
+}
+
+static int
+_test_index2_cmp(const void *data1, const void *data2)
+{
+ const char *label1, *label2;
+ const Elm_Object_Item *li_it1 = data1;
+ const Elm_Object_Item *li_it2 = data2;
+
+ label1 = elm_object_item_text_get(li_it1);
+ label2 = elm_object_item_text_get(li_it2);
+
+ return strcasecmp(label1, label2);
+}
+
+static int
+_test_index2_icmp(const void *data1, const void *data2)
+{
+ const char *label1, *label2;
+ const Elm_Object_Item *index_it1 = data1;
+ const Elm_Object_Item *index_it2 = data2;
+
+ label1 = elm_index_item_letter_get(index_it1);
+ label2 = elm_index_item_letter_get(index_it2);
+
+ return strcasecmp(label1, label2);
+}
+
+static void
+_test_index2_it_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Test_Index2_Elements *gui = data;
+ Elm_Object_Item *list_it;
+ const char *label;
+ char letter[2];
+
+ label = elm_object_text_get(gui->entry);
+ snprintf(letter, sizeof(letter), "%c", label[0]);
+ list_it = elm_list_item_sorted_insert(gui->lst, label, NULL, NULL, NULL,
+ NULL, _test_index2_cmp);
+ elm_index_item_sorted_insert(gui->id, letter, NULL, list_it, _test_index2_icmp,
+ _test_index2_cmp);
+ elm_index_level_go(gui->id, 0);
+ elm_list_go(gui->lst);
+ /* FIXME it's not showing the recently added item */
+ elm_list_item_show(list_it);
+}
+
+static void
+_test_index2_clear(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Test_Index2_Elements *gui = data;
+
+ elm_list_clear(gui->lst);
+ elm_index_item_clear(gui->id);
+}
+
+static void
+_test_index2_it_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Test_Index2_Elements *gui = data;
+ const char *label, *label_next;
+ Elm_Object_Item *list_it = event_info, *list_it_next, *iit;
+
+ list_it_next = elm_list_item_next(list_it);
+ if (!list_it_next)
+ {
+ iit = elm_index_item_find(gui->id, list_it);
+ if (iit) elm_object_item_del(iit);
+ elm_object_item_del(list_it);
+ return;
+ }
+
+ label = elm_object_item_text_get(list_it);
+ label_next = elm_object_item_text_get(list_it_next);
+
+ iit = elm_index_item_find(gui->id, list_it);
+ if (iit)
+ {
+ if (label[0] == label_next[0])
+ elm_object_item_data_set(iit, list_it_next);
+ else
+ elm_object_item_del(iit);
+ }
+
+ elm_object_item_del(list_it);
+}
+
+static void
+_test_index2_id_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ elm_list_item_show(elm_object_item_data_get(event_info));
+}
+
+void
+test_index2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *bt;
+ Test_Index2_Elements *gui;
+
+ gui = malloc(sizeof(*gui));
+
+ win = elm_win_util_standard_add("sorted-index-list", "Sorted Index and List");
+ evas_object_smart_callback_add(win, "delete,request", _test_index2_del, gui);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ gui->id = elm_index_add(win);
+ evas_object_size_hint_weight_set(gui->id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, gui->id);
+ evas_object_smart_callback_add(gui->id, "delay,changed",
+ _test_index2_id_changed, NULL);
+ evas_object_show(gui->id);
+
+ gui->entry = elm_entry_add(win);
+ elm_entry_scrollable_set(gui->entry, EINA_TRUE);
+ elm_object_text_set(gui->entry, "Label");
+ elm_entry_single_line_set(gui->entry, EINA_TRUE);
+ evas_object_size_hint_weight_set(gui->entry, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_fill_set(gui->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(gui->entry, "activated", _test_index2_it_add, gui);
+ elm_box_pack_end(box, gui->entry);
+ evas_object_show(gui->entry);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Add");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, bt);
+ evas_object_smart_callback_add(bt, "clicked", _test_index2_it_add, gui);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Clear");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, bt);
+ evas_object_smart_callback_add(bt, "clicked", _test_index2_clear, gui);
+ evas_object_show(bt);
+
+ gui->lst = elm_list_add(win);
+ elm_box_pack_end(box, gui->lst);
+ evas_object_size_hint_weight_set(gui->lst, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(gui->lst, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(gui->lst, "selected", _test_index2_it_del,
+ gui);
+ elm_list_go(gui->lst);
+ evas_object_show(gui->lst);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+/***** Index 3 Mode ******/
+
+static void
+_index_priority_change_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *index = data;
+ int priority;
+
+ priority = elm_index_standard_priority_get(index);
+
+ if (priority == 0)
+ elm_index_standard_priority_set(index, 1);
+ else
+ elm_index_standard_priority_set(index, 0);
+
+ printf("Priority changed to : %d\n", elm_index_standard_priority_get(index));
+}
+
+void
+test_index3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *index, *bt;
+ Elm_Object_Item *it;
+ int i, j, len;
+ char *str;
+ char buf[PATH_MAX] = {0, };
+
+ win = elm_win_util_standard_add("Index-priority", "Index priority for multilingual");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ index = elm_index_add(win);
+ evas_object_size_hint_weight_set(index, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(index, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_index_autohide_disabled_set(index, EINA_TRUE);
+ elm_index_omit_enabled_set(index, EINA_TRUE);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Priority Change");
+ evas_object_smart_callback_add(bt, "clicked", _index_priority_change_cb, index);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, index);
+
+ evas_object_show(index);
+
+ //1. Special character & Numbers
+ elm_index_item_append(index, "#", NULL, NULL);
+
+ //2. Local language
+ str = "ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅍㅎ";
+ len = strlen(str);
+
+ i = 0;
+ while (i < len)
+ {
+ j = i;
+ eina_unicode_utf8_next_get(str, &i);
+ snprintf(buf, i - j + 1, "%s", str + j);
+ buf[i - j + 1] = 0;
+
+ it = elm_index_item_append(index, buf, NULL, NULL);
+ elm_index_item_priority_set(it, 0);
+ }
+
+ //3. English
+ str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ len = strlen(str);
+
+ i = 0;
+ while (i < len)
+ {
+ j = i;
+ eina_unicode_utf8_next_get(str, &i);
+ snprintf(buf, i - j + 1, "%s", str + j);
+ buf[i - j + 1] = 0;
+
+ it = elm_index_item_append(index, buf, NULL, NULL);
+ elm_index_item_priority_set(it, 1);
+ }
+
+ elm_index_level_go(index, 0);
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
+
+/***** Index Horizontal Mode ******/
+
+static void
+_index_list_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ elm_list_item_bring_in(elm_object_item_data_get(event_info));
+}
+
+void
+test_index_horizontal(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *list, *id, *tb;
+ Elm_Object_Item *lit;
+ int i;
+ char buf[30];
+
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("index-horizontal", "Index Horizontal");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb);
+ evas_object_show(tb);
+
+ list = elm_list_add(win);
+ elm_list_horizontal_set(list, EINA_TRUE);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, list, 0, 0, 1, 1);
+ evas_object_show(list);
+
+ api->dt.id = id = elm_index_add(win);
+ elm_index_horizontal_set(id, EINA_TRUE);
+ evas_object_size_hint_weight_set(id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(id, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, id, 0, 0, 1, 1);
+ evas_object_show(id);
+
+ for (i = 1; i < 15; i++)
+ {
+ sprintf(buf, "Item #%d", i);
+ lit = elm_list_item_append(list, buf, NULL, NULL, NULL, NULL);
+ sprintf(buf, "%d", i);
+ elm_index_item_append(id, buf, _id_cb, lit);
+ }
+ evas_object_smart_callback_add(id, "changed", _index_list_changed_cb, NULL);
+ elm_index_level_go(id, 0);
+
+ evas_object_resize(win, 480, 320);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_inwin.c b/src/bin/elementary/test_inwin.c
new file mode 100644
index 0000000000..9dae4c091d
--- /dev/null
+++ b/src/bin/elementary/test_inwin.c
@@ -0,0 +1,129 @@
+#include "test.h"
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ void *inwin;
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ CONTENT_UNSET,
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+ Evas_Object *t;
+ switch(api->state)
+ {
+ case CONTENT_UNSET:
+ t = elm_win_inwin_content_unset(api->inwin);
+ evas_object_del(t);
+ t = elm_label_add(elm_object_parent_widget_get(api->inwin));
+ elm_object_text_set(t, "Content was unset.<br>DONE!");
+ elm_win_inwin_content_set(api->inwin, t);
+ evas_object_show(t);
+
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_inwin(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *inwin, *lb, *bxx, *bt;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("inwin", "InWin");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ inwin = elm_win_inwin_add(win);
+ api->inwin = inwin;
+ evas_object_show(inwin);
+
+ bxx = elm_box_add(inwin);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bxx);
+
+ bt = elm_button_add(inwin);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "This is an \"inwin\" - a window in a<br/>"
+ "window. This is handy for quick popups<br/>"
+ "you want centered, taking over the window<br/>"
+ "until dismissed somehow. Unlike hovers they<br/>"
+ "don't hover over their target.");
+ elm_box_pack_end(bxx, lb);
+ elm_win_inwin_content_set(inwin, bxx);
+ evas_object_show(lb);
+
+ evas_object_resize(win, 320, 240);
+ evas_object_show(win);
+}
+
+void
+test_inwin2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *inwin, *lb;
+
+ win = elm_win_util_standard_add("inwin2", "InWin 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ inwin = elm_win_inwin_add(win);
+ elm_object_style_set(inwin, "minimal_vertical");
+ evas_object_show(inwin);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "This is an \"inwin\" - a window in a<br/>"
+ "window. This is handy for quick popups<br/>"
+ "you want centered, taking over the window<br/>"
+ "until dismissed somehow. Unlike hovers they<br/>"
+ "don't hover over their target.<br/>"
+ "<br/>"
+ "This \"minimal_vertical\" inwin style compacts<br/>"
+ "itself vertically to the size of its contents<br/> "
+ "minimum size.");
+ elm_win_inwin_content_set(inwin, lb);
+ evas_object_show(lb);
+
+ evas_object_resize(win, 320, 240);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_label.c b/src/bin/elementary/test_label.c
new file mode 100644
index 0000000000..8aaf2ef72e
--- /dev/null
+++ b/src/bin/elementary/test_label.c
@@ -0,0 +1,376 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+enum _slide_style
+{
+ SLIDE_SHORT,
+ SLIDE_LONG,
+ SLIDE_BOUNCE,
+ SLIDE_STYLE_LAST
+};
+
+/*** Label *******************************************************************/
+void
+test_label(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *lb;
+
+ win = elm_win_util_standard_add("label", "Label");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "<b>This is a small label</b>"
+ );
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "This is a larger label with newlines<br/>"
+ "to make it bigger, bit it won't expand or wrap<br/>"
+ "just be a block of text that can't change its<br/>"
+ "formatting as it's fixed based on text<br/>"
+ );
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ lb = elm_label_add(win);
+ elm_label_line_wrap_set(lb, ELM_WRAP_CHAR);
+ elm_object_text_set(lb,
+ "<b>"
+ "This is more text designed to line-wrap here as "
+ "This object is resized horizontally. As it is "
+ "resized vertically though, nothing should change. "
+ "The amount of space allocated vertically should "
+ "change as horizontal size changes."
+ "</b>"
+ );
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "This small label set to wrap"
+ );
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "You can also use all the default entry style tags, like "
+ "<hilight>hilight</hilight>, <success>success</success>, "
+ "<bigger>bigger</bigger>, <smaller>smaller</smaller>, etc..."
+ );
+ elm_label_line_wrap_set(lb, ELM_WRAP_WORD);
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ evas_object_resize(win, 320, 300);
+
+ evas_object_show(bx);
+ evas_object_show(win);
+ elm_win_resize_object_add(win, bx);
+}
+
+/*** Label Slide *************************************************************/
+static void
+_cb_size_radio_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
+{
+ Evas_Object *lb = data;
+ int style = elm_radio_value_get((Evas_Object *)obj);
+ switch (style)
+ {
+ case SLIDE_SHORT:
+ elm_object_style_set(lb, "slide_short");
+ break;
+
+ case SLIDE_LONG:
+ elm_object_style_set(lb, "slide_long");
+ break;
+
+ case SLIDE_BOUNCE:
+ elm_object_style_set(lb, "slide_bounce");
+ break;
+
+ default:
+ return;
+ }
+}
+
+static void
+_duration_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *lb = data;
+ double val = elm_slider_value_get(obj);
+
+ elm_label_slide_duration_set(lb, val);
+ elm_label_slide_go(lb);
+
+ Evas_Object *sl = evas_object_data_get(lb, "speed_slider");
+ elm_slider_value_set(sl, elm_label_slide_speed_get(lb));
+}
+
+static void
+_speed_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *lb = data;
+ double val = elm_slider_value_get(obj);
+
+ elm_label_slide_speed_set(lb, val);
+ elm_label_slide_go(lb);
+
+ Evas_Object *sl = evas_object_data_get(lb, "duration_slider");
+ elm_slider_value_set(sl, elm_label_slide_duration_get(lb));
+}
+
+static void
+_label_resize_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *speed_slider = evas_object_data_get(obj, "speed_slider");
+ Evas_Object *duration_slider = evas_object_data_get(obj, "duration_slider");
+
+ elm_slider_value_set(duration_slider, elm_label_slide_duration_get(obj));
+ elm_slider_value_set(speed_slider, elm_label_slide_speed_get(obj));
+}
+
+static void
+_label_slide_stop_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Eina_List *lbs = data, *itr;
+ Evas_Object *lb;
+ EINA_LIST_FOREACH(lbs, itr, lb)
+ {
+ elm_label_slide_speed_set(lb, 0.01);
+ elm_label_slide_go(lb);
+ }
+}
+
+void
+test_label_slide(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gd, *rect, *lb, *lb1, *lb2, *rd, *rdg, *sl, *bt;
+ Eina_List *lbs = NULL;
+
+ win = elm_win_util_standard_add("label-slide", "Label Slide");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ gd = elm_grid_add(win);
+ elm_grid_size_set(gd, 100, 100);
+ evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, gd);
+ evas_object_show(gd);
+
+ /* Test Label Slide */
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "<b>Test Label Slide:</b>");
+ elm_grid_pack(gd, lb, 5, 0, 90, 10);
+ evas_object_show(lb);
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ elm_grid_pack(gd, rect, 5, 10, 90, 10);
+ evas_object_color_set(rect, 255, 125, 125, 255);
+ evas_object_show(rect);
+
+ lb = elm_label_add(win);
+ elm_object_style_set(lb, "slide_short");
+ elm_object_text_set(lb,
+ "This is a label set to slide. "
+ "If set slide to true the text of the label "
+ "will slide/scroll through the length of label."
+ "This only works with the themes \"slide_short\", "
+ "\"slide_long\" and \"slide_bounce\"."
+ );
+ elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_AUTO);
+ elm_label_slide_speed_set(lb, 40.0);
+ elm_label_slide_go(lb);
+ elm_grid_pack(gd, lb, 5, 10, 90, 10);
+ evas_object_show(lb);
+ lbs = eina_list_append(lbs, lb);
+
+ /* The speed or the duration of the slide animation will change when the
+ * label change size, so we need to update the sliders on resize. */
+ evas_object_event_callback_add(lb, EVAS_CALLBACK_RESIZE, _label_resize_cb, NULL);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, SLIDE_SHORT);
+ elm_object_text_set(rd, "slide_short");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb);
+ elm_grid_pack(gd, rd, 5, 20, 30, 10);
+ evas_object_show(rd);
+ rdg = rd;
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, SLIDE_LONG);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "slide_long");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb);
+ elm_grid_pack(gd, rd, 35, 20, 30, 10);
+ evas_object_show(rd);
+
+ rd = elm_radio_add(win);
+ elm_radio_state_value_set(rd, SLIDE_BOUNCE);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "slide_bounce");
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb);
+ elm_grid_pack(gd, rd, 65, 20, 30, 10);
+ evas_object_show(rd);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "Slide Duration");
+ elm_slider_unit_format_set(sl, "%1.1f sec");
+ elm_slider_min_max_set(sl, 3, 40);
+ elm_slider_value_set(sl, elm_label_slide_duration_get(lb));
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_smart_callback_add(sl, "changed", _duration_change_cb, lb);
+ evas_object_data_set(lb, "duration_slider", sl);
+ elm_grid_pack(gd, sl, 5, 30, 90, 10);
+ evas_object_show(sl);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "Slide Speed");
+ elm_slider_unit_format_set(sl, "%1.1f px/sec");
+ elm_slider_min_max_set(sl, 40, 300);
+ elm_slider_value_set(sl, elm_label_slide_speed_get(lb));
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_smart_callback_add(sl, "changed", _speed_change_cb, lb);
+ evas_object_data_set(lb, "speed_slider", sl);
+ elm_grid_pack(gd, sl, 5, 40, 90, 10);
+ evas_object_show(sl);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Stop sliding");
+ elm_grid_pack(gd, bt, 40, 50, 20, 10);
+ evas_object_show(bt);
+
+ /* Test 2 label at the same speed */
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "<b>Test 2 label with the same speed:</b>");
+ elm_grid_pack(gd, lb, 5, 60, 90, 10);
+ evas_object_show(lb);
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ elm_grid_pack(gd, rect, 5, 70, 90, 20);
+ evas_object_color_set(rect, 255, 125, 125, 255);
+ evas_object_show(rect);
+
+ lb1 = elm_label_add(win);
+ elm_object_style_set(lb1, "slide_short");
+ elm_object_text_set(lb1, "This is a label set to slide with a fixed speed,"
+ " should match the speed with the below label."
+ " This label has few extra char for testing.");
+ elm_label_slide_mode_set(lb1, ELM_LABEL_SLIDE_MODE_ALWAYS);
+ elm_label_slide_speed_set(lb1, 40.0);
+ elm_label_slide_go(lb1);
+ elm_grid_pack(gd, lb1, 5, 70, 90, 10);
+ evas_object_show(lb1);
+ lbs = eina_list_append(lbs, lb1);
+
+ lb2 = elm_label_add(win);
+ elm_object_style_set(lb2, "slide_long");
+ elm_object_text_set(lb2, "This is a label set to slide and will"
+ " match the speed of the upper label.");
+ elm_label_slide_mode_set(lb2, ELM_LABEL_SLIDE_MODE_ALWAYS);
+ elm_label_slide_speed_set(lb2, 40.0);
+ elm_label_slide_go(lb2);
+ elm_grid_pack(gd, lb2, 5, 80, 90, 10);
+ evas_object_show(lb2);
+ lbs = eina_list_append(lbs, lb2);
+
+ evas_object_smart_callback_add(bt, "clicked", _label_slide_stop_cb, lbs);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+/*** Label Wrap **************************************************************/
+void
+test_label_wrap(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *lb;
+
+ win = elm_win_util_standard_add("label-wrap", "Label Wrap");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "This is text for our label, that is long but "
+ "not too long. The label is designed to have line-wrap."
+ );
+ elm_label_line_wrap_set(lb, ELM_WRAP_CHAR);
+ elm_label_wrap_width_set(lb, ELM_SCALE_SIZE(200));
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, lb);
+ evas_object_show(lb);
+
+ evas_object_show(win);
+}
+
+
+/*** Label Ellipsis **********************************************************/
+void
+test_label_ellipsis(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *lb;
+
+ win = elm_win_util_standard_add("label-ellipsis", "Label Ellipsis");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ elm_box_padding_set(bx, 0, ELM_SCALE_SIZE(10));
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "This is a label set to ellipsis. "
+ "If set ellipsis to true and the text doesn't fit "
+ "in the label an ellipsis(\"...\") will be shown "
+ "at the end of the widget."
+ );
+ elm_label_ellipsis_set(lb, EINA_TRUE);
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "<big>"
+ "This label also have <b>markups</b>, "
+ "<hilight>hilight</hilight>, "
+ "<success>success</success>, "
+ "<failure>failure</failure>."
+ "</big>"
+ );
+ elm_label_ellipsis_set(lb, EINA_TRUE);
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ evas_object_resize(win, 300, 100);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_launcher.c b/src/bin/elementary/test_launcher.c
new file mode 100644
index 0000000000..910fa6998f
--- /dev/null
+++ b/src/bin/elementary/test_launcher.c
@@ -0,0 +1,921 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+mode_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *mb;
+ Eina_List *mbs, *l;
+
+ mbs = evas_object_data_get(win, "mbs");
+ EINA_LIST_FOREACH(mbs, l, mb)
+ {
+ if (elm_mapbuf_enabled_get(mb))
+ elm_mapbuf_enabled_set(mb, EINA_FALSE);
+ else
+ elm_mapbuf_enabled_set(mb, EINA_TRUE);
+ }
+}
+
+static void
+full_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win));
+}
+
+static void
+alpha_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *mb;
+ Eina_List *mbs, *l;
+
+ mbs = evas_object_data_get(win, "mbs");
+ EINA_LIST_FOREACH(mbs, l, mb)
+ {
+ elm_mapbuf_alpha_set(mb, elm_check_state_get(obj));
+ }
+}
+
+static void
+smooth_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *mb;
+ Eina_List *mbs, *l;
+
+ mbs = evas_object_data_get(win, "mbs");
+ EINA_LIST_FOREACH(mbs, l, mb)
+ {
+ elm_mapbuf_smooth_set(mb, elm_check_state_get(obj));
+ }
+}
+
+static void
+close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static Eina_Bool
+tim_cb(void *data)
+{
+ Evas_Object *tb, *sc, *mb;
+ Eina_List *list, *l;
+
+ evas_object_data_del(data, "timer");
+ tb = evas_object_data_get(data, "tb");
+ sc = evas_object_data_get(data, "sc");
+ elm_object_scroll_freeze_push(sc);
+ evas_object_data_set(data, "dragging", (void *)(long)(1));
+ evas_object_color_set(data, 255, 255, 255, 255);
+ list = (Eina_List *)evas_object_data_get
+ (elm_object_top_widget_get(data), "mbs");
+ EINA_LIST_FOREACH(list, l, mb)
+ evas_object_color_set(mb, 128, 128, 128, 128);
+ elm_table_unpack(tb, data);
+ return EINA_FALSE;
+}
+
+static void
+ic_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Ecore_Timer *tim;
+
+ tim = evas_object_data_get(obj, "timer");
+ if (tim)
+ {
+ evas_object_data_del(obj, "timer");
+ ecore_timer_del(tim);
+ }
+}
+
+static void
+ic_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = event_info;
+ Ecore_Timer *tim;
+ Evas_Coord x, y, w, h;
+
+ evas_object_color_set(data, 128, 0, 0, 128);
+
+ tim = evas_object_data_get(obj, "timer");
+ if (tim) evas_object_data_del(obj, "timer");
+ tim = ecore_timer_add(1.0, tim_cb, obj);
+ evas_object_data_set(obj, "timer", tim);
+
+ evas_object_geometry_get(data, &x, &y, &w, &h);
+ evas_object_data_set(obj, "x", (void *)(uintptr_t)(ev->canvas.x));
+ evas_object_data_set(obj, "y", (void *)(uintptr_t)(ev->canvas.y));
+ evas_object_data_set(obj, "px", (void *)(uintptr_t)(x));
+ evas_object_data_set(obj, "py", (void *)(uintptr_t)(y));
+
+ if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
+ {
+ printf("double click %p\n", obj);
+ }
+}
+
+static void
+ic_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Up *ev = event_info;
+ Ecore_Timer *tim;
+
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+ evas_object_color_set(data, 255, 255, 255, 255);
+ tim = evas_object_data_get(obj, "timer");
+ if (tim)
+ {
+ evas_object_data_del(obj, "timer");
+ ecore_timer_del(tim);
+ }
+ if (evas_object_data_get(obj, "dragging"))
+ {
+ Evas_Object *tb, *sc, *mb;
+ Eina_List *list, *l;
+ int tbx, tby;
+
+ evas_object_data_del(obj, "dragging");
+ tb = evas_object_data_get(obj, "tb");
+ sc = evas_object_data_get(obj, "sc");
+ elm_object_scroll_freeze_pop(sc);
+ tbx = (int)(uintptr_t)evas_object_data_get(obj, "tbx");
+ tby = (int)(uintptr_t)evas_object_data_get(obj, "tby");
+ elm_table_pack(tb, obj, tbx, tby, 1, 1);
+ list = (Eina_List *)evas_object_data_get
+ (elm_object_top_widget_get(obj), "mbs");
+ EINA_LIST_FOREACH(list, l, mb)
+ evas_object_color_set(mb, 255, 255, 255, 255);
+ }
+}
+
+static void
+ic_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev = event_info;
+ if (evas_object_data_get(obj, "dragging"))
+ {
+ Evas_Coord x, y, px, py;
+
+ x = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "x");
+ y = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "y");
+ px = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "px");
+ py = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "py");
+ evas_object_move(obj,
+ px + ev->cur.canvas.x - x,
+ py + ev->cur.canvas.y - y);
+ }
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ {
+ Ecore_Timer *tim;
+
+ tim = evas_object_data_get(obj, "timer");
+ if (tim)
+ {
+ evas_object_data_del(obj, "timer");
+ ecore_timer_del(tim);
+ }
+ evas_object_color_set(data, 255, 255, 255, 255);
+ return;
+ }
+}
+
+void
+test_launcher(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *sc, *tb, *pad, *bt, *ic, *lb, *tb2, *mb, *ck, *bx, *bx2;
+ int i, j, k, n, m;
+ char buf[PATH_MAX];
+ const char *names[] =
+ {
+ "Hello", "World", "Spam", "Egg",
+ "Ham", "Good", "Bad", "Milk",
+ "Smell", "Of", "Sky", "Gold",
+ "Hole", "Pig", "And", "Calm"
+ };
+ Eina_List *mbs = NULL;
+
+ win = elm_win_add(NULL, "launcher", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Launcher");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bx = elm_box_add(win);
+ elm_box_homogeneous_set(bx, EINA_TRUE);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+
+ sc = elm_scroller_add(win);
+ elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE);
+ elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ n = 0; m = 0;
+ for (k = 0 ; k < 8; k++)
+ {
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, 0.0, 0.0);
+ evas_object_size_hint_align_set(tb, 0.5, 0.5);
+
+ pad = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_min_set(pad, 470, 4);
+ evas_object_size_hint_weight_set(pad, 0.0, 0.0);
+ evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, pad, 1, 0, 5, 1);
+
+ pad = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_min_set(pad, 470, 4);
+ evas_object_size_hint_weight_set(pad, 0.0, 0.0);
+ evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, pad, 1, 11, 5, 1);
+
+ pad = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_min_set(pad, 4, 4);
+ evas_object_size_hint_weight_set(pad, 0.0, 0.0);
+ evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, pad, 0, 1, 1, 10);
+
+ pad = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_min_set(pad, 4, 4);
+ evas_object_size_hint_weight_set(pad, 0.0, 0.0);
+ evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, pad, 6, 1, 1, 10);
+
+ mb = elm_mapbuf_add(win);
+ elm_object_content_set(mb, tb);
+ evas_object_show(tb);
+
+ for (j = 0; j < 5; j++)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ ic = elm_icon_add(win);
+ elm_object_scale_set(ic, 0.5);
+ snprintf(buf, sizeof(buf), "%s/images/icon_%02i.png", elm_app_data_dir_get(), n);
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ elm_table_pack(tb, ic, 1 + i, 1 + (j * 2), 1, 1);
+ evas_object_show(ic);
+
+ lb = elm_label_add(win);
+ elm_object_style_set(lb, "marker");
+ elm_object_text_set(lb, names[m]);
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lb, 0.5, 0.5);
+ elm_table_pack(tb, lb, 1 + i, 1 + (j * 2) + 1, 1, 1);
+ evas_object_show(lb);
+
+ evas_object_event_callback_add(ic, EVAS_CALLBACK_DEL, ic_del_cb, ic);
+
+ evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_DOWN, ic_down_cb, ic);
+ evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_UP, ic_up_cb, ic);
+ evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_MOVE, ic_move_cb, ic);
+
+ evas_object_data_set(ic, "lb", lb);
+ evas_object_data_set(ic, "tb", tb);
+ evas_object_data_set(ic, "sc", sc);
+ evas_object_data_set(ic, "bx", bx);
+ evas_object_data_set(ic, "mb", mb);
+ evas_object_data_set(ic, "tbx", (void *)(uintptr_t)(1 + i));
+ evas_object_data_set(ic, "tby", (void *)(uintptr_t)(1 + (j * 2)));
+
+ n++; if (n > 23) n = 0;
+ m++; if (m > 15) m = 0;
+ }
+ }
+
+ elm_box_pack_end(bx, mb);
+ evas_object_show(mb);
+
+ mbs = eina_list_append(mbs, mb);
+ }
+
+ // fixme: free mbs
+ evas_object_data_set(win, "mbs", mbs);
+
+ bx2 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_horizontal_set(bx2, EINA_FALSE);
+ elm_win_resize_object_add(win, bx2);
+ evas_object_show(bx2);
+
+ elm_object_content_set(sc, bx);
+ evas_object_show(bx);
+
+ elm_scroller_page_relative_set(sc, 1.0, 1.0);
+ evas_object_show(sc);
+
+ tb2 = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(tb2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, tb2);
+
+ elm_box_pack_end(bx2, sc);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Map");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_smart_callback_add(ck, "changed", mode_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.05, 0.99);
+ elm_table_pack(tb2, ck, 0, 0, 1, 1);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "A");
+ elm_check_state_set(ck, EINA_TRUE);
+ evas_object_smart_callback_add(ck, "changed", alpha_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.20, 0.99);
+ elm_table_pack(tb2, ck, 1, 0, 1, 1);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Smo");
+ elm_check_state_set(ck, EINA_TRUE);
+ evas_object_smart_callback_add(ck, "changed", smooth_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.40, 0.99);
+ elm_table_pack(tb2, ck, 2, 0, 1, 1);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "FS");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_smart_callback_add(ck, "changed", full_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.5, 0.99);
+ elm_table_pack(tb2, ck, 3, 0, 1, 1);
+ evas_object_show(ck);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", close_cb, win);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.95, 0.99);
+ elm_table_pack(tb2, bt, 4, 0, 1, 1);
+ evas_object_show(bt);
+
+ evas_object_show(tb2);
+
+ evas_object_resize(win, 480, 400);
+ evas_object_show(win);
+}
+
+void
+test_launcher2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *sc, *bt, *tb2, *mb, *ck, *bx, *ly;
+ int k;
+ char buf[PATH_MAX];
+ Eina_List *mbs = NULL;
+
+ win = elm_win_add(NULL, "launcher2", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Launcher 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bx = elm_box_add(win);
+ elm_box_homogeneous_set(bx, EINA_TRUE);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+
+ for (k = 0 ; k < 8; k++)
+ {
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "layout");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 1");
+ elm_object_part_content_set(ly, "element1", bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 2");
+ elm_object_part_content_set(ly, "element2", bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 3");
+ elm_object_part_content_set(ly, "element3", bt);
+ evas_object_show(bt);
+
+ mb = elm_mapbuf_add(win);
+ elm_object_content_set(mb, ly);
+ evas_object_show(ly);
+
+ elm_box_pack_end(bx, mb);
+ evas_object_show(mb);
+
+ mbs = eina_list_append(mbs, mb);
+ }
+
+ // fixme: free mbs
+ evas_object_data_set(win, "mbs", mbs);
+
+ sc = elm_scroller_add(win);
+ elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE);
+ elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, sc);
+
+ elm_object_content_set(sc, bx);
+ evas_object_show(bx);
+
+ //content size of one page is 550 x 410
+ elm_scroller_page_size_set(sc, 555, 410);
+ evas_object_show(sc);
+
+ tb2 = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb2);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Map");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_smart_callback_add(ck, "changed", mode_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.05, 0.99);
+ elm_table_pack(tb2, ck, 0, 0, 1, 1);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "A");
+ elm_check_state_set(ck, EINA_TRUE);
+ evas_object_smart_callback_add(ck, "changed", alpha_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.20, 0.99);
+ elm_table_pack(tb2, ck, 1, 0, 1, 1);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Smo");
+ elm_check_state_set(ck, EINA_TRUE);
+ evas_object_smart_callback_add(ck, "changed", smooth_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.40, 0.99);
+ elm_table_pack(tb2, ck, 2, 0, 1, 1);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "FS");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_smart_callback_add(ck, "changed", full_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.5, 0.99);
+ elm_table_pack(tb2, ck, 3, 0, 1, 1);
+ evas_object_show(ck);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", close_cb, win);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.95, 0.99);
+ elm_table_pack(tb2, bt, 4, 0, 1, 1);
+ evas_object_show(bt);
+
+ evas_object_show(tb2);
+
+ evas_object_resize(win, 555, 410);
+ evas_object_show(win);
+}
+
+static void
+l3_mode_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *mb;
+ Eina_List *mbs, *l;
+
+ mbs = evas_object_data_get(win, "mbs");
+ EINA_LIST_FOREACH(mbs, l, mb)
+ {
+ if (elm_mapbuf_enabled_get(mb))
+ elm_mapbuf_enabled_set(mb, EINA_FALSE);
+ else
+ elm_mapbuf_enabled_set(mb, EINA_TRUE);
+ }
+}
+
+static void
+l3_full_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win));
+}
+
+static void
+l3_alpha_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *mb;
+ Eina_List *mbs, *l;
+
+ mbs = evas_object_data_get(win, "mbs");
+ EINA_LIST_FOREACH(mbs, l, mb)
+ {
+ elm_mapbuf_alpha_set(mb, elm_check_state_get(obj));
+ }
+}
+
+static void
+l3_smooth_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *mb;
+ Eina_List *mbs, *l;
+
+ mbs = evas_object_data_get(win, "mbs");
+ EINA_LIST_FOREACH(mbs, l, mb)
+ {
+ elm_mapbuf_smooth_set(mb, elm_check_state_get(obj));
+ }
+}
+
+static void
+l3_hidden_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *mb;
+ Eina_List *mbs, *l;
+
+ mbs = evas_object_data_get(win, "mbs");
+ EINA_LIST_FOREACH(mbs, l, mb)
+ {
+ if (evas_object_visible_get(mb)) evas_object_hide(mb);
+ else evas_object_show(mb);
+ }
+}
+
+static void
+l3_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static Eina_Bool
+l3_tim_cb(void *data)
+{
+ Evas_Object *ly, *ly2, *sc, *mb;
+ Eina_List *list, *l;
+ char buf[256];
+ int slx, sly;
+
+ evas_object_data_del(data, "timer");
+ ly = evas_object_data_get(data, "ly");
+ ly2 = evas_object_data_get(data, "ly2");
+ sc = evas_object_data_get(data, "sc");
+ elm_object_scroll_freeze_push(sc);
+ evas_object_data_set(data, "dragging", (void *)(long)1);
+ evas_object_color_set(data, 255, 255, 255, 255);
+ list = (Eina_List *)evas_object_data_get
+ (elm_object_top_widget_get(data), "mbs");
+ EINA_LIST_FOREACH(list, l, mb)
+ evas_object_color_set(mb, 128, 128, 128, 128);
+ slx = (int)(uintptr_t)evas_object_data_get(data, "slx");
+ sly = (int)(uintptr_t)evas_object_data_get(data, "sly");
+ snprintf(buf, sizeof(buf), "slot.%i.%i", slx, sly);
+ elm_object_part_content_unset(ly, buf);
+ elm_layout_signal_emit(ly2, "drag", "app");
+ return EINA_FALSE;
+}
+
+static void
+l3_ic_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Ecore_Timer *tim;
+
+ tim = evas_object_data_get(obj, "timer");
+ if (tim)
+ {
+ evas_object_data_del(obj, "timer");
+ ecore_timer_del(tim);
+ }
+}
+
+static void
+l3_ic_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = event_info;
+ Ecore_Timer *tim;
+ Evas_Coord x, y, w, h;
+ Evas_Object *ly2;
+
+ tim = evas_object_data_get(obj, "timer");
+ if (tim) evas_object_data_del(obj, "timer");
+ tim = ecore_timer_add(1.0, l3_tim_cb, obj);
+ evas_object_data_set(obj, "timer", tim);
+
+ ly2 = evas_object_data_get(obj, "ly2");
+ evas_object_geometry_get(ly2, &x, &y, &w, &h);
+ evas_object_data_set(obj, "x", (void *)(uintptr_t)(ev->canvas.x));
+ evas_object_data_set(obj, "y", (void *)(uintptr_t)(ev->canvas.y));
+ evas_object_data_set(obj, "px", (void *)(uintptr_t)(x));
+ evas_object_data_set(obj, "py", (void *)(uintptr_t)(y));
+
+ elm_layout_signal_emit(ly2, "click", "app");
+
+ if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
+ {
+ printf("double click %p\n", obj);
+ }
+}
+
+static void
+l3_ic_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Up *ev = event_info;
+ Ecore_Timer *tim;
+ Evas_Object *ly2;
+
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+
+ ly2 = evas_object_data_get(obj, "ly2");
+ tim = evas_object_data_get(obj, "timer");
+ if (tim)
+ {
+ evas_object_data_del(obj, "timer");
+ ecore_timer_del(tim);
+ }
+ if (evas_object_data_get(obj, "dragging"))
+ {
+ Evas_Object *ly, *sc, *mb;
+ Eina_List *list, *l;
+ int slx, sly;
+ char buf[256];
+
+ evas_object_data_del(obj, "dragging");
+ ly = evas_object_data_get(obj, "ly");
+ sc = evas_object_data_get(obj, "sc");
+ elm_object_scroll_freeze_pop(sc);
+ slx = (int)(uintptr_t)evas_object_data_get(obj, "slx");
+ sly = (int)(uintptr_t)evas_object_data_get(obj, "sly");
+ snprintf(buf, sizeof(buf), "slot.%i.%i", slx, sly);
+ elm_object_part_content_set(ly, buf, ly2);
+ list = (Eina_List *)evas_object_data_get
+ (elm_object_top_widget_get(obj), "mbs");
+ EINA_LIST_FOREACH(list, l, mb)
+ evas_object_color_set(mb, 255, 255, 255, 255);
+ elm_layout_signal_emit(ly2, "drop", "app");
+ }
+ else
+ elm_layout_signal_emit(ly2, "unclick", "app");
+}
+
+static void
+l3_ic_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev = event_info;
+ Evas_Object *ly2;
+
+ ly2 = evas_object_data_get(obj, "ly2");
+
+ if (evas_object_data_get(obj, "dragging"))
+ {
+ Evas_Coord x, y, px, py;
+
+ x = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "x");
+ y = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "y");
+ px = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "px");
+ py = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "py");
+ evas_object_move(ly2,
+ px + ev->cur.canvas.x - x,
+ py + ev->cur.canvas.y - y);
+ }
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ {
+ Ecore_Timer *tim;
+
+ tim = evas_object_data_get(obj, "timer");
+ if (tim)
+ {
+ evas_object_data_del(obj, "timer");
+ ecore_timer_del(tim);
+ }
+ elm_layout_signal_emit(ly2, "cancel", "app");
+ return;
+ }
+}
+
+void
+test_launcher3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *sc, *tb, *pad, *bt, *ic, *tb2, *mb, *ck, *bx, *bx2, *ly, *ly2;
+ int i, j, k, n, m;
+ char buf[PATH_MAX];
+ const char *names[] =
+ {
+ "Hello", "World", "Spam", "Egg",
+ "Ham", "Good", "Bad", "Milk",
+ "Smell", "Of", "Sky", "Gold",
+ "Hole", "Pig", "And", "Calm"
+ };
+ Eina_List *mbs = NULL;
+
+ win = elm_win_add(NULL, "launcher", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Launcher");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_homogeneous_set(bx, EINA_TRUE);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+
+ sc = elm_scroller_add(win);
+ elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE);
+ elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ n = 0; m = 0;
+ for (k = 0 ; k < 8; k++)
+ {
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ pad = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_min_set(pad, 450, 10);
+ elm_table_pack(tb, pad, 1, 0, 1, 1);
+
+ pad = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_min_set(pad, 450, 10);
+ elm_table_pack(tb, pad, 1, 2, 1, 1);
+
+ pad = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_min_set(pad, 10, 450);
+ elm_table_pack(tb, pad, 0, 1, 1, 1);
+
+ pad = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_min_set(pad, 10, 450);
+ elm_table_pack(tb, pad, 2, 1, 1, 1);
+
+ mb = elm_mapbuf_add(win);
+ mbs = eina_list_append(mbs, mb);
+
+ elm_object_content_set(mb, tb);
+ evas_object_show(tb);
+ elm_box_pack_end(bx, mb);
+ evas_object_show(mb);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "launcher_page");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, ly, 1, 1, 1, 1);
+ evas_object_show(ly);
+
+ for (j = 0; j < 4; j++)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ ly2 = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly2, buf, "launcher_icon");
+ evas_object_size_hint_weight_set(ly2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_layout_text_set(ly2, "label", names[m]);
+
+ ic = elm_icon_add(win);
+ elm_object_scale_set(ic, 0.5);
+ snprintf(buf, sizeof(buf), "%s/images/icon_%02i.png", elm_app_data_dir_get(), n);
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ elm_object_part_content_set(ly2, "slot", ic);
+ evas_object_show(ic);
+
+ evas_object_event_callback_add(ic, EVAS_CALLBACK_DEL, l3_ic_del_cb, ic);
+
+ evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_DOWN, l3_ic_down_cb, ic);
+ evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_UP, l3_ic_up_cb, ic);
+ evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_MOVE, l3_ic_move_cb, ic);
+
+ evas_object_data_set(ic, "ly", ly);
+ evas_object_data_set(ic, "ly2", ly2);
+ evas_object_data_set(ic, "sc", sc);
+ evas_object_data_set(ic, "bx", bx);
+ evas_object_data_set(ic, "mb", mb);
+ evas_object_data_set(ic, "slx", (void *)(uintptr_t)(i));
+ evas_object_data_set(ic, "sly", (void *)(uintptr_t)(j));
+
+ snprintf(buf, sizeof(buf), "slot.%i.%i", i, j);
+ elm_object_part_content_set(ly, buf, ly2);
+ evas_object_show(ly2);
+
+ n++; if (n > 23) n = 0;
+ m++; if (m > 15) m = 0;
+ }
+ }
+ }
+
+ // fixme: free mbs
+ evas_object_data_set(win, "mbs", mbs);
+
+ bx2 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_horizontal_set(bx2, EINA_FALSE);
+ elm_win_resize_object_add(win, bx2);
+ evas_object_show(bx2);
+
+ elm_object_content_set(sc, bx);
+ evas_object_show(bx);
+
+ elm_scroller_page_relative_set(sc, 1.0, 1.0);
+ evas_object_show(sc);
+
+ tb2 = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(tb2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, tb2);
+
+ elm_box_pack_end(bx2, sc);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Map");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_smart_callback_add(ck, "changed", l3_mode_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.05, 0.99);
+ elm_table_pack(tb2, ck, 0, 0, 1, 1);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "A");
+ elm_check_state_set(ck, EINA_TRUE);
+ evas_object_smart_callback_add(ck, "changed", l3_alpha_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.20, 0.99);
+ elm_table_pack(tb2, ck, 1, 0, 1, 1);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Smo");
+ elm_check_state_set(ck, EINA_TRUE);
+ evas_object_smart_callback_add(ck, "changed", l3_smooth_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.40, 0.99);
+ elm_table_pack(tb2, ck, 2, 0, 1, 1);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "FS");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_smart_callback_add(ck, "changed", l3_full_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.5, 0.99);
+ elm_table_pack(tb2, ck, 3, 0, 1, 1);
+ evas_object_show(ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "Hid");
+ elm_check_state_set(ck, EINA_FALSE);
+ evas_object_smart_callback_add(ck, "changed", l3_hidden_cb, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.5, 0.99);
+ elm_table_pack(tb2, ck, 4, 0, 1, 1);
+ evas_object_show(ck);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", l3_close_cb, win);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.95, 0.99);
+ elm_table_pack(tb2, bt, 5, 0, 1, 1);
+ evas_object_show(bt);
+
+ evas_object_show(tb2);
+
+ evas_object_resize(win, 480, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_layout.c b/src/bin/elementary/test_layout.c
new file mode 100644
index 0000000000..fce1b93cd1
--- /dev/null
+++ b/src/bin/elementary/test_layout.c
@@ -0,0 +1,271 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#include <Elementary_Cursor.h>
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ Evas_Object *box_layout;
+ Evas_Object *table_layout;
+ Evas_Object *ref;
+ Evas_Object *ref2;
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ LAYOUT_BOX_INSERT_AT,
+ LAYOUT_BOX_INSERT_BEFORE,
+ LAYOUT_BOX_PREPEND,
+ LAYOUT_BOX_REMOVE,
+ LAYOUT_BOX_REMOVE_ALL,
+ LAYOUT_TABLE_UNPACK,
+ LAYOUT_TABLE_CLEAR,
+ API_STATE_LAST
+};
+
+typedef enum _api_state api_state;
+static void
+_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_object_part_text_set(data, "text", elm_object_text_get(obj));
+}
+
+static void
+_cb_signal(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source)
+{
+ printf("signal: '%s' '%s'\n", emission, source);
+}
+
+void
+test_layout(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *ly, *bt;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("layout", "Layout");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ ly = elm_layout_add(box);
+
+ if (!elm_layout_theme_set(
+ ly, "layout", "application", "titlebar"))
+ fprintf(stderr, "Failed to set layout");
+
+ elm_object_part_text_set(ly, "elm.text", "Some title");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, ly);
+ evas_object_show(ly);
+
+ bt = elm_icon_add(ly);
+ elm_icon_standard_set(bt, "chat");
+ evas_object_size_hint_min_set(bt, 20, 20);
+ elm_layout_icon_set(ly, bt);
+
+ bt = elm_icon_add(ly);
+ elm_icon_standard_set(bt, "close");
+ evas_object_size_hint_min_set(bt, 20, 20);
+ elm_layout_end_set(ly, bt);
+
+ ly = elm_layout_add(box);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "layout");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, ly);
+ evas_object_show(ly);
+
+ elm_layout_signal_callback_add(ly, "*", "*", _cb_signal, NULL);
+
+ bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 1");
+ elm_object_part_content_set(ly, "element1", bt);
+ evas_object_smart_callback_add(bt, "clicked", _clicked_cb, ly);
+
+ bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 2");
+ elm_object_part_content_set(ly, "element2", bt);
+ evas_object_smart_callback_add(bt, "clicked", _clicked_cb, ly);
+
+ bt = elm_button_add(ly);
+ elm_object_text_set(bt, "Button 3");
+ elm_object_part_content_set(ly, "element3", bt);
+ evas_object_smart_callback_add(bt, "clicked", _clicked_cb, ly);
+
+ elm_layout_part_cursor_set(ly, "text", ELM_CURSOR_WATCH);
+
+ evas_object_show(win);
+}
+
+static void
+set_api_state(api_data *api)
+{
+ Evas_Object *box_layout = api->box_layout;
+ Evas_Object *table_layout = api->table_layout;
+ Evas_Object *obj;
+
+ /* use elm_box_children_get() to get list of children */
+ switch (api->state)
+ { /* Put all api-changes under switch */
+ case LAYOUT_BOX_INSERT_AT:
+ {
+ obj = elm_label_add(box_layout);
+ elm_object_text_set(obj, "elm_layout_box_insert_at(); is called");
+ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_layout_box_insert_at(box_layout, "elm.box.content", obj, 0);
+ evas_object_show(obj);
+ break;
+ }
+
+ case LAYOUT_BOX_INSERT_BEFORE:
+ {
+ obj = elm_label_add(box_layout);
+ elm_object_text_set(obj, "elm_layout_box_insert_before(); is called");
+ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_layout_box_insert_before(box_layout, "elm.box.content",
+ obj, api->ref);
+ evas_object_show(obj);
+ break;
+ }
+
+ case LAYOUT_BOX_PREPEND:
+ {
+ obj = elm_label_add(box_layout);
+ elm_object_text_set(obj, "elm_layout_box_prepend(); is called");
+ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_layout_box_prepend(box_layout, "elm.box.content", obj);
+ evas_object_show(obj);
+ break;
+ }
+
+ case LAYOUT_BOX_REMOVE:
+ {
+ elm_layout_box_remove(box_layout, "elm.box.content", api->ref);
+ evas_object_del(api->ref);
+ break;
+ }
+
+ case LAYOUT_BOX_REMOVE_ALL:
+ {
+ elm_layout_box_remove_all(box_layout, "elm.box.content", EINA_TRUE);
+ break;
+ }
+
+ case LAYOUT_TABLE_UNPACK:
+ {
+ elm_layout_table_unpack(table_layout, "elm.table.content", api->ref2);
+ evas_object_del(api->ref2);
+ break;
+ }
+
+ case LAYOUT_TABLE_CLEAR:
+ {
+ elm_layout_table_clear(table_layout, "elm.table.content", EINA_TRUE);
+ break;
+ }
+
+ default: return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_layout2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *bt, *ly, *lb;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("layout2", "Layout 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked,
+ (void *)api);
+ elm_box_pack_end(box, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ /* Layout Box Test */
+ api->box_layout = ly = elm_layout_add(win);
+
+ if (!elm_layout_theme_set(
+ ly, "layout", "application", "toolbar-vbox"))
+ fprintf(stderr, "Failed to set layout");
+
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, ly);
+ evas_object_show(ly);
+
+ api->ref = lb = elm_label_add(win);
+ elm_object_text_set(lb, "This is a label for the box content");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(lb);
+
+ elm_layout_box_append(ly, "elm.box.content", lb);
+
+ /* Layout Table Test */
+ api->table_layout = ly = elm_layout_add(win);
+
+ if (!elm_layout_theme_set(
+ ly, "layout", "application", "toolbar-table"))
+ fprintf(stderr, "Failed to set layout");
+
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, ly);
+ evas_object_show(ly);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "This is a label for the table content");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(lb);
+ elm_layout_table_pack(ly, "elm.table.content", lb, 0, 0, 1, 1);
+
+ api->ref2 = lb = elm_label_add(win);
+ elm_object_text_set(lb, "col = 0, row = 1");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(lb);
+ elm_layout_table_pack(ly, "elm.table.content", lb, 0, 1, 1, 1);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_list.c b/src/bin/elementary/test_list.c
new file mode 100644
index 0000000000..f02df5c4a1
--- /dev/null
+++ b/src/bin/elementary/test_list.c
@@ -0,0 +1,1953 @@
+#include "test.h"
+#include <Elementary_Cursor.h>
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+Evas_Object * _focus_autoscroll_mode_frame_create(Evas_Object *parent);
+
+struct _api_data
+{
+ unsigned int state; /* What state we are testing */
+ void *list;
+};
+typedef struct _api_data api_data;
+
+enum _api_state
+{
+ ITEM_PREPEND, /* 0 */
+ ITEM_INSERT_BEFORE, /* 1 */
+ ITEM_INSERT_AFTER, /* 2 */
+ ITEM_SEPARATOR_SET, /* 3 */
+ LIST_ITEM_DEL, /* 4 */
+ SCROLLER_POLICY_SET_ON,
+ SCROLLER_POLICY_SET_OFF, /* Back to AUTO next */
+ TOOLTIP_TEXT_SET, /* 7 */
+ TOOLTIP_UNSET, /* 8 */
+ ITEM_CURSOR_SET, /* 9 */
+ ITEM_CURSOR_STYLE_SET,
+ DISABLED_SET, /* 11 */
+ MODE_SET_COMPRESS, /* 12 */
+ MODE_SET_LIMIT, /* 13 */
+ MODE_SET_EXPAND, /* 14 */
+ HORIZONTAL_SET, /* 15 */
+ BOUNCE_SET, /* 16 */
+ LIST_CLEAR, /* 17 */
+ API_STATE_LAST
+};
+typedef enum _api_state api_state;
+
+static void
+set_api_state(api_data *api)
+{
+/** HOW TO TEST ************************
+0 ITEM PREPEND
+Scroll to end
+1 INSERT BEFORE
+Scroll to end
+2 INSERT AFTER
+3 INSERT SEPARATOR
+Scroll to end
+4 ITEM DEL
+5 POLICY ON, BOUNCE_SET(TRUE, TRUE)
+6 POLICY OFF
+Scroll to end
+7 TOOLTIP last-item
+8 Cancel tootip
+9 Curosr set on last item
+10 Cursor style set last item
+11 DISABLE last item
+12 MODE COMPRESS
+13 MODE LIMIT
+14 MODE EXPAND
+15 HORIZ SET
+16 VERT MODE, BOUNCE(TRUE, FALSE) try to bounce on Y-axis
+17 List clear
+*** HOW TO TEST ***********************/
+ Evas_Object *li = api->list;
+
+ switch(api->state)
+ { /* Put all api-changes under switch */
+ case ITEM_PREPEND: /* 0 */
+ {
+ const Eina_List *items = elm_list_items_get(li);
+ elm_list_item_prepend(li, "PREPEND", NULL, NULL, NULL, NULL);
+ elm_list_go(li);
+ elm_list_item_bring_in(eina_list_nth(items, 0));
+ }
+ break;
+
+ case ITEM_INSERT_BEFORE: /* 1 */
+ {
+ const Eina_List *items = elm_list_items_get(li);
+ if (eina_list_count(items))
+ {
+ elm_list_item_insert_before(li,
+ eina_list_nth(items, eina_list_count(items)-1),
+ "1-before-last", NULL, NULL, NULL, NULL);
+ elm_list_go(li);
+ elm_list_item_bring_in(eina_list_data_get(eina_list_last(items)));
+ }
+ }
+ break;
+
+ case ITEM_INSERT_AFTER: /* 2 */
+ {
+ const Eina_List *items = elm_list_items_get(li);
+ if (eina_list_count(items))
+ {
+ elm_list_item_insert_after(li,
+ eina_list_nth(items, eina_list_count(items)-2),
+ "insert-after", NULL, NULL, NULL, NULL);
+ elm_list_go(li);
+ elm_list_item_bring_in(eina_list_data_get(eina_list_last(items)));
+ }
+ }
+ break;
+
+ case ITEM_SEPARATOR_SET: /* 3 */
+ {
+ const Eina_List *items = elm_list_items_get(li);
+ if (eina_list_count(items))
+ {
+ elm_list_item_separator_set(eina_list_nth(items, eina_list_count(items)-3), EINA_TRUE);
+ elm_list_item_bring_in(eina_list_nth(items, eina_list_count(items)-3));
+ elm_list_go(li);
+ }
+ }
+ break;
+
+ case LIST_ITEM_DEL: /* 4 */
+ {
+ const Eina_List *items = elm_list_items_get(li);
+ if (eina_list_count(items))
+ {
+ elm_object_item_del(eina_list_data_get(eina_list_last(items)));
+ }
+ }
+ break;
+
+ case SCROLLER_POLICY_SET_ON: /* 5 */
+ elm_scroller_bounce_set(li, EINA_TRUE, EINA_TRUE);
+ elm_scroller_policy_set(li, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON);
+ break;
+
+ case SCROLLER_POLICY_SET_OFF: /* Back to AUTO next (6) */
+ elm_scroller_policy_set(li, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ break;
+
+ case TOOLTIP_TEXT_SET: /* 7 */
+ {
+ const Eina_List *items = elm_list_items_get(li);
+ if (eina_list_count(items))
+ {
+ elm_object_item_tooltip_text_set(eina_list_data_get(eina_list_last(items)), "Tooltip set from API");
+ }
+ elm_scroller_policy_set(li, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_AUTO);
+ }
+ break;
+
+ case TOOLTIP_UNSET: /* 8 */
+ {
+ const Eina_List *items = elm_list_items_get(li);
+ if (eina_list_count(items))
+ {
+ elm_object_item_tooltip_unset(eina_list_data_get(eina_list_last(items)));
+ }
+ }
+ break;
+
+ case ITEM_CURSOR_SET: /* 9 */
+ {
+ const Eina_List *items = elm_list_items_get(li);
+ if (eina_list_count(items))
+ {
+ elm_object_item_cursor_set(eina_list_data_get(eina_list_last(items)), ELM_CURSOR_HAND2);
+ }
+ }
+ break;
+
+ case ITEM_CURSOR_STYLE_SET: /* 10 */
+ {
+ const Eina_List *items = elm_list_items_get(li);
+ if (eina_list_count(items))
+ {
+ elm_object_item_cursor_style_set(eina_list_data_get(eina_list_last(items)), "transparent");
+ }
+ }
+ break;
+
+ case DISABLED_SET: /* 11 */
+ {
+ const Eina_List *items = elm_list_items_get(li);
+ if (eina_list_count(items))
+ {
+ elm_object_item_disabled_set(eina_list_data_get(eina_list_last(items)), EINA_TRUE);
+ }
+ }
+ break;
+
+ case MODE_SET_COMPRESS: /* 12 */
+ elm_list_mode_set(li, ELM_LIST_COMPRESS);
+ break;
+
+ case MODE_SET_LIMIT: /* 13 */
+ elm_list_mode_set(li, ELM_LIST_LIMIT);
+ break;
+
+ case MODE_SET_EXPAND: /* 14 */
+ elm_list_mode_set(li, ELM_LIST_EXPAND);
+ break;
+
+ case HORIZONTAL_SET: /* 15 */
+ elm_list_mode_set(li, ELM_LIST_SCROLL); /* return to default mode */
+ elm_list_horizontal_set(li, EINA_TRUE);
+ break;
+
+ case BOUNCE_SET: /* 16 */
+ elm_list_horizontal_set(li, EINA_FALSE);
+ elm_scroller_bounce_set(li, EINA_TRUE, EINA_FALSE);
+ break;
+
+ case LIST_CLEAR: /* 17 */
+ elm_list_clear(li);
+ break;
+
+ case API_STATE_LAST:
+ break;
+
+ default:
+ return;
+ }
+}
+
+static void
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{ /* Will add here a SWITCH command containing code to modify test-object */
+ /* in accordance a->state value. */
+ api_data *a = data;
+ char str[128];
+
+ printf("clicked event on API Button: api_state=<%d>\n", a->state);
+ set_api_state(a);
+ a->state++;
+ sprintf(str, "Next API function (%u)", a->state);
+ elm_object_text_set(obj, str);
+ elm_object_disabled_set(obj, a->state == API_STATE_LAST);
+}
+
+static void
+my_show_it(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ elm_list_item_show(data);
+}
+
+static void
+scroll_top(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Top edge!\n");
+}
+
+static void
+scroll_bottom(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Bottom edge!\n");
+}
+
+static void
+clicked_right(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Clicked right!\n");
+}
+
+static void
+scroll_left(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Left edge!\n");
+}
+
+static void
+scroll_right(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Right edge!\n");
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+void
+test_list(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *li, *ic, *ic2, *bx, *tb2, *bt, *bxx;
+ char buf[PATH_MAX];
+ Elm_Object_Item *list_it1, *list_it2, *list_it3, *list_it4, *list_it5;
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("list", "List");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ li = elm_list_add(win);
+ elm_list_mode_set(li, ELM_LIST_LIMIT);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ api->list = li;
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next API function");
+ evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
+ elm_box_pack_end(bxx, bt);
+ elm_object_disabled_set(bt, api->state == API_STATE_LAST);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bxx, li);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ list_it1 = elm_list_item_append(li, "Hello", ic, NULL, NULL, NULL);
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_image_file_set(ic, buf, NULL);
+ elm_list_item_append(li, "world", ic, NULL, NULL, NULL);
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "edit");
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_list_item_append(li, ".", ic, NULL, NULL, NULL);
+
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "delete");
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ ic2 = elm_icon_add(win);
+ elm_icon_standard_set(ic2, "clock");
+ elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE);
+ list_it2 = elm_list_item_append(li, "How", ic, ic2, NULL, NULL);
+
+ bx = elm_box_add(win);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.0);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.0, 1.0);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+ elm_list_item_append(li, "are", bx, NULL, NULL, NULL);
+
+ elm_list_item_append(li, "you", NULL, NULL, NULL, NULL);
+ list_it3 = elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "out", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "there", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "today", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "?", NULL, NULL, NULL, NULL);
+ list_it4 = elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "are", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "some", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "more", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "items", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Is this label long enough?", NULL, NULL, NULL, NULL);
+ list_it5 = elm_list_item_append(li, "Maybe this one is even longer so we can test long long items.", NULL, NULL, NULL, NULL);
+
+ elm_list_go(li);
+
+ evas_object_show(li);
+
+ tb2 = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb2);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Hello");
+ evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it1);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.5);
+ elm_table_pack(tb2, bt, 0, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "How");
+ evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it2);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.5);
+ elm_table_pack(tb2, bt, 0, 1, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "doing");
+ evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it3);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.5);
+ elm_table_pack(tb2, bt, 0, 2, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Here");
+ evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it4);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.5);
+ elm_table_pack(tb2, bt, 0, 3, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Maybe this...");
+ evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it5);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.5);
+ elm_table_pack(tb2, bt, 0, 4, 1, 1);
+ evas_object_show(bt);
+
+ evas_object_show(tb2);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+
+ evas_object_smart_callback_add(li, "edge,top", scroll_top, NULL);
+ evas_object_smart_callback_add(li, "edge,bottom", scroll_bottom, NULL);
+ evas_object_smart_callback_add(li, "clicked,right", clicked_right, NULL);
+}
+
+void
+test_list_horizontal(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *li, *ic, *ic2, *bx, *tb2, *bt;
+ char buf[PATH_MAX];
+ Elm_Object_Item *list_it1, *list_it2, *list_it3, *list_it4;
+
+ win = elm_win_util_standard_add("list-horizontal", "List Horizontal");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ li = elm_list_add(win);
+ elm_list_horizontal_set(li, EINA_TRUE);
+ elm_list_mode_set(li, ELM_LIST_LIMIT);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, li);
+
+ evas_object_smart_callback_add(li, "edge,left", scroll_left, NULL);
+ evas_object_smart_callback_add(li, "edge,right", scroll_right, NULL);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ list_it1 = elm_list_item_append(li, "Hello", ic, NULL, NULL, NULL);
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_image_file_set(ic, buf, NULL);
+ elm_list_item_append(li, "world", ic, NULL, NULL, NULL);
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "edit");
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_list_item_append(li, ".", ic, NULL, NULL, NULL);
+
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "delete");
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ ic2 = elm_icon_add(win);
+ elm_icon_standard_set(ic2, "clock");
+ elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE);
+ list_it2 = elm_list_item_append(li, "How", ic, ic2, NULL, NULL);
+
+ bx = elm_box_add(win);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.0);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ elm_list_item_append(li, "are", bx, NULL, NULL, NULL);
+
+ elm_list_item_append(li, "you", NULL, NULL, NULL, NULL);
+ list_it3 = elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "out", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "there", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "today", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "?", NULL, NULL, NULL, NULL);
+
+ list_it4 = elm_list_item_append(li, "And", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "here", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "we", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "are", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "done", NULL, NULL, NULL, NULL);
+ elm_object_item_disabled_set(elm_list_item_append(li, "with", NULL, NULL, NULL, NULL), EINA_TRUE);
+ elm_object_item_disabled_set(elm_list_item_append(li, "items.", NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ elm_list_go(li);
+
+ evas_object_show(li);
+
+ tb2 = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb2);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Hello");
+ evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it1);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.5, 0.9);
+ elm_table_pack(tb2, bt, 0, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "How");
+ evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it2);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.5, 0.9);
+ elm_table_pack(tb2, bt, 1, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "doing");
+ evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it3);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.5, 0.9);
+ elm_table_pack(tb2, bt, 2, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "And");
+ evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it4);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.5, 0.9);
+ elm_table_pack(tb2, bt, 3, 0, 1, 1);
+ evas_object_show(bt);
+
+ evas_object_show(tb2);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+/***********/
+
+static void
+my_li2_clear(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ elm_list_clear(data);
+}
+
+static void
+my_li2_sel(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
+ elm_list_item_selected_set(list_it, EINA_FALSE);
+ printf("item selected\n");
+}
+
+void
+test_list2(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *li, *ic, *ic2, *bx, *bx2, *bt;
+ char buf[PATH_MAX];
+ Elm_Object_Item *list_it;
+
+ win = elm_win_add(NULL, "list2", ELM_WIN_BASIC);
+ elm_win_title_set(win, "List 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ li = elm_list_add(bx);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_list_mode_set(li, ELM_LIST_LIMIT);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_list_item_append(li, "Unselect on selected", ic, NULL, my_li2_sel, NULL);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_image_file_set(ic, buf, NULL);
+ list_it = elm_list_item_append(li, "world", ic, NULL, NULL, NULL);
+ elm_list_item_selected_set(list_it, EINA_TRUE);
+
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "edit");
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_list_item_append(li, ".", ic, NULL, NULL, NULL);
+
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "delete");
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ ic2 = elm_icon_add(win);
+ elm_icon_standard_set(ic2, "clock");
+ elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE);
+ elm_list_item_append(li, "How", ic, ic2, NULL, NULL);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ elm_box_pack_end(bx2, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.0);
+ elm_box_pack_end(bx2, ic);
+ evas_object_show(ic);
+ elm_list_item_append(li, "are", bx2, NULL, NULL, NULL);
+
+ elm_list_item_append(li, "you", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "out", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "there", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "today", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "?", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "are", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "some", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "more", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "items", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Longer label.", NULL, NULL, NULL, NULL);
+
+ elm_list_go(li);
+
+ elm_box_pack_end(bx, li);
+ evas_object_show(li);
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Clear");
+ evas_object_smart_callback_add(bt, "clicked", my_li2_clear, li);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 320, 500);
+ evas_object_show(win);
+}
+
+/***********/
+
+static void
+_bt_clicked(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("button was clicked\n");
+}
+
+static void
+_it_clicked(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("item was clicked\n");
+ if (!data) return;
+ Evas_Object *li = data;
+ Evas_Object *lb;
+ char str[128];
+
+ Elm_Object_Item *lit = elm_list_selected_item_get(li);
+ if (!lit) return;
+ sprintf(str, "%s is selected", elm_object_item_text_get(lit));
+
+ lb = evas_object_data_get(li, "label");
+ elm_object_text_set(lb, str);
+}
+
+void
+test_list3(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *li, *ic, *ic2, *bx;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("list3", "List 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, li);
+ elm_list_mode_set(li, ELM_LIST_COMPRESS);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_image_file_set(ic, buf, NULL);
+ ic2 = elm_button_add(win);
+ elm_object_text_set(ic2, "Click me");
+ evas_object_smart_callback_add(ic2, "clicked", _bt_clicked, NULL);
+ evas_object_propagate_events_set(ic2, EINA_FALSE);
+ elm_list_item_append(li, "Hello", ic, ic2, _it_clicked, NULL);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_image_file_set(ic, buf, NULL);
+ ic2 = elm_button_add(win);
+ elm_object_text_set(ic2, "Click me");
+ evas_object_smart_callback_add(ic2, "clicked", _bt_clicked, NULL);
+ elm_list_item_append(li, "world", ic, ic2, _it_clicked, NULL);
+
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "edit");
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_list_item_append(li, ".", ic, NULL, NULL, NULL);
+
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "delete");
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ ic2 = elm_icon_add(win);
+ elm_icon_standard_set(ic2, "clock");
+ elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE);
+ elm_list_item_append(li, "How", ic, ic2, NULL, NULL);
+
+ bx = elm_box_add(win);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.0);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.0, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ elm_list_item_append(li, "are", bx, NULL, NULL, NULL);
+ elm_list_item_append(li, "you", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "out", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "there", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "today", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "?", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "are", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "some", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "more", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "items", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Is this label long enough?", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Maybe this one is even longer so we can test long long items.", NULL, NULL, NULL, NULL);
+
+ elm_list_go(li);
+
+ evas_object_show(li);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+struct Pginfo
+{
+ Evas_Object *naviframe, *win;
+};
+
+static void
+test_list4_back_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ struct Pginfo *info = data;
+ if (!info) return;
+
+ elm_naviframe_item_pop(info->naviframe);
+}
+
+static void
+test_list4_swipe(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Object *box, *entry, *button;
+ struct Pginfo *info = data;
+ char *item_data;
+ if ((!event_info) || (!data)) return;
+
+ item_data = elm_object_item_data_get(event_info);
+
+ box = elm_box_add(info->win);
+ elm_box_horizontal_set(box, EINA_FALSE);
+ elm_box_homogeneous_set(box, EINA_FALSE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(box);
+
+ entry = elm_entry_add(info->win);
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_entry_editable_set(entry, EINA_FALSE);
+ elm_object_text_set(entry, item_data);
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(entry);
+
+ button = elm_button_add(info->win);
+ elm_object_text_set(button, "back");
+ evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0);
+ evas_object_smart_callback_add(button, "clicked", test_list4_back_cb, info);
+ evas_object_show(button);
+
+ elm_box_pack_start(box, entry);
+ elm_box_pack_end(box, button);
+
+ elm_naviframe_item_simple_push(info->naviframe, box);
+}
+
+void
+test_list4(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *li, *ic, *ic2, *naviframe;
+ static struct Pginfo info = {NULL, NULL};
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("list4", "List 4");
+ elm_win_autodel_set(win, EINA_TRUE);
+ info.win = win;
+
+ naviframe = elm_naviframe_add(win);
+ evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, naviframe);
+ evas_object_show(naviframe);
+ info.naviframe = naviframe;
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_list_mode_set(li, ELM_LIST_COMPRESS);
+ evas_object_smart_callback_add(li, "swipe", test_list4_swipe, &info);
+ elm_naviframe_item_simple_push(naviframe, li);
+
+ static char pf_data[] = "Pink Floyd were formed in 1965, and originally consisted of university" \
+ "students Roger Waters, Nick Mason, Richard Wright, and Syd Barrett. The group were a popular" \
+ "fixture on London's underground music scene, and under Barrett's leadership released two " \
+ "charting singles, \"Arnold Layne\" and \"See Emily Play\", and a successful debut album, " \
+ "ThePiper at the Gates of Dawn. In 1968, guitarist and singer David Gilmour joined the " \
+ "line-up. Barrett was soon removed, due to his increasingly erratic behaviour. Following " \
+ "Barrett's departure, bass player and singer Roger Waters became the band's lyricist and " \
+ "conceptual leader, with Gilmour assuming lead guitar and much of the vocals. With this " \
+ "line-up, Floyd went on to achieve worldwide critical and commercial success with the " \
+ "conceptalbums The Dark Side of the Moon, Wish You Were Here, Animals, and The Wall.";
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/mystrale.jpg", elm_app_data_dir_get());
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_image_file_set(ic, buf, NULL);
+ elm_list_item_append(li, "Pink Floyd", ic, NULL, NULL, &pf_data);
+
+ static char ds_data[] = "Dire Straits were a British rock band, formed by Mark Knopfler " \
+ "(lead vocals and lead guitar), his younger brother David Knopfler (rhythm guitar and " \
+ "backing vocals), John Illsley (bass guitar and backing vocals), and Pick Withers (drums " \
+ "and percussion), and managed by Ed Bicknell, active between 1977 and 1995. Although the " \
+ "band was formed in an era when punk rock was at the forefront, Dire Straits played a more "
+ "bluesy style, albeit with a stripped-down sound that appealed to audiences weary of the " \
+ "overproduced stadium rock of the 1970s.[citation needed] In their early days, Mark and " \
+ "David requested that pub owners turn down their sound so that patrons could converse " \
+ "while the band played, an indication of their unassuming demeanor. Despite this oddly " \
+ "self-effacing approach to rock and roll, Dire Straits soon became hugely successful, with " \
+ "their first album going multi-platinum globally.";
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/mystrale_2.jpg", elm_app_data_dir_get());
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_image_file_set(ic, buf, NULL);
+ elm_list_item_append(li, "Dire Straits", ic, NULL, NULL, &ds_data);
+
+ static char uh_data[] = "Uriah Heep are an English hard rock band. The band released several " \
+ "commercially successful albums in the 1970s such as Uriah Heep Live (1973), but their " \
+ "audience declined by the 1980s, to the point where they became essentially a cult band in " \
+ "the United States and United Kingdom. Uriah Heep maintain a significant following in " \
+ "Germany, the Netherlands, Scandinavia, the Balkans, Japan and Russia, where they still " \
+ "perform at stadium-sized venues.";
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/icon_17.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_list_item_append(li, "Uriah Heep", ic, NULL, NULL, &uh_data);
+
+ static char r_data[] = "Rush is a Canadian rock band formed in August 1968, in the Willowdale " \
+ "neighbourhood of Toronto, Ontario. The band is composed of bassist, keyboardist, and lead " \
+ "vocalist Geddy Lee, guitarist Alex Lifeson, and drummer and lyricist Neil Peart. The band " \
+ "and its membership went through a number of re-configurations between 1968 and 1974, " \
+ "achieving their current form when Peart replaced original drummer John Rutsey in July 1974, " \
+ "two weeks before the group's first United States tour.";
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/icon_21.png", elm_app_data_dir_get());
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_image_file_set(ic, buf, NULL);
+ ic2 = elm_icon_add(win);
+ elm_icon_standard_set(ic2, "clock");
+ elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE);
+ elm_list_item_append(li, "Rush", ic, ic2, NULL, &r_data);
+
+ elm_list_go(li);
+
+ evas_object_show(li);
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+struct list5_data_cb
+{
+ Evas_Object *win, *list;
+};
+
+static void
+test_list5_item_del(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ elm_object_item_del(data);
+}
+
+static void
+test_list5_swipe(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Object *button;
+ struct list5_data_cb *info = elm_object_item_data_get(event_info);
+
+ if (elm_object_item_part_content_get(event_info, "end")) return;
+
+ button = elm_button_add(info->win);
+ elm_object_text_set(button, "delete");
+ evas_object_propagate_events_set(button, EINA_FALSE);
+ evas_object_smart_callback_add(button, "clicked", test_list5_item_del,
+ event_info);
+ elm_object_item_part_content_set(event_info, "end", button);
+ elm_object_item_part_text_set(event_info, "default", "Enlightenment");
+}
+
+void
+test_list5(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *li;
+ static struct list5_data_cb info;
+
+ win = elm_win_util_standard_add("list5", "List 5");
+ elm_win_autodel_set(win, EINA_TRUE);
+ info.win = win;
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_list_mode_set(li, ELM_LIST_COMPRESS);
+ evas_object_smart_callback_add(li, "swipe", test_list5_swipe, NULL);
+ elm_win_resize_object_add(win, li);
+ evas_object_show(li);
+ info.list = li;
+
+ elm_list_item_append(li, "Network", NULL, NULL, NULL, &info);
+ elm_list_item_append(li, "Audio", NULL, NULL, NULL, &info);
+
+ elm_list_go(li);
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+static void
+_first_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ char str[128];
+ Evas_Object *li = data, *lb;
+ Elm_Object_Item *lit = elm_list_first_item_get(li);
+ if (!lit) return;
+
+ sprintf(str, "%s is selected", elm_object_item_text_get(lit));
+ elm_list_item_bring_in(lit);
+ elm_list_item_selected_set(lit, EINA_TRUE);
+
+ lb = evas_object_data_get(li, "label");
+ elm_object_text_set(lb, str);
+}
+
+static void
+_prev_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ char str[128];
+ Evas_Object *li = data, *lb;
+
+ Elm_Object_Item *lit = elm_list_selected_item_get(li);
+ if (!lit) return;
+ lit = elm_list_item_prev(lit);
+ if (!lit) return;
+
+ sprintf(str, "%s is selected", elm_object_item_text_get(lit));
+ elm_list_item_bring_in(lit);
+ elm_list_item_selected_set(lit, EINA_TRUE);
+
+ lb = evas_object_data_get(li, "label");
+ elm_object_text_set(lb, str);
+}
+
+static void
+_next_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ char str[128];
+ Evas_Object *li = data, *lb;
+
+ Elm_Object_Item *lit = elm_list_selected_item_get(li);
+ if (!lit) return;
+ lit = elm_list_item_next(lit);
+ if (!lit) return;
+
+ sprintf(str, "%s is selected", elm_object_item_text_get(lit));
+ elm_list_item_bring_in(lit);
+ elm_list_item_selected_set(lit, EINA_TRUE);
+
+ lb = evas_object_data_get(li, "label");
+ elm_object_text_set(lb, str);
+}
+
+static void
+_last_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ char str[128];
+ Evas_Object *li = data, *lb;
+ Elm_Object_Item *lit = elm_list_last_item_get(li);
+ if (!lit) return;
+
+ sprintf(str, "%s is selected", elm_object_item_text_get(lit));
+ elm_list_item_bring_in(lit);
+ elm_list_item_selected_set(lit, EINA_TRUE);
+
+ lb = evas_object_data_get(li, "label");
+ elm_object_text_set(lb, str);
+}
+
+void
+test_list6(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gd, *bt, *li, *lb;
+
+ win = elm_win_util_standard_add("list6", "List 6");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ gd = elm_grid_add(win);
+ elm_grid_size_set(gd, 100, 100);
+ evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, gd);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_list_mode_set(li, ELM_LIST_COMPRESS);
+ elm_grid_pack(gd, li, 4, 4, 92, 72);
+ evas_object_show(li);
+
+ elm_list_item_append(li, "Eina", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Eet", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Evas", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Ecore", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Embryo", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Edje", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Efreet", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "E_dbus", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Eeze", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Expedite", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Emotion", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Ethumb", NULL, NULL, _it_clicked, li);
+ elm_list_item_append(li, "Elementary", NULL, NULL, _it_clicked, li);
+ elm_list_go(li);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "First");
+ evas_object_smart_callback_add(bt, "clicked", _first_bt_clicked, li);
+ elm_grid_pack(gd, bt, 4, 80, 20, 10);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Prev");
+ evas_object_smart_callback_add(bt, "clicked", _prev_bt_clicked, li);
+ elm_grid_pack(gd, bt, 28, 80, 20, 10);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next");
+ evas_object_smart_callback_add(bt, "clicked", _next_bt_clicked, li);
+ elm_grid_pack(gd, bt, 52, 80, 20, 10);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Last");
+ evas_object_smart_callback_add(bt, "clicked", _last_bt_clicked, li);
+ elm_grid_pack(gd, bt, 76, 80, 20, 10);
+ evas_object_show(bt);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Nothing is selected");
+ elm_grid_pack(gd, lb, 4, 90, 92, 10);
+ evas_object_show(lb);
+
+ evas_object_data_set(li, "label", lb);
+
+ evas_object_show(gd);
+ evas_object_resize(win, 480, 480);
+ evas_object_show(win);
+}
+
+static void
+_it_clicked_cb(void *data EINA_UNUSED, Evas_Object *li,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *lit = elm_list_selected_item_get(li);
+ printf("Item clicked. %s is selected\n", elm_object_item_text_get(lit));
+}
+
+void
+test_list7(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *li;
+ char buf[PATH_MAX];
+
+ win = elm_win_add(NULL, "list7", ELM_WIN_BASIC);
+ elm_win_title_set(win, "List Always Select Mode");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, li);
+ elm_list_select_mode_set(li, ELM_OBJECT_SELECT_MODE_ALWAYS);
+
+ elm_list_item_append(li, "Items", NULL, NULL, _it_clicked_cb, NULL);
+ elm_list_item_append(li, "callbacks", NULL, NULL, _it_clicked_cb, NULL);
+ elm_list_item_append(li, "should be called", NULL, NULL, _it_clicked_cb,
+ NULL);
+ elm_list_item_append(li, "only once, each time", NULL, NULL, _it_clicked_cb,
+ NULL);
+ elm_list_item_append(li, "an item is clicked.", NULL, NULL, _it_clicked_cb,
+ NULL);
+ elm_list_item_append(li, "Including already", NULL, NULL, _it_clicked_cb,
+ NULL);
+ elm_list_item_append(li, "selected ones.", NULL, NULL, _it_clicked_cb, NULL);
+
+ elm_list_go(li);
+ evas_object_show(li);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+static const char *_list_focus_names[] = {"None", "Square", "Button", "Check", "Box"};
+static const int _list_focus_combo[] = { 1, 0, 2, 33, 43, 44, 10, 30, 22, 11, 10, -1 };
+
+static Evas_Object *
+test_list_focus_content_get(Evas_Object *obj, unsigned type, Eina_Bool horiz)
+{
+ Evas_Object *cnt = NULL;
+
+ switch(type)
+ {
+ case 1:
+ cnt = elm_bg_add(obj);
+ evas_object_color_set(cnt, 128, 18, 128, 255);
+ evas_object_size_hint_min_set(cnt, 50, 50);
+ break;
+ case 2:
+ cnt = elm_button_add(obj);
+ break;
+ case 3:
+ cnt = elm_check_add(obj);
+ break;
+ case 4:
+ cnt = elm_box_add(obj);
+ elm_box_horizontal_set(cnt, !horiz);
+ evas_object_size_hint_align_set(cnt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(cnt, test_list_focus_content_get(obj, 2, horiz));
+ elm_box_pack_end(cnt, test_list_focus_content_get(obj, 3, horiz));
+ elm_box_pack_end(cnt, test_list_focus_content_get(obj, 2, horiz));
+ break;
+ default:
+ break;
+
+ }
+
+ if (cnt)
+ {
+ evas_object_size_hint_weight_set(cnt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(cnt);
+ }
+
+ return cnt;
+}
+
+static void
+test_list_focus_focus_on_selection_set(Evas_Object *gl,
+ Evas_Object *chk, Eina_Bool focus)
+{
+ elm_list_focus_on_selection_set(gl, focus);
+ elm_check_state_set(chk, focus);
+ printf("list_focus_on_selection = %s\n", (focus) ? "true" : "false");
+}
+
+static void
+test_list_focus_focus_check_changed(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool nextstate = !elm_list_focus_on_selection_get(data);
+ test_list_focus_focus_on_selection_set(data, obj, nextstate);
+}
+
+static void
+test_list_focus_win_auto_focus_enable_check_changed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_window_auto_focus_enable_set(elm_check_state_get(obj));
+}
+
+static void
+test_list_focus_win_auto_focus_animate_check_changed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_window_auto_focus_animate_set(elm_check_state_get(obj));
+}
+
+static void
+test_list_focus_focus_highlight_check_changed(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_enabled_set((Evas_Object *)data,
+ elm_check_state_get(obj));
+}
+
+static void
+test_list_focus_focus_animate_check_changed(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_animate_set((Evas_Object *)data,
+ elm_check_state_get(obj));
+}
+
+static void
+test_list_focus_focus_move_policy_changed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ int val = elm_radio_value_get(obj);
+
+ if (val == 0)
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK);
+ else if (val == 1)
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN);
+}
+
+static void
+test_list_focus_item_loop_enable_check_changed(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *li = data;
+ elm_object_scroll_item_loop_enabled_set(li, elm_check_state_get(obj));
+}
+
+static void
+test_list_focus_item_select_on_focus_disable_changed(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj));
+}
+
+static void
+test_list_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
+}
+
+static void
+_item_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("%s: %p\n", (char *)data, event_info);
+}
+
+static void
+_list_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ printf("\n=== Key Down : %s ===\n", ev->keyname);
+}
+
+static Ecore_Timer *timer = NULL;
+static void
+_test_list_focus_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_timer_del(timer);
+ timer = NULL;
+}
+
+static Eina_Bool
+_focus_timer_cb(void *data)
+{
+ elm_object_item_focus_set(data, EINA_TRUE);
+ timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_select_timer_cb(void *data)
+{
+ elm_list_item_selected_set(data, EINA_TRUE);
+ timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_focus_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_timer_del(timer);
+ timer = ecore_timer_add(1.5, _focus_timer_cb, data);
+}
+
+static void
+_sel_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_timer_del(timer);
+ timer = ecore_timer_add(1.5, _select_timer_cb, data);
+}
+
+static void
+_dis_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ elm_object_item_disabled_set(data, EINA_TRUE);
+}
+
+static void
+_focus_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Button clicked: %s\n", (char *)data);
+}
+
+static void
+_test_list_focus(const char *name, const char *title, Eina_Bool horiz)
+{
+ Evas_Object *win, *li, *btn, *bx, *bx2, *fr, *bx_opt, *chk, *bx_btn;
+ Evas_Object *btn_focus, *btn_sel, *btn_dis, *bx_mv, *rd, *rdg;
+ unsigned int lhand, rhand, idx;
+ char buf[256];
+ Elm_Object_Item *it = NULL, *it_0 = NULL, *it_3 = NULL;
+
+ win = elm_win_util_standard_add(name, title);
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
+ _test_list_focus_win_del_cb, NULL);
+
+ elm_config_window_auto_focus_enable_set(EINA_TRUE);
+ elm_config_window_auto_focus_animate_set(EINA_TRUE);
+ elm_win_focus_highlight_enabled_set(win, EINA_FALSE);
+ elm_win_focus_highlight_animate_set(win, EINA_FALSE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ btn = elm_button_add(bx);
+ elm_object_text_set(btn, "Up");
+ elm_box_pack_end(bx, btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _focus_button_clicked_cb, "Up");
+ evas_object_show(btn);
+
+ bx2 = elm_box_add(bx);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ btn = elm_button_add(bx2);
+ elm_object_text_set(btn, "Left");
+ elm_box_pack_end(bx2, btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _focus_button_clicked_cb, "Left");
+ evas_object_show(btn);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_list_horizontal_set(li, horiz);
+ elm_list_select_mode_set(li, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ elm_box_pack_end(bx2, li);
+ evas_object_show(li);
+ evas_object_smart_callback_add(li, "item,focused", _item_cb, "item,focused");
+ evas_object_smart_callback_add(li, "item,unfocused", _item_cb, "item,unfocused");
+ evas_object_smart_callback_add(li, "selected", _item_cb, "selected");
+ evas_object_smart_callback_add(li, "unselected", _item_cb, "unselected");
+ evas_object_smart_callback_add(li, "activated", _item_cb, "activated");
+ evas_object_smart_callback_add(li, "highlighted", _item_cb, "highlighted");
+ evas_object_smart_callback_add(li, "unhighlighted", _item_cb, "unhighlighted");
+ evas_object_event_callback_add(li, EVAS_CALLBACK_KEY_DOWN, _list_key_down_cb, NULL);
+
+ btn = elm_button_add(bx2);
+ elm_object_text_set(btn, "Right");
+ elm_box_pack_end(bx2, btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _focus_button_clicked_cb, "Right");
+ evas_object_show(btn);
+
+ btn = elm_button_add(bx);
+ elm_object_text_set(btn, "Down");
+ elm_box_pack_end(bx, btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _focus_button_clicked_cb, "Down");
+ evas_object_show(btn);
+
+ // Options
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Options");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_opt = elm_box_add(fr);
+ elm_box_horizontal_set(bx_opt, EINA_TRUE);
+ elm_object_content_set(fr, bx_opt);
+ evas_object_show(bx_opt);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Window Auto Focus Enable");
+ elm_check_state_set(chk, EINA_TRUE);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ test_list_focus_win_auto_focus_enable_check_changed,
+ NULL);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Window Auto Focus Animate");
+ elm_check_state_set(chk, EINA_TRUE);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ test_list_focus_win_auto_focus_animate_check_changed,
+ NULL);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Focus Highlight");
+ elm_check_state_set(chk, EINA_FALSE);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ test_list_focus_focus_highlight_check_changed,
+ win);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Focus Animation");
+ elm_check_state_set(chk, EINA_FALSE);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ test_list_focus_focus_animate_check_changed,
+ win);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Focus on selection");
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ test_list_focus_focus_check_changed, li);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ test_list_focus_focus_on_selection_set(li, chk, EINA_FALSE);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Item Looping Enable");
+ elm_check_state_set(chk, elm_object_scroll_item_loop_enabled_get(li));
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ test_list_focus_item_loop_enable_check_changed,
+ li);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Item Select on Focus disable");
+ elm_check_state_set(chk, elm_config_item_select_on_focus_disabled_get());
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ test_list_focus_item_select_on_focus_disable_changed,
+ NULL);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "First item focus on first focus in");
+ elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get());
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(chk, "changed",
+ test_list_first_item_focus_on_first_focus_in_cb,
+ NULL);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+
+ // Focus Autoscroll Mode
+ fr = _focus_autoscroll_mode_frame_create(bx);
+ elm_box_pack_end(bx, fr);
+
+ // Focus Movement Policy
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Focus Movement Policy");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_mv = elm_box_add(fr);
+ elm_box_horizontal_set(bx_mv, EINA_TRUE);
+ elm_object_content_set(fr, bx_mv);
+ evas_object_show(bx_mv);
+
+ rdg = rd = elm_radio_add(bx_mv);
+ elm_object_text_set(rd, "Focus Move by Click");
+ elm_radio_state_value_set(rd, 0);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(rd, "changed",
+ test_list_focus_focus_move_policy_changed,
+ NULL);
+ elm_box_pack_end(bx_mv, rd);
+ evas_object_show(rd);
+
+ rd = elm_radio_add(bx_mv);
+ elm_object_text_set(rd, "Focus Move by Mouse-In");
+ elm_radio_group_add(rd, rdg);
+ elm_radio_state_value_set(rd, 1);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(rd, "changed",
+ test_list_focus_focus_move_policy_changed,
+ NULL);
+ elm_box_pack_end(bx_mv, rd);
+ evas_object_show(rd);
+
+ // Focus/Selection
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Focus/Selection");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_btn = elm_box_add(fr);
+ elm_object_content_set(fr, bx_btn);
+ evas_object_show(bx_btn);
+
+ btn_focus = elm_button_add(bx_btn);
+ elm_object_text_set(btn_focus, "Focus 3rd Item after 1.5 seconds.");
+ evas_object_size_hint_weight_set(btn_focus, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn_focus, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_btn, btn_focus);
+ evas_object_show(btn_focus);
+
+ btn_sel = elm_button_add(bx_btn);
+ elm_object_text_set(btn_sel, "Select 3rd Item after 1.5 seconds.");
+ evas_object_size_hint_weight_set(btn_sel, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn_sel, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_btn, btn_sel);
+ evas_object_show(btn_sel);
+
+ btn_dis = elm_button_add(bx_btn);
+ elm_object_text_set(btn_dis, "Disable 1st Item.");
+ evas_object_size_hint_weight_set(btn_dis, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn_dis, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_btn, btn_dis);
+ evas_object_show(btn_dis);
+
+ for (idx = 0; _list_focus_combo[idx] >= 0; idx++)
+ {
+ lhand = _list_focus_combo[idx] / 10;
+ rhand = _list_focus_combo[idx] % 10;
+
+ if (lhand > 4) lhand = 4;
+ if (rhand > 4) rhand = 4;
+ snprintf(buf, sizeof(buf), " %s / %s ",
+ _list_focus_names[lhand],
+ _list_focus_names[rhand]);
+
+ it = elm_list_item_append(li, buf,
+ test_list_focus_content_get(li, lhand, horiz),
+ test_list_focus_content_get(li, rhand, horiz),
+ NULL, NULL);
+ if (idx == 0)
+ it_0 = it;
+ if (idx == 4)
+ elm_object_item_disabled_set(it, EINA_TRUE);
+ if (idx == 2)
+ it_3 = it;
+ }
+
+ evas_object_smart_callback_add(btn_focus, "clicked", _focus_btn_cb, it_3);
+ evas_object_smart_callback_add(btn_sel, "clicked", _sel_btn_cb, it_3);
+ evas_object_smart_callback_add(btn_dis, "clicked", _dis_btn_cb, it_0);
+
+ elm_list_go(li);
+ evas_object_show(li);
+
+ evas_object_resize(win, 420, 600);
+ evas_object_show(win);
+}
+
+void
+test_list_focus(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _test_list_focus("list-focus", "List Focus", EINA_FALSE);
+}
+
+void
+test_list_horiz_focus(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ _test_list_focus("list-focus-horizontal", "List Focus Horizontal", EINA_TRUE);
+}
+
+void
+test_list_separator(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *li, *ic, *ic2, *bx, *bxx;
+ char buf[PATH_MAX];
+ Elm_Object_Item *list_it_sep;
+
+ win = elm_win_util_standard_add("list", "List Separator");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bxx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bxx);
+ evas_object_show(bxx);
+
+ li = elm_list_add(win);
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bxx, li);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_list_item_append(li, "Hello", ic, NULL, NULL, NULL);
+
+ list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_separator_set(list_it_sep, EINA_TRUE);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_image_file_set(ic, buf, NULL);
+ elm_list_item_append(li, "world", ic, NULL, NULL, NULL);
+
+ list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_separator_set(list_it_sep, EINA_TRUE);
+
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "edit");
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_list_item_append(li, ".", ic, NULL, NULL, NULL);
+
+ list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_separator_set(list_it_sep, EINA_TRUE);
+
+ ic = elm_icon_add(win);
+ elm_icon_standard_set(ic, "delete");
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ ic2 = elm_icon_add(win);
+ elm_icon_standard_set(ic2, "clock");
+ elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE);
+ elm_list_item_append(li, "How", ic, ic2, NULL, NULL);
+
+ list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_separator_set(list_it_sep, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.5);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.5, 0.0);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_align_set(ic, 0.0, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, ic);
+ evas_object_show(ic);
+ elm_list_item_append(li, "are", bx, NULL, NULL, NULL);
+
+ list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_separator_set(list_it_sep, EINA_TRUE);
+
+ elm_list_item_append(li, "you", NULL, NULL, NULL, NULL);
+
+ list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_separator_set(list_it_sep, EINA_TRUE);
+
+ elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL);
+
+ list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_separator_set(list_it_sep, EINA_TRUE);
+
+ elm_list_item_append(li, "?", NULL, NULL, NULL, NULL);
+
+ elm_list_go(li);
+
+ evas_object_show(li);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+/***********/
+
+typedef struct _List_Multi_Data List_Multi_Data;
+struct _List_Multi_Data
+{
+ Evas_Object *list;
+ Evas_Object *rd1;
+ Evas_Object *rd2;
+};
+
+static void
+_multi_select_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool multi = elm_check_state_get(obj);
+ List_Multi_Data *ld = data;
+ if (!ld) return;
+
+ elm_list_multi_select_set(ld->list, multi);
+ elm_object_disabled_set(ld->rd1, !multi);
+ elm_object_disabled_set(ld->rd2, !multi);
+}
+
+static void
+_multi_select_mode_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_list_multi_select_mode_set(data, elm_radio_value_get(obj));
+}
+
+static void
+_multi_select_frame_create(Evas_Object *bx, List_Multi_Data *ld)
+{
+ Evas_Object *fr, *bx2, *bx3, *tg, *rd, *rdg;
+ if (!ld) return;
+
+ fr = elm_frame_add(bx);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(fr, "Multi Select Option");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx2 = elm_box_add(fr);
+ elm_object_content_set(fr, bx2);
+ evas_object_show(bx2);
+
+ tg = elm_check_add(bx2);
+ elm_object_style_set(tg, "toggle");
+ elm_object_text_set(tg, "Multi Select Mode");
+ elm_box_pack_end(bx2, tg);
+ evas_object_show(tg);
+
+ bx3 = elm_box_add(bx2);
+ elm_box_horizontal_set(bx3, EINA_TRUE);
+ elm_box_pack_end(bx2, bx3);
+ evas_object_show(bx3);
+
+ ld->rd1 = rdg = rd = elm_radio_add(bx3);
+ elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT);
+ elm_object_text_set(rd, "Default Mode");
+ elm_box_pack_end(bx3, rd);
+ evas_object_show(rd);
+ elm_object_disabled_set(rd, EINA_TRUE);
+ evas_object_smart_callback_add(rd, "changed",
+ _multi_select_mode_changed_cb, ld->list);
+
+ ld->rd2 = rd = elm_radio_add(bx3);
+ elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "With Control Mode");
+ elm_box_pack_end(bx3, rd);
+ evas_object_show(rd);
+ elm_object_disabled_set(rd, EINA_TRUE);
+ evas_object_smart_callback_add(rd, "changed",
+ _multi_select_mode_changed_cb, ld->list);
+
+ evas_object_smart_callback_add(tg, "changed",
+ _multi_select_changed_cb, ld);
+}
+
+void
+test_list_multi_select(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *li, *bx;
+ List_Multi_Data *ld = calloc(1, sizeof(List_Multi_Data));
+
+ win = elm_win_util_standard_add("list-multi-select", "List Multi Select");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, ld);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ ld->list = li = elm_list_add(bx);
+ _multi_select_frame_create(bx, ld);
+
+ evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, li);
+ evas_object_show(li);
+
+ elm_list_item_append(li, "you", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "out", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "there", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "today", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "?", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "are", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "some", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "more", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "items", NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Longer label.", NULL, NULL, NULL, NULL);
+
+ elm_list_go(li);
+
+ evas_object_resize(win, 320, 500);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_main_menu.c b/src/bin/elementary/test_main_menu.c
new file mode 100644
index 0000000000..507a138709
--- /dev/null
+++ b/src/bin/elementary/test_main_menu.c
@@ -0,0 +1,77 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+static void
+_click_me(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *it = data;
+ Eina_Bool disabled = elm_object_item_disabled_get(it);
+ printf("The first item is now %s\n", disabled ? "enabled" : "disabled");
+ elm_object_item_disabled_set(it, !disabled);
+}
+
+void
+test_main_menu(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *menu, *label, *bx;
+ Elm_Object_Item *menu_it, *menu_it1;
+ char *s;
+ Eina_Bool enabled = EINA_TRUE;
+
+ elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+
+ win = elm_win_util_standard_add("menu", "Menu");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ label = elm_label_add(win);
+ elm_object_text_set(label, "Note: the D-Bus menu example requires support from the "
+ "desktop environment to display the application menu");
+ evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, label);
+ evas_object_show(label);
+
+ s = getenv("ELM_DISABLE_EXTERNAL_MENU");
+ if (s)
+ enabled = !atoi(s);
+
+ if (!enabled)
+ {
+ label = elm_label_add(win);
+ elm_object_text_set(label, "(ELM_DISABLE_EXTERNAL_MENU environment "
+ "variable is set. Using local menu instead)");
+ evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, label);
+ evas_object_show(label);
+ }
+
+ menu = elm_win_main_menu_get(win);
+
+ menu_it = elm_menu_item_add(menu, NULL, NULL, "first item", NULL, NULL);
+ elm_menu_item_add(menu, menu_it, "elementary", "first item", NULL, NULL);
+ menu_it1 = elm_menu_item_add(menu, menu_it, NULL, "submenu", NULL, NULL);
+ elm_menu_item_add(menu, menu_it1, NULL, "first item", NULL, NULL);
+ elm_menu_item_add(menu, menu_it1, "gimp", "second item", NULL, NULL);
+
+ menu_it = elm_menu_item_add(menu, NULL, NULL, "second item", NULL, NULL);
+ menu_it1 = elm_menu_item_add(menu, menu_it, NULL, "disabled item", NULL, NULL);
+ elm_object_item_disabled_set(menu_it1, EINA_TRUE);
+ elm_menu_item_separator_add(menu, menu_it);
+ elm_menu_item_add(menu, menu_it, NULL, "click me :-)", _click_me, menu_it1);
+ elm_menu_item_add(menu, menu_it, "applications-email-panel", "third item", NULL, NULL);
+ menu_it1 = elm_menu_item_add(menu, menu_it, NULL, "sub menu", NULL, NULL);
+ elm_menu_item_add(menu, menu_it1, NULL, "first item", NULL, NULL);
+
+ evas_object_resize(win, 250, 350);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_map.c b/src/bin/elementary/test_map.c
new file mode 100644
index 0000000000..69f03a957e
--- /dev/null
+++ b/src/bin/elementary/test_map.c
@@ -0,0 +1,1208 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define SOURCE_MAX 10
+#define MARKER_MAX 1000
+#define NAME_ENTRY_TEXT "Enter freeform address"
+
+typedef struct Overlay_Data
+{
+ char file[PATH_MAX];
+} Overlay_Data;
+
+typedef struct Map_Source
+{
+ Evas_Object *map;
+ Elm_Map_Source_Type type;
+ char *source_name;
+} Map_Source;
+
+
+static Elm_Map_Overlay *route_start, *route_end, *route_clas;
+static Elm_Map_Overlay *bubble_img;
+static Elm_Map_Overlay *bubble_parking;
+static Elm_Map_Overlay *route_ovl;
+static Elm_Map_Overlay *line_start, *line_end, *line;
+static Elm_Map_Overlay *poly;
+static Elm_Map_Overlay *circle;
+static Elm_Map_Overlay *scale;
+static Eina_List *poly_points;
+
+static Evas_Object *menu, *fs_win;
+static Elm_Map_Route *route;
+static Elm_Map_Name *name;
+static Evas_Object *track;
+static Evas_Coord down_x, down_y;
+static Evas_Coord old_x, old_y, old_d;
+static Map_Source ts[SOURCE_MAX];
+static Map_Source rs[SOURCE_MAX];
+static Map_Source ns[SOURCE_MAX];
+
+static void
+#ifdef ELM_EMAP
+my_map_gpx_fileselector_done(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+#else
+my_map_gpx_fileselector_done(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+#endif
+{
+ const char *selected = event_info;
+
+ if (selected)
+ {
+ printf("Selected file: %s\n", selected);
+#ifdef ELM_EMAP
+ EMap_Route *emap = emap_route_gpx_new(selected);
+ track = elm_map_track_add(data, emap);
+#else
+ printf("libEMap is required !\n");
+#endif
+ }
+ evas_object_del(fs_win);
+}
+
+static Evas_Object *
+_route_icon_get(Evas_Object *obj)
+{
+ Evas_Object *icon = elm_icon_add(obj);
+ elm_image_file_set(icon, PACKAGE_DATA_DIR"/images/bubble.png", NULL);
+ evas_object_show(icon);
+
+ return icon;
+}
+
+static Evas_Object *
+_box_get(Evas_Object *obj, Overlay_Data *data, Elm_Map_Overlay *ovl)
+{
+ Evas_Object *bx, *img, *label;
+ double lon, lat;
+ char buf[256];
+ bx = elm_box_add(obj);
+ evas_object_show(bx);
+
+ img = evas_object_image_add(evas_object_evas_get(obj));
+ evas_object_image_file_set(img, data->file, NULL);
+ evas_object_image_filled_set(img, EINA_TRUE);
+ evas_object_size_hint_min_set(img, 64, 64);
+ evas_object_show(img);
+ elm_box_pack_end(bx, img);
+
+ label = elm_label_add(bx);
+ elm_map_overlay_region_get(ovl, &lon, &lat);
+ snprintf(buf, sizeof(buf), "%0.4lf %0.4lf", lon, lat);
+ elm_object_text_set(label, buf);
+ evas_object_show(label);
+ elm_box_pack_end(bx, label);
+ return bx;
+}
+
+static Evas_Object *
+_label_get(Evas_Object *obj)
+{
+ Evas_Object *label;
+ label = elm_label_add(obj);
+ elm_object_text_set(label, "Here is a parking lot.");
+ evas_object_show(label);
+ return label;
+}
+
+static Evas_Object *
+_icon_get(Evas_Object *obj, Overlay_Data *data)
+{
+ Evas_Object *icon = elm_icon_add(obj);
+ elm_image_file_set(icon, data->file, NULL);
+ evas_object_show(icon);
+
+ return icon;
+}
+
+static void
+_overlay_hide(void *data, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED)
+{
+ elm_map_overlay_hide_set(data, EINA_TRUE);
+}
+
+static void
+_overlay_pause(void *data, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED)
+{
+ elm_map_overlay_paused_set(data, EINA_TRUE);
+}
+
+static void
+_overlay_unpause(void *data, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED)
+{
+ elm_map_overlay_paused_set(data, EINA_FALSE);
+}
+
+static void
+_overlay_show(void *data, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED)
+{
+ elm_map_overlay_show(data);
+}
+
+static Evas_Object *
+_btn_box_get(Evas_Object *obj, Elm_Map_Overlay *ovl)
+{
+ Evas_Object *bx, *btn, *btn2, *btn3, *btn4;
+ bx = elm_box_add(obj);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ btn = elm_button_add(bx);
+ elm_object_text_set(btn, "Hide");
+ evas_object_smart_callback_add(btn, "clicked", _overlay_hide, ovl);
+ evas_object_show(btn);
+ elm_box_pack_end(bx, btn);
+
+ btn2 = elm_button_add(bx);
+ elm_object_text_set(btn2, "Pause");
+ evas_object_smart_callback_add(btn2, "clicked", _overlay_pause, ovl);
+ evas_object_show(btn2);
+ elm_box_pack_end(bx, btn2);
+
+ btn3 = elm_button_add(bx);
+ elm_object_text_set(btn3, "Unpause");
+ evas_object_smart_callback_add(btn3, "clicked", _overlay_unpause, ovl);
+ evas_object_show(btn3);
+ elm_box_pack_end(bx, btn3);
+
+ btn4 = elm_button_add(bx);
+ elm_object_text_set(btn4, "Show");
+ evas_object_smart_callback_add(btn4, "clicked", _overlay_show, ovl);
+ evas_object_show(btn4);
+ elm_box_pack_end(bx, btn4);
+
+ return bx;
+}
+
+static void
+_bubble_parking_follow(Evas_Object *map)
+{
+ double lon, lat;
+ Evas_Coord x, y;
+
+ if (bubble_parking)
+ {
+ Elm_Map_Overlay *ovl = elm_map_overlay_data_get(bubble_parking);
+ elm_map_overlay_region_get(ovl, &lon, &lat);
+ elm_map_region_to_canvas_convert(map, lon, lat, &x, &y);
+ elm_map_canvas_to_region_convert(map, x+40, y+50, &lon, &lat);
+ elm_map_overlay_region_set(bubble_parking, lon, lat);
+ }
+}
+
+static void
+_overlays_num_check(Evas_Object *obj)
+{
+ Evas_Coord x, y, w, h;
+ double lon, lat, max_lon, max_lat, min_lon, min_lat;
+ Eina_List *overlays, *l;
+ Elm_Map_Overlay *ovl;
+ int cnt = 0;
+ int cnt_visible = 0;
+
+ overlays = elm_map_overlays_get(obj);
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ elm_map_canvas_to_region_convert(obj, x, y, &min_lon, &max_lat);
+ elm_map_canvas_to_region_convert(obj, x + w, y + h, &max_lon, &min_lat);
+
+ EINA_LIST_FOREACH(overlays, l, ovl)
+ {
+ if (elm_map_overlay_type_get(ovl) == ELM_MAP_OVERLAY_TYPE_CLASS)
+ continue;
+ elm_map_overlay_region_get(ovl, &lon, &lat);
+ if ((min_lon <= lon) && (lon <= max_lon) &&
+ (min_lat <= lat) && (lat <= max_lat))
+ {
+ if (elm_map_overlay_visible_get(ovl)) cnt_visible++;
+ cnt++;
+ }
+ }
+ printf("Number of (visible/total) overlays in viewport: %d/%d\n",
+ cnt_visible, cnt);
+}
+
+static void
+_map_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("clicked\n");
+}
+
+static void
+_map_clicked_double(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ printf("clicked,double\n");
+ double lon, lat;
+ Evas_Event_Mouse_Down *ev = event_info;
+ if (!ev) return;
+ if (elm_map_zoom_get(obj) < 5) return;
+
+ elm_map_canvas_to_region_convert(obj, ev->canvas.x, ev->canvas.y, &lon, &lat);
+ printf("x:%d, y:%d, lon:%lf, lat:%lf\n", ev->canvas.x, ev->canvas.y, lon, lat);
+
+ if (!route_clas)
+ {
+ route_clas = elm_map_overlay_class_add(obj);
+ elm_map_overlay_icon_set(route_clas, _route_icon_get(obj));
+ elm_map_overlay_displayed_zoom_min_set(route_clas, 5);
+ }
+
+ if (route_start && route_end)
+ {
+ elm_map_overlay_del(route_start);
+ elm_map_overlay_del(route_end);
+ elm_map_route_del(route);
+ route_start = NULL;
+ route_end = NULL;
+ route = NULL;
+ }
+
+ if (!route_start) route_start = elm_map_overlay_add(obj, lon, lat);
+ else route_end = elm_map_overlay_add(obj, lon, lat);
+
+ if (route_start && route_end)
+ {
+ double start_lon, start_lat, end_lon, end_lat;
+ elm_map_overlay_class_append(route_clas, route_start);
+ elm_map_overlay_class_append(route_clas, route_end);
+ elm_map_overlay_region_get(route_start, &start_lon, &start_lat);
+ elm_map_overlay_region_get(route_end, &end_lon, &end_lat);
+ route = elm_map_route_add(obj, ELM_MAP_ROUTE_TYPE_MOTOCAR,
+ ELM_MAP_ROUTE_METHOD_FASTEST,
+ start_lon, start_lat, end_lon, end_lat,
+ NULL, NULL);
+ }
+}
+
+static void
+_map_press(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("press\n");
+}
+
+static void
+_map_longpressed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ if (!event_info) return;
+ double lon, lat;
+ Evas_Event_Mouse_Down *ev = event_info;
+ elm_map_canvas_to_region_convert(obj, ev->canvas.x, ev->canvas.y, &lon, &lat);
+ printf("longpressed, x:%d, y:%d, lon:%lf, lat:%lf\n", ev->canvas.x, ev->canvas.y, lon, lat);
+
+ if (elm_map_zoom_get(obj) < 8) return;
+ if (name) elm_map_name_del(name);
+ name = elm_map_name_add(obj, NULL, lon, lat, NULL, NULL);
+}
+
+static void
+_map_scroll(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ double lon, lat;
+ elm_map_region_get(obj, &lon, &lat);
+ printf("scroll, longitude: %f latitude: %f\n", lon, lat);
+ _bubble_parking_follow(obj);
+}
+
+static void
+_map_drag_start(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("scroll,drag,start\n");
+ evas_object_smart_callback_del(data, "longpressed", _map_longpressed);
+}
+
+static void
+_map_drag_stop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("scroll,drag,stop\n");
+ evas_object_smart_callback_add(data, "longpressed", _map_longpressed, data);
+ _overlays_num_check(obj);
+}
+
+static void
+_map_anim_start(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("scroll,anim,start\n");
+}
+
+static void
+_map_anim_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("scroll,anim,stop\n");
+}
+
+static void
+_map_zoom_start(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("zoom,start\n");
+}
+
+static void
+_map_zoom_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("zoom,stop\n");
+ _overlays_num_check(obj);
+}
+
+static void
+_map_zoom_change(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("zoom,change\n");
+ _bubble_parking_follow(obj);
+}
+
+static void
+_map_loaded(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("loaded\n");
+}
+
+static void
+_map_tile_load(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("tile,load\n");
+}
+
+static void
+_map_tile_loaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ int try_num, finish_num;
+ elm_map_tile_load_status_get(data, &try_num, &finish_num);
+ printf("tile,loaded: %d / %d\n", finish_num, try_num);
+}
+
+static void
+_map_tile_loaded_fail(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ int try_num, finish_num;
+ elm_map_tile_load_status_get(data, &try_num, &finish_num);
+ printf("tile,loaded,fail: %d / %d\n", finish_num, try_num);
+}
+
+static void
+_map_route_load(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("route,load\n");
+}
+
+static void
+_map_route_loaded(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ printf("route,loaded\n");
+ double d;
+ const char *w, *n;
+
+ d = elm_map_route_distance_get(route);
+ printf("route distance = %lf km\n", d);
+
+ w = elm_map_route_waypoint_get(route);
+ if (w) printf("[waypoints]\n%s\n", w);
+
+ n = elm_map_route_node_get(route);
+ if (n) printf("[nodes]\n%s\n", n);
+
+ if (route_ovl) elm_map_overlay_del(route_ovl);
+ route_ovl = elm_map_overlay_route_add(obj, route);
+}
+
+static void
+_map_route_loaded_fail(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("route,loaded,fail\n");
+}
+
+static void
+_map_name_load(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("name,load\n");
+}
+
+static void
+_map_name_loaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("name,loaded\n");
+ if (!name) return;
+ double lon, lat;
+ const char *addr = elm_map_name_address_get(name);
+ elm_map_name_region_get(name, &lon, &lat);
+ if (addr)
+ {
+ printf("name of [lon = %lf, lat = %lf] is %s\n", lon, lat, addr);
+ if ((lon != 0.0) && (lat !=0.0))
+ {
+ Eina_Bool b = elm_map_paused_get(data);
+ elm_map_paused_set(data, EINA_TRUE);
+ elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
+ elm_map_zoom_set(data, elm_map_zoom_max_get(data));
+ elm_map_region_show(data, lon, lat);
+ elm_map_paused_set(data, b);
+ }
+ }
+
+ elm_map_name_del(name);
+ name = NULL;
+}
+
+static void
+_map_name_loaded_fail(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("name,loaded,fail\n");
+}
+
+static void
+_src_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Map_Source *s = data;
+
+ if (!s) return;
+ elm_map_source_set(s->map, s->type, s->source_name);
+}
+
+static void
+_show_urmatt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
+ if (elm_map_zoom_get(data) < 12) elm_map_zoom_set(data, 12);
+ elm_map_region_show(data,7.325201, 48.526813);
+}
+
+static void
+_bring_seoul(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
+ if (elm_map_zoom_get(data) < 12) elm_map_zoom_set(data, 12);
+ elm_map_region_bring_in(data, 126.977969, 37.566535);
+}
+
+static void
+_bring_zoom_suwon(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_region_zoom_bring_in(data, 16, 126.977969, 37.566535);
+}
+
+static void
+_paused_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_paused_set(data, EINA_TRUE);
+}
+
+static void
+_paused_unset(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_paused_set(data, EINA_FALSE);
+}
+
+static void
+_zoom_in(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ int zoom;
+
+ zoom = elm_map_zoom_get(data) + 1;
+ elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
+ elm_map_zoom_set(data, zoom);
+}
+
+static void
+_zoom_out(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ int zoom;
+
+ zoom = elm_map_zoom_get(data) - 1;
+ elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
+ elm_map_zoom_set(data, zoom);
+}
+
+static void
+_zoom_fit(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FIT);
+}
+
+static void
+_zoom_fill(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FILL);
+}
+
+static void
+_zoom_manual(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
+}
+
+static void
+_track_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *fs, *vbox, *hbox, *sep;
+ const char *path = NULL;
+
+ fs_win = elm_win_util_standard_add("fileselector", "File Selector");
+ elm_win_autodel_set(fs_win, EINA_TRUE);
+
+ vbox = elm_box_add(fs_win);
+ evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(fs_win, vbox);
+ evas_object_show(vbox);
+
+ fs = elm_fileselector_add(fs_win);
+ elm_fileselector_is_save_set(fs, EINA_TRUE);
+ elm_fileselector_expandable_set(fs, EINA_FALSE);
+ path = eina_environment_home_get();
+ //if "HOME" is not available, set current dir. path
+ if (!path)
+ path = ".";
+ elm_fileselector_path_set(fs, path);
+ evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fs, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(vbox, fs);
+ evas_object_show(fs);
+
+ evas_object_smart_callback_add(fs, "done", my_map_gpx_fileselector_done, data);
+
+ sep = elm_separator_add(fs_win);
+ elm_separator_horizontal_set(sep, EINA_TRUE);
+ elm_box_pack_end(vbox, sep);
+ evas_object_show(sep);
+
+ hbox = elm_box_add(fs_win);
+ elm_box_horizontal_set(hbox, EINA_TRUE);
+ elm_box_pack_end(vbox, hbox);
+ evas_object_show(hbox);
+
+ evas_object_resize(fs_win, 240, 350);
+ evas_object_show(fs_win);
+}
+
+
+static void
+_track_remove(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_track_remove(data, track);
+}
+
+static void
+_rotate_cw(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ double d;
+ Evas_Coord x, y, w, h;
+ float half_w, half_h;
+ evas_object_geometry_get(data, &x, &y, &w, &h);
+ half_w = (float)w * 0.5;
+ half_h = (float)h * 0.5;
+
+ elm_map_rotate_get(data, &d, NULL, NULL);
+ d += 15.0;
+ elm_map_rotate_set(data, d, x + half_w, y + half_h);
+}
+
+static void
+_rotate_ccw(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ double d;
+ Evas_Coord x, y, w, h;
+ float half_w, half_h;
+ evas_object_geometry_get(data, &x, &y, &w, &h);
+ half_w = (float)w * 0.5;
+ half_h = (float)h * 0.5;
+
+ elm_map_rotate_get(data, &d, NULL, NULL);
+ d -= 15.0;
+ elm_map_rotate_set(data, d, x + half_w, y + half_h);
+}
+
+static void
+_rotate_reset(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Coord x, y, w, h;
+ float half_w, half_h;
+ evas_object_geometry_get(data, &x, &y, &w, &h);
+ half_w = (float)w * 0.5;
+ half_h = (float)h * 0.5;
+
+ elm_map_rotate_set(data, 0.0, x + half_w, y + half_h);
+}
+
+static void
+_wheel_disable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_wheel_disabled_set(data, EINA_TRUE);
+}
+
+static void
+_wheel_enable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_wheel_disabled_set(data, EINA_FALSE);
+}
+
+static void
+_zoom_min_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_zoom_min_set(data, 1);
+}
+
+static void
+_zoom_max_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_map_zoom_max_set(data, 10);
+}
+
+static void
+_line_add(void *data, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED)
+{
+ double lon, lat;
+
+ elm_map_canvas_to_region_convert(data, down_x, down_y, &lon, &lat);
+ printf("line marker: %d %d %lf %lf\n", down_x, down_y, lon, lat);
+ if (line_start && line_end)
+ {
+ elm_map_overlay_del(line_start);
+ elm_map_overlay_del(line_end);
+ elm_map_overlay_del(line);
+ line_start = NULL;
+ line_end = NULL;
+ line = NULL;
+ }
+ if (!line_start) line_start = elm_map_overlay_add(data, lon, lat);
+ else if (!line_end) line_end = elm_map_overlay_add(data, lon, lat);
+
+ if (line_start && line_end)
+ {
+ double flon, flat, tlon, tlat;
+ elm_map_overlay_region_get(line_start, &flon, &flat);
+ elm_map_overlay_region_get(line_end, &tlon, &tlat);
+ line = elm_map_overlay_line_add(data, flon, flat, tlon, tlat);
+ printf("line add: (%lf, %lf) --> (%lf, %lf)\n", flon, flat, tlon, tlat);
+ }
+}
+
+static void
+_poly_add(void *data, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED)
+{
+ double lon, lat;
+
+ elm_map_canvas_to_region_convert(data, down_x, down_y, &lon, &lat);
+ printf("%d %d %lf %lf\n", down_x, down_y, lon, lat);
+
+ if (!poly) poly = elm_map_overlay_polygon_add(data);
+ poly_points = eina_list_append(poly_points,
+ elm_map_overlay_add(data, lon, lat));
+ elm_map_overlay_polygon_region_add(poly, lon, lat);
+}
+
+static void
+_poly_clear(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED)
+{
+ Elm_Map_Overlay *ovl;
+ if (poly) elm_map_overlay_del(poly);
+ EINA_LIST_FREE(poly_points, ovl) elm_map_overlay_del(ovl);
+ poly = NULL;
+ poly_points = NULL;
+}
+
+static void
+_circle_add(void *data, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED)
+{
+ double radius = 100;
+ double lon, lat;
+
+ if (circle) elm_map_overlay_del(circle);
+ elm_map_canvas_to_region_convert(data, down_x, down_y, &lon, &lat);
+ circle = elm_map_overlay_circle_add(data, lon, lat, radius);
+}
+
+static void
+_scale_add(void *data, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED)
+{
+ if (scale) elm_map_overlay_del(scale);
+ scale = elm_map_overlay_scale_add(data, down_x, down_y);
+}
+
+static void
+_submenu_src_add(void *data, Elm_Object_Item *parent)
+{
+ int idx;
+ const char **tile_srcs;
+ const char **route_srcs;
+ const char **name_srcs;
+
+ if ((!data) || (!parent)) return;
+
+ tile_srcs = elm_map_sources_get(data, ELM_MAP_SOURCE_TYPE_TILE);
+ route_srcs = elm_map_sources_get(data, ELM_MAP_SOURCE_TYPE_ROUTE);
+ name_srcs = elm_map_sources_get(data, ELM_MAP_SOURCE_TYPE_NAME);
+
+ for (idx = 0; tile_srcs[idx]; idx++)
+ {
+ if (idx >= SOURCE_MAX) break;
+ ts[idx].map = data;
+ ts[idx].type = ELM_MAP_SOURCE_TYPE_TILE;
+ ts[idx].source_name = strdup(tile_srcs[idx]);
+ elm_menu_item_add(menu, parent, "", tile_srcs[idx], _src_set, &ts[idx]);
+ }
+ for (idx = 0; route_srcs[idx]; idx++)
+ {
+ if (idx >= SOURCE_MAX) break;
+ rs[idx].map = data;
+ rs[idx].type = ELM_MAP_SOURCE_TYPE_ROUTE;
+ rs[idx].source_name = strdup(route_srcs[idx]);
+ elm_menu_item_add(menu, parent, "", route_srcs[idx], _src_set, &rs[idx]);
+ }
+ for (idx = 0; name_srcs[idx]; idx++)
+ {
+ if (idx >= SOURCE_MAX) break;
+ ns[idx].map = data;
+ ns[idx].type = ELM_MAP_SOURCE_TYPE_NAME;
+ ns[idx].source_name = strdup(name_srcs[idx]);
+ elm_menu_item_add(menu, parent, "", name_srcs[idx], _src_set, &ns[idx]);
+ }
+}
+
+static void
+_submenu_move_add(void *data, Elm_Object_Item *parent)
+{
+ if ((!data) || (!parent)) return;
+ elm_menu_item_add(menu, parent, NULL, "Show Urmatt", _show_urmatt, data);
+ elm_menu_item_add(menu, parent, NULL, "Bring Seoul", _bring_seoul, data);
+ elm_menu_item_add(menu, parent, NULL, "Zoom & Bring Suwon", _bring_zoom_suwon, data);
+
+}
+
+static void
+_submenu_zoom_add(void *data, Elm_Object_Item *parent)
+{
+ if ((!data) || (!parent)) return;
+ elm_menu_item_add(menu, parent, NULL, "Zoom +", _zoom_in, data);
+ elm_menu_item_add(menu, parent, NULL, "Zoom -", _zoom_out, data);
+ elm_menu_item_add(menu, parent, NULL, "Zoom Fit", _zoom_fit, data);
+ elm_menu_item_add(menu, parent, NULL, "Zoom Fill", _zoom_fill, data);
+ elm_menu_item_add(menu, parent, NULL, "Zoom Manual", _zoom_manual, data);
+ elm_menu_item_add(menu, parent, NULL, "Zoom Min to 1", _zoom_min_set, data);
+ elm_menu_item_add(menu, parent, NULL, "Zoom Max to 10", _zoom_max_set, data);
+}
+
+static void
+_submenu_prop_add(void *data, Elm_Object_Item *parent)
+{
+ if ((!data) || (!parent)) return;
+ elm_menu_item_add(menu, parent, NULL, "Paused Set", _paused_set, data);
+ elm_menu_item_add(menu, parent, NULL, "Paused Unset", _paused_unset, data);
+ elm_menu_item_add(menu, parent, NULL, "Rotate CW", _rotate_cw, data);
+ elm_menu_item_add(menu, parent, NULL, "Rotate CCW", _rotate_ccw, data);
+ elm_menu_item_add(menu, parent, NULL, "Reset Rotate", _rotate_reset, data);
+ elm_menu_item_add(menu, parent, NULL, "Disable Wheel", _wheel_disable, data);
+ elm_menu_item_add(menu, parent, NULL, "Enable Wheel", _wheel_enable, data);
+}
+
+static void
+_submenu_track_add(void *data, Elm_Object_Item *parent)
+{
+ if ((!data) || (!parent)) return;
+ elm_menu_item_add(menu, parent, NULL, "Add Track", _track_add, data);
+ elm_menu_item_add(menu, parent, NULL, "Remove Track", _track_remove, data);
+}
+
+static void
+_submenu_ovl_add(void *data, Elm_Object_Item *parent)
+{
+ if ((!data) || (!parent)) return;
+ elm_menu_item_add(menu, parent, NULL, "Add line", _line_add, data);
+ elm_menu_item_add(menu, parent, NULL, "Add polygon", _poly_add, data);
+ elm_menu_item_add(menu, parent, NULL, "Clear polygon", _poly_clear, data);
+ elm_menu_item_add(menu, parent, NULL, "Add circle", _circle_add, data);
+ elm_menu_item_add(menu, parent, NULL, "Add scale", _scale_add, data);
+}
+
+static void
+_submenu_info_add(Evas_Object *map, Elm_Object_Item *parent)
+{
+ if (!map || !parent) return;
+ char buf[PATH_MAX] = { 0 };
+ double lon = 0.0, lat = 0.0;
+
+ elm_map_canvas_to_region_convert(map,
+ down_x, down_y,
+ &lon, &lat);
+
+ snprintf(buf, PATH_MAX, "Longitude : %f", lon);
+ elm_menu_item_add(menu, parent, NULL, buf, NULL, NULL);
+
+ snprintf(buf, PATH_MAX, "Latitude : %f", lat);
+ elm_menu_item_add(menu, parent, NULL, buf, NULL, NULL);
+}
+
+static void
+_map_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = event_info;
+ Elm_Object_Item *menu_it;
+ static Elm_Object_Item *info_it = NULL;
+
+ if (!ev) return;
+
+ if (ev->button == 2)
+ {
+ old_x = ev->canvas.x;
+ old_y = ev->canvas.y;
+ old_d = 0.0;
+ }
+ else if (ev->button == 3)
+ {
+ down_x = ev->canvas.x;
+ down_y = ev->canvas.y;
+ if (!menu)
+ {
+ menu = elm_menu_add(obj);
+ elm_menu_parent_set(menu, obj);
+ menu_it = elm_menu_item_add(menu, NULL, "", "Source", NULL, NULL);
+ _submenu_src_add(data, menu_it);
+ menu_it = elm_menu_item_add(menu, NULL, "", "Move", NULL, NULL);
+ _submenu_move_add(data, menu_it);
+ menu_it = elm_menu_item_add(menu, NULL, "", "Zoom", NULL, NULL);
+ _submenu_zoom_add(data, menu_it);
+ menu_it = elm_menu_item_add(menu, NULL, "", "Prop", NULL, NULL);
+ _submenu_prop_add(data, menu_it);
+ menu_it = elm_menu_item_add(menu, NULL, "", "Track", NULL, NULL);
+ _submenu_track_add(data, menu_it);
+ menu_it = elm_menu_item_add(menu, NULL, "", "Overlay", NULL, NULL);
+ _submenu_ovl_add(data, menu_it);
+
+ info_it = elm_menu_item_add(menu, NULL, "", "Info", NULL, NULL);
+ }
+
+ elm_menu_item_subitems_clear(info_it);
+ _submenu_info_add(obj, info_it);
+
+ elm_menu_move(menu, ev->canvas.x, ev->canvas.y);
+ evas_object_show(menu);
+ }
+}
+
+static void
+_map_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Mouse_Move *move = event_info;
+ Evas_Coord x, y, w, h;
+ float half_w, half_h;
+ int d, d_diff;
+ double cur_d;
+ if (!move) return;
+
+ if (move->buttons == 2)
+ {
+ evas_object_geometry_get(data, &x, &y, &w, &h);
+ half_w = (float)w * 0.5;
+ half_h = (float)h * 0.5;
+ elm_map_rotate_get(data, &cur_d, NULL, NULL);
+
+ d = move->cur.canvas.x - old_x;
+ if (!old_d) old_d = d;
+ else
+ {
+ d_diff = old_d - d;
+ if (d_diff > 0)
+ {
+ old_d --;
+ cur_d += 1.0;
+ }
+ else if (d_diff < 0)
+ {
+ old_d ++;
+ cur_d -= 1.0;
+ }
+ old_d = d;
+ elm_map_rotate_set(data, cur_d, x + half_w, y + half_h);
+ }
+ }
+}
+
+static void
+_map_mouse_up(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Mouse_Up *up = event_info;
+ if (!up) return;
+
+ if (up->button == 2)
+ {
+ old_x = 0;
+ old_y = 0;
+ }
+}
+
+static void
+_overlay_cb(void *data EINA_UNUSED, Evas_Object *map, void *ev)
+{
+ printf("Overlay clicked: ");
+ Elm_Map_Overlay *overlay = ev;
+ Overlay_Data *od;
+ Elm_Map_Overlay_Type type = elm_map_overlay_type_get(overlay);
+
+ if (type != ELM_MAP_OVERLAY_TYPE_GROUP &&
+ type != ELM_MAP_OVERLAY_TYPE_DEFAULT) return;
+
+ if (!bubble_img) bubble_img = elm_map_overlay_bubble_add(map);
+ elm_map_overlay_bubble_follow(bubble_img, overlay);
+ elm_map_overlay_bubble_content_clear(bubble_img);
+
+ if (type == ELM_MAP_OVERLAY_TYPE_GROUP)
+ {
+ Eina_List *l;
+ Elm_Map_Overlay *memb;
+ Eina_List *members = elm_map_overlay_group_members_get(overlay);
+ printf("Group Members Num: %d\n", eina_list_count(members));
+ EINA_LIST_FOREACH(members, l, memb)
+ {
+ od = elm_map_overlay_data_get(memb);
+ if (od)
+ elm_map_overlay_bubble_content_append(bubble_img,
+ _box_get(map, od, memb));
+ }
+ }
+ else
+ {
+ od = elm_map_overlay_data_get(overlay);
+ if (od)
+ elm_map_overlay_bubble_content_append(bubble_img,
+ _box_get(map, od, overlay));
+ elm_map_overlay_bubble_content_append(bubble_img,
+ _btn_box_get(map, overlay));
+ }
+}
+
+static void
+_parking_cb(void *data EINA_UNUSED, Evas_Object *map, Elm_Map_Overlay *ovl)
+{
+ double lon, lat;
+ Evas_Coord x, y;
+ elm_map_overlay_region_get(ovl, &lon, &lat);
+ elm_map_region_to_canvas_convert(map, lon, lat, &x, &y);
+ printf("Parking clicked: %lf %lf %d %d\n", lon, lat, x, y);
+
+ elm_map_canvas_to_region_convert(map, x+40, y+50, &lon, &lat);
+ if (!bubble_parking)
+ {
+ Evas_Object *bubble, *label;
+ bubble = elm_bubble_add(map);
+ elm_bubble_pos_set(bubble, ELM_BUBBLE_POS_TOP_LEFT);
+ elm_object_text_set(bubble, "Overlay object");
+ elm_object_part_text_set(bubble, "info", "Bubble is overlayed");
+
+ label = elm_label_add(bubble);
+ elm_object_text_set(label, "Parking Here !!");
+ evas_object_show(label);
+ elm_object_content_set(bubble, label);
+
+ evas_object_resize(bubble, 125, 50);
+ evas_object_show(bubble);
+
+ bubble_parking = elm_map_overlay_add(map, lon, lat);
+ elm_map_overlay_content_set(bubble_parking, bubble);
+ }
+ else elm_map_overlay_region_set(bubble_parking, lon, lat);
+ elm_map_overlay_data_set(bubble_parking, ovl);
+}
+
+static void
+_del_map(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED)
+{
+ if (route_start) elm_map_overlay_del(route_start);
+ if (route_end) elm_map_overlay_del(route_end);
+ if (route_clas) elm_map_overlay_del(route_clas);
+ if (bubble_img) elm_map_overlay_del(bubble_img);
+ if (bubble_parking) elm_map_overlay_del(bubble_parking);
+ if (route_ovl) elm_map_overlay_del(route_ovl);
+ route_start = NULL;
+ route_end = NULL;
+ route_clas = NULL;
+ bubble_img = NULL;
+ bubble_parking = NULL;
+ route_ovl = NULL;
+
+ if (route) elm_map_route_del(route);
+ if (name) elm_map_name_del(name);
+ if (menu) evas_object_del(menu);
+ route = NULL;
+ name = NULL;
+ menu = NULL;
+}
+
+void
+test_map(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *map;
+ int idx = 0;
+ const char **tile_srcs;
+ const char **route_srcs;
+ const char **name_srcs;
+ Overlay_Data data1;
+ Overlay_Data data2;
+ Overlay_Data data3;
+ Overlay_Data data4;
+ Overlay_Data data5;
+ Overlay_Data data6;
+ Overlay_Data data7;
+ Overlay_Data data8;
+ Overlay_Data data9;
+ Overlay_Data data10;
+ Overlay_Data data11;
+ Overlay_Data parking;
+ Overlay_Data icon_data;
+
+ snprintf(data1.file, PATH_MAX, "%s/images/logo.png", elm_app_data_dir_get());
+ snprintf(data2.file, PATH_MAX, "%s/images/logo_small.png", elm_app_data_dir_get());
+ snprintf(data3.file, PATH_MAX, "%s/images/panel_01.png", elm_app_data_dir_get());
+ snprintf(data4.file, PATH_MAX, "%s/images/plant_01.png", elm_app_data_dir_get());
+ snprintf(data5.file, PATH_MAX, "%s/images/rock_01.png", elm_app_data_dir_get());
+ snprintf(data6.file, PATH_MAX, "%s/images/rock_02.png", elm_app_data_dir_get());
+ snprintf(data7.file, PATH_MAX, "%s/images/sky_01.png", elm_app_data_dir_get());
+ snprintf(data8.file, PATH_MAX, "%s/images/sky_02.png", elm_app_data_dir_get());
+ snprintf(data9.file, PATH_MAX, "%s/images/sky_03.png", elm_app_data_dir_get());
+ snprintf(data10.file, PATH_MAX, "%s/images/sky_03.png", elm_app_data_dir_get());
+ snprintf(data11.file, PATH_MAX, "%s/images/wood_01.png", elm_app_data_dir_get());
+ snprintf(parking.file, PATH_MAX, "%s/images/parking.png", elm_app_data_dir_get());
+ snprintf(icon_data.file, PATH_MAX, "%s/images/icon_14.png", elm_app_data_dir_get());
+
+ win = elm_win_util_standard_add("map", "Map");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ map = elm_map_add(win);
+ if (map)
+ {
+ Elm_Map_Overlay *ovl_1, *ovl_2, *ovl_3, *ovl_4, *ovl_5, *ovl_6;
+ Elm_Map_Overlay *ovl_7, *ovl_8, *ovl_9, *ovl_10, *ovl_11;
+ Elm_Map_Overlay *parking1, *parking2, *parking3, *parking4, *parking5;
+ Elm_Map_Overlay *grp1, *grp2, *grp_parking;
+
+ evas_object_event_callback_add(map, EVAS_CALLBACK_DEL, _del_map, NULL);
+
+ srand(time(NULL));
+
+ tile_srcs = elm_map_sources_get(map, ELM_MAP_SOURCE_TYPE_TILE);
+ route_srcs = elm_map_sources_get(map, ELM_MAP_SOURCE_TYPE_ROUTE);
+ name_srcs = elm_map_sources_get(map, ELM_MAP_SOURCE_TYPE_NAME);
+
+ if (!tile_srcs) return;
+ printf("Tile sources [ ");
+ for (idx = 0; tile_srcs[idx] ; idx++) printf("%s, ", tile_srcs[idx]);
+ printf("]\n");
+ if (!route_srcs) return;
+ printf("Route sources [ ");
+ for (idx = 0; route_srcs[idx] ; idx++) printf("%s, ", route_srcs[idx]);
+ printf("]\n");
+ if (!name_srcs) return;
+ printf("Name sources [ ");
+ for (idx = 0; name_srcs[idx] ; idx++) printf("%s, ", name_srcs[idx]);
+ printf("]\n");
+
+ evas_object_size_hint_weight_set(map, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, map);
+ evas_object_data_set(map, "window", win);
+
+ evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_DOWN,
+ _map_mouse_down, map);
+ evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_MOVE,
+ _map_mouse_move, map);
+ evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_UP,
+ _map_mouse_up, map);
+
+ evas_object_smart_callback_add(map, "clicked", _map_clicked, map);
+ evas_object_smart_callback_add(map, "clicked,double", _map_clicked_double, map);
+ evas_object_smart_callback_add(map, "press", _map_press, map);
+ evas_object_smart_callback_add(map, "longpressed", _map_longpressed, map);
+ evas_object_smart_callback_add(map, "scroll", _map_scroll, map);
+ evas_object_smart_callback_add(map, "scroll,drag,start", _map_drag_start, map);
+ evas_object_smart_callback_add(map, "scroll,drag,stop", _map_drag_stop, map);
+ evas_object_smart_callback_add(map, "scroll,anim,start", _map_anim_start, map);
+ evas_object_smart_callback_add(map, "scroll,anim,stop", _map_anim_stop, map);
+ evas_object_smart_callback_add(map, "zoom,start", _map_zoom_start, map);
+ evas_object_smart_callback_add(map, "zoom,stop", _map_zoom_stop, map);
+ evas_object_smart_callback_add(map, "zoom,change", _map_zoom_change, map);
+ evas_object_smart_callback_add(map, "loaded", _map_loaded, map);
+ evas_object_smart_callback_add(map, "tile,load", _map_tile_load, map);
+ evas_object_smart_callback_add(map, "tile,loaded", _map_tile_loaded, map);
+ evas_object_smart_callback_add(map, "tile,loaded,fail", _map_tile_loaded_fail, map);
+ evas_object_smart_callback_add(map, "route,load", _map_route_load, map);
+ evas_object_smart_callback_add(map, "route,loaded", _map_route_loaded, map);
+ evas_object_smart_callback_add(map, "route,loaded,fail", _map_route_loaded_fail, map);
+ evas_object_smart_callback_add(map, "name,load", _map_name_load, map);
+ evas_object_smart_callback_add(map, "name,loaded", _map_name_loaded, map);
+ evas_object_smart_callback_add(map, "name,loaded,fail", _map_name_loaded_fail, map);
+ evas_object_smart_callback_add(map, "overlay,clicked", _overlay_cb, map);
+
+ // Create Overlays
+ ovl_1 = elm_map_overlay_add(map, 2.352, 48.857);
+ elm_map_overlay_color_set(ovl_1, 0x00, 0xfa, 0x9a, 0xff);
+ elm_map_overlay_displayed_zoom_min_set(ovl_1, 5);
+ ovl_2 = elm_map_overlay_add(map, 3, 48.857);
+ elm_map_overlay_color_set(ovl_2, 0xff, 0xd7, 0x00, 0xff);
+ elm_map_overlay_displayed_zoom_min_set(ovl_2, 4);
+ ovl_3 = elm_map_overlay_add(map, 2.352, 49);
+ elm_map_overlay_displayed_zoom_min_set(ovl_3, 3);
+ ovl_4 = elm_map_overlay_add(map, 7.31451, 48.857127);
+ ovl_5 = elm_map_overlay_add(map, 7.314704, 48.857119);
+ ovl_6 = elm_map_overlay_add(map, 7.31432, 48.856785);
+ ovl_7 = elm_map_overlay_add(map, 7.3148, 48.85725);
+ ovl_8 = elm_map_overlay_add(map, 7.316445, 48.8572210000694);
+ ovl_9 = elm_map_overlay_add(map, 7.316527000125, 48.85609);
+ ovl_10 = elm_map_overlay_add(map, 7.3165409990833, 48.856078);
+ ovl_11 = elm_map_overlay_add(map, 7.319812, 48.856561);
+ elm_map_overlay_data_set(ovl_1, &data1);
+ elm_map_overlay_data_set(ovl_2, &data2);
+ elm_map_overlay_data_set(ovl_3, &data3);
+ elm_map_overlay_data_set(ovl_4, &data4);
+ elm_map_overlay_data_set(ovl_5, &data5);
+ elm_map_overlay_data_set(ovl_6, &data6);
+ elm_map_overlay_data_set(ovl_7, &data7);
+ elm_map_overlay_data_set(ovl_8, &data8);
+ elm_map_overlay_data_set(ovl_9, &data9);
+ elm_map_overlay_data_set(ovl_10, &data10);
+ elm_map_overlay_data_set(ovl_11, &data11);
+
+ // Append overlays to groups
+ grp1 = elm_map_overlay_class_add(map);
+ elm_map_overlay_class_zoom_max_set(grp1, 6);
+ elm_map_overlay_class_append(grp1, ovl_1);
+ elm_map_overlay_class_append(grp1, ovl_2);
+ elm_map_overlay_class_append(grp1, ovl_3);
+ elm_map_overlay_class_append(grp1, ovl_4);
+ elm_map_overlay_class_append(grp1, ovl_5);
+ elm_map_overlay_class_append(grp1, ovl_6);
+
+ // Append overlays to groups
+ grp2 = elm_map_overlay_class_add(map);
+ elm_map_overlay_displayed_zoom_min_set(grp2, 9);
+ elm_map_overlay_class_append(grp2, ovl_7);
+ elm_map_overlay_class_append(grp2, ovl_8);
+ elm_map_overlay_class_append(grp2, ovl_9);
+ elm_map_overlay_class_append(grp2, ovl_10);
+ elm_map_overlay_class_append(grp2, ovl_11);
+
+ // Create overlays
+ parking1 = elm_map_overlay_add(map, 127.04871, 37.25730);
+ parking2 = elm_map_overlay_add(map, 127.05578, 37.25545);
+ parking3 = elm_map_overlay_add(map, 127.05515, 37.25439);
+ parking4 = elm_map_overlay_add(map, 127.05328, 37.25721);
+ elm_map_overlay_icon_set(parking4, _icon_get(map, &icon_data));
+ parking5 = elm_map_overlay_add(map, 127.05431, 37.25873);
+ elm_map_overlay_content_set(parking5, _label_get(map));
+ elm_map_overlay_get_cb_set(parking1, _parking_cb, NULL);
+ elm_map_overlay_get_cb_set(parking2, _parking_cb, NULL);
+ elm_map_overlay_get_cb_set(parking3, _parking_cb, NULL);
+ elm_map_overlay_get_cb_set(parking4, _parking_cb, NULL);
+ elm_map_overlay_get_cb_set(parking5, _parking_cb, NULL);
+
+ // Append overlays to groups
+ grp_parking = elm_map_overlay_class_add(map);
+ elm_map_overlay_icon_set(grp_parking, _icon_get(map, &parking));
+ elm_map_overlay_get_cb_set(grp_parking, _parking_cb, NULL);
+ elm_map_overlay_class_append(grp_parking, parking1);
+ elm_map_overlay_class_append(grp_parking, parking2);
+ elm_map_overlay_class_append(grp_parking, parking3);
+ elm_map_overlay_class_append(grp_parking, parking4);
+ elm_map_overlay_class_append(grp_parking, parking5);
+
+ evas_object_show(map);
+ }
+
+ evas_object_resize(win, 800, 800);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_menu.c b/src/bin/elementary/test_menu.c
new file mode 100644
index 0000000000..ec084e68a4
--- /dev/null
+++ b/src/bin/elementary/test_menu.c
@@ -0,0 +1,312 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_menu_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("menu dismissed callback is called!\n");
+}
+
+static void
+_menu_show_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = event_info;
+ elm_menu_move(data, ev->canvas.x, ev->canvas.y);
+ evas_object_show(data);
+}
+
+static void
+_populate_4(Evas_Object *menu, Elm_Object_Item *menu_it)
+{
+ Elm_Object_Item *menu_it2;
+
+ elm_menu_item_add(menu, menu_it, "go-bottom", "menu 2", NULL, NULL);
+ elm_menu_item_add(menu, menu_it, "go-first", "menu 3", NULL, NULL);
+ elm_menu_item_separator_add(menu, menu_it);
+ menu_it2 = elm_menu_item_add(menu, menu_it, "go-last", "Disabled item", NULL,
+ NULL);
+ elm_object_item_disabled_set(menu_it2, EINA_TRUE);
+ menu_it2 = elm_menu_item_add(menu, menu_it, "go-next", "Disabled item", NULL,
+ NULL);
+ elm_object_item_disabled_set(menu_it2, EINA_TRUE);
+ menu_it2 = elm_menu_item_add(menu, menu_it, "go-up", "Disabled item", NULL,
+ NULL);
+ elm_object_item_disabled_set(menu_it2, EINA_TRUE);
+}
+
+static void
+_populate_3(Evas_Object *menu, Elm_Object_Item *menu_it)
+{
+ Elm_Object_Item *menu_it2;
+
+ elm_menu_item_add(menu, menu_it, "media-eject", "menu 2", NULL, NULL);
+ elm_menu_item_add(menu, menu_it, "media-playback-start", "menu 3", NULL,
+ NULL);
+ elm_menu_item_separator_add(menu, menu_it);
+ menu_it2 = elm_menu_item_add(menu, menu_it, "media-playback-stop",
+ "Disabled item", NULL, NULL);
+ elm_object_item_disabled_set(menu_it2, EINA_TRUE);
+}
+
+static void
+_populate_2(Evas_Object *menu, Elm_Object_Item *menu_it)
+{
+ Elm_Object_Item *menu_it2, *menu_it3;
+
+ elm_menu_item_add(menu, menu_it, "system-reboot", "menu 2", NULL, NULL);
+ menu_it2 = elm_menu_item_add(menu, menu_it, "system-shutdown", "menu 3",
+ NULL, NULL);
+ _populate_3(menu, menu_it2);
+
+ elm_menu_item_separator_add(menu, menu_it);
+ elm_menu_item_separator_add(menu, menu_it);
+ elm_menu_item_separator_add(menu, menu_it);
+ elm_menu_item_separator_add(menu, menu_it);
+ elm_menu_item_separator_add(menu, menu_it);
+ elm_menu_item_separator_add(menu, menu_it);
+ elm_menu_item_separator_add(menu, menu_it);
+
+ menu_it2 = elm_menu_item_add(menu, menu_it, "system-lock-screen", "menu 2",
+ NULL, NULL);
+ elm_menu_item_separator_add(menu, menu_it);
+
+ menu_it3 = elm_menu_item_add(menu, menu_it, "system-run", "Disabled item",
+ NULL, NULL);
+ elm_object_item_disabled_set(menu_it3, EINA_TRUE);
+
+ _populate_4(menu, menu_it2);
+}
+
+static void
+_populate_1(Evas_Object *menu, Elm_Object_Item *menu_it)
+{
+ Elm_Object_Item *menu_it2, *menu_it3;
+ Evas_Object *radio;
+
+ radio = elm_radio_add(menu);
+ elm_radio_state_value_set(radio, 0);
+ elm_radio_value_set(radio, 0);
+ elm_object_text_set(radio, "radio in menu");
+ menu_it2 = elm_menu_item_add(menu, menu_it, "object-rotate-left", "menu 1",
+ NULL, NULL);
+ menu_it3 = elm_menu_item_add(menu, menu_it, NULL, NULL, NULL, NULL);
+ elm_object_item_content_set(menu_it3, radio);
+
+ _populate_2(menu, menu_it2);
+}
+
+void
+test_menu(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *rect, *lbl, *menu;
+ Elm_Object_Item *menu_it;
+
+ win = elm_win_util_standard_add("menu", "Menu");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ lbl = elm_label_add(win);
+ elm_object_text_set(lbl, "Click background to populate menu!");
+ evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, lbl);
+ evas_object_show(lbl);
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, rect);
+ evas_object_color_set(rect, 0, 0, 0, 0);
+ evas_object_show(rect);
+
+ menu = elm_menu_add(win);
+ evas_object_smart_callback_add(menu, "dismissed", _menu_dismissed_cb, NULL);
+
+ elm_menu_item_add(menu, NULL, NULL, "first item", NULL, NULL);
+
+ menu_it = elm_menu_item_add(menu, NULL, "mail-reply-all", "second item",
+ NULL, NULL);
+ _populate_1(menu, menu_it);
+
+ elm_menu_item_add(menu, menu_it, "window-new", "sub menu", NULL, NULL);
+
+ evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_DOWN,
+ _menu_show_cb, menu);
+
+ evas_object_resize(win, 350, 200);
+ evas_object_show(win);
+}
+
+static void
+_parent_set_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *mn = data;
+ if (!mn) return;
+
+ Evas_Object *parent = evas_object_data_get(mn, "parent_1");
+ if (elm_menu_parent_get(mn) == parent)
+ {
+ parent = evas_object_data_get(mn, "parent_2");
+ }
+
+ elm_menu_parent_set(mn, parent);
+}
+
+static void
+_icon_set_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *menu_it = data;
+ const char *icon_name = NULL;
+ if (!menu_it) return;
+
+ icon_name = elm_menu_item_icon_name_get(menu_it);
+ if ((icon_name) && !strcmp(icon_name, "home"))
+ {
+ elm_menu_item_icon_name_set(menu_it, "file");
+ return;
+ }
+ elm_menu_item_icon_name_set(menu_it, "home");
+}
+
+static void
+_item_select_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *menu_it = data;
+ if (!menu_it) return;
+
+ elm_menu_item_selected_set(menu_it, !elm_menu_item_selected_get(menu_it));
+}
+
+static void
+_separators_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ const Eina_List *sis = NULL;
+ const Eina_List *l = NULL;
+ Elm_Object_Item *si;
+ int separators = 0;
+
+ Elm_Object_Item *menu_it = data;
+ if (!menu_it) return;
+
+ sis = elm_menu_item_subitems_get(menu_it);
+
+ EINA_LIST_FOREACH(sis, l, si)
+ if (elm_menu_item_is_separator(si)) separators++;
+
+ printf("The number of separators: %d\n", separators);
+}
+
+static void
+_open_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *mn = data;
+ if (!mn) return;
+
+ evas_object_show(mn);
+}
+
+static void
+_close_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *mn = data;
+ if (!mn) return;
+
+ elm_menu_close(mn);
+}
+
+void
+test_menu2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *o_bg, *rect, *rect2, *mn, *bt, *vbx;
+ Elm_Object_Item *menu_it, *menu_it2;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("menu2", "Menu 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ o_bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/twofish.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(o_bg, buf, NULL);
+ evas_object_size_hint_weight_set(o_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(o_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, o_bg);
+ evas_object_show(o_bg);
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_move(rect, 0, 0);
+ evas_object_resize(rect, 124, 320);
+ evas_object_color_set(rect, 0, 0, 0, 0);
+ evas_object_show(rect);
+
+ rect2 = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_move(rect2, 124, 0);
+ evas_object_resize(rect2, 124, 320);
+ evas_object_color_set(rect2, 0, 0, 0, 0);
+ evas_object_show(rect2);
+
+ mn = elm_menu_add(win);
+ elm_menu_item_add(mn, NULL, NULL, "first item", NULL, NULL);
+ menu_it = elm_menu_item_add(mn, NULL, NULL, "second item", NULL, NULL);
+ elm_menu_item_add(mn, menu_it, NULL, "item 1", NULL, NULL);
+ elm_menu_item_separator_add(mn, menu_it);
+ elm_menu_item_add(mn, menu_it, NULL, "item 2", NULL, NULL);
+ menu_it2 = elm_menu_item_add(mn, NULL, NULL, "third item", NULL, NULL);
+ evas_object_data_set(mn, "parent_1", rect);
+ evas_object_data_set(mn, "parent_2", rect2);
+
+ vbx = elm_box_add(win);
+ evas_object_show(vbx);
+ elm_box_pack_end(bx, vbx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Menu Open");
+ elm_box_pack_end(vbx, bt);
+ evas_object_smart_callback_add(bt, "clicked", _open_bt_clicked, mn);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Icon Set");
+ elm_box_pack_end(vbx, bt);
+ evas_object_smart_callback_add(bt, "clicked", _icon_set_bt_clicked, menu_it);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Parent Set");
+ elm_box_pack_end(vbx, bt);
+ evas_object_smart_callback_add(bt, "clicked", _parent_set_bt_clicked, mn);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Item Select");
+ elm_box_pack_end(vbx, bt);
+ evas_object_smart_callback_add(bt, "clicked", _item_select_bt_clicked, menu_it2);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Separators");
+ elm_box_pack_end(vbx, bt);
+ evas_object_smart_callback_add(bt, "clicked", _separators_bt_clicked, menu_it);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Menu Close");
+ elm_box_pack_end(vbx, bt);
+ evas_object_smart_callback_add(bt, "clicked", _close_bt_clicked, mn);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_multi.c b/src/bin/elementary/test_multi.c
new file mode 100644
index 0000000000..5608cc8563
--- /dev/null
+++ b/src/bin/elementary/test_multi.c
@@ -0,0 +1,132 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define IND_NUM 20
+
+static Evas_Object *indicator[IND_NUM];
+
+static void
+_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = event_info;
+
+ if (ev->button != 1) return;
+ printf("MOUSE: down @ %4i %4i\n", ev->canvas.x, ev->canvas.y);
+ evas_object_move(indicator[0], ev->canvas.x, ev->canvas.y);
+ evas_object_resize(indicator[0], 1, 1);
+ evas_object_show(indicator[0]);
+}
+
+static void
+_mouse_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Mouse_Up *ev = event_info;
+ if (ev->button != 1) return;
+ printf("MOUSE: up @ %4i %4i\n", ev->canvas.x, ev->canvas.y);
+ evas_object_hide(indicator[0]);
+}
+
+static void
+_mouse_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev = event_info;
+ printf("MOUSE: move @ %4i %4i\n", ev->cur.canvas.x, ev->cur.canvas.y);
+ evas_object_move(indicator[0], ev->cur.canvas.x, ev->cur.canvas.y);
+ evas_object_resize(indicator[0], 1, 1);
+}
+
+static void
+_multi_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Multi_Down *ev = event_info;
+ printf("MULTI: down @ %4i %4i | dev: %i\n", ev->canvas.x, ev->canvas.y, ev->device);
+ if (ev->device >= IND_NUM) return;
+ evas_object_move(indicator[ev->device], ev->canvas.x, ev->canvas.y);
+ evas_object_resize(indicator[ev->device], 1, 1);
+ evas_object_show(indicator[ev->device]);
+}
+
+static void
+_multi_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Multi_Up *ev = event_info;
+ printf("MULTI: up @ %4i %4i | dev: %i\n", ev->canvas.x, ev->canvas.y, ev->device);
+ if (ev->device >= IND_NUM) return;
+ evas_object_hide(indicator[ev->device]);
+}
+
+static void
+_multi_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Multi_Move *ev = event_info;
+ printf("MULTI: move @ %4i %4i | dev: %i\n", ev->cur.canvas.x,
+ ev->cur.canvas.y, ev->device);
+ if (ev->device >= IND_NUM) return;
+ evas_object_move(indicator[ev->device], ev->cur.canvas.x, ev->cur.canvas.y);
+ evas_object_resize(indicator[ev->device], 1, 1);
+}
+
+void
+my_bt_rot(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ elm_win_rotation_set(win, elm_win_rotation_get(win) + 90);
+}
+
+void
+test_multi(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *r, *bx, *bt;
+ int i;
+
+ win = elm_win_add(NULL, "multi-touch", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Multi touch");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ r = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_color_set(r, 0, 0, 0, 0);
+ elm_win_resize_object_add(win, r);
+ evas_object_show(r);
+
+ for (i = 0; i < IND_NUM; i++)
+ {
+ char buf[PATH_MAX];
+
+ snprintf(buf, sizeof(buf), "%s/objects/multip.edj", elm_app_data_dir_get());
+ indicator[i] = edje_object_add(evas_object_evas_get(win));
+ edje_object_file_set(indicator[i], buf, "point");
+ }
+
+ evas_object_event_callback_add(r, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, win);
+ evas_object_event_callback_add(r, EVAS_CALLBACK_MOUSE_UP, _mouse_up, win);
+ evas_object_event_callback_add(r, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, win);
+ evas_object_event_callback_add(r, EVAS_CALLBACK_MULTI_DOWN, _multi_down, win);
+ evas_object_event_callback_add(r, EVAS_CALLBACK_MULTI_UP, _multi_up, win);
+ evas_object_event_callback_add(r, EVAS_CALLBACK_MULTI_MOVE, _multi_move, win);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rotate");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_rot, win);
+ evas_object_size_hint_align_set(bt, 0.0, 0.0);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_size_hint_min_set(bg, 160, 160);
+ evas_object_resize(win, 480, 800);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_multibuttonentry.c b/src/bin/elementary/test_multibuttonentry.c
new file mode 100644
index 0000000000..f66fc8c3fb
--- /dev/null
+++ b/src/bin/elementary/test_multibuttonentry.c
@@ -0,0 +1,254 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static Elm_Multibuttonentry_Format_Cb format_func = NULL;
+
+static char *
+_custom_format(int count, void *data EINA_UNUSED)
+{
+ char buf[32];
+
+ if (!snprintf(buf, sizeof(buf), "+ %d rabbits", count)) return NULL;
+ return strdup(buf);
+}
+
+static void
+_item_selected_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Elm_Object_Item *mbe_it = event_info;
+ printf("selected item = %s\n", elm_object_item_text_get(mbe_it));
+}
+
+// "item,added" smart callback of multibuttonentry.
+static void
+_item_added_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Elm_Object_Item *mbe_it = event_info;
+ printf("added item = %s\n", elm_object_item_text_get(mbe_it));
+}
+
+// "item,deleted" smart callback
+static void
+_item_deleted_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("deleted item\n");
+}
+
+// "item,clicked" smart callback
+static void
+_item_clicked_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info )
+{
+ Elm_Object_Item *mbe_it = event_info;
+ printf("clicked item = %s\n", elm_object_item_text_get(mbe_it));
+}
+
+static void
+_mbe_clicked_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED )
+{
+ //Unset the multibuttonentry to contracted mode of single line
+ elm_multibuttonentry_expanded_set(obj, EINA_TRUE);
+ printf("A multibuttonentry is clicked!\n");
+ Evas_Object *entry;
+ entry = elm_multibuttonentry_entry_get(obj);
+ if (!entry)
+ {
+ printf("%s entry is NULL\n", __func__);
+ }
+
+ Evas_Coord x, y, w, h;
+ Evas_Coord mbe_x, mbe_y, mbe_w, mbe_h;
+ evas_object_geometry_get(obj, &mbe_x, &mbe_y, &mbe_w, &mbe_h);
+ evas_object_geometry_get(entry, &x, &y, &w, &h);
+ printf("%s mbe x :%d y:%d w :%d h:%d\n", __func__, mbe_x, mbe_y, mbe_w, mbe_h);
+ printf("%s wd->entry x :%d y:%d w :%d h:%d\n", __func__, x, y, w, h);
+}
+
+static void
+_mbe_unfocused_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED )
+{
+ //Set the multibuttonentry to contracted mode of single line
+ elm_multibuttonentry_expanded_set(obj, EINA_FALSE);
+ printf("multibuttonentry unfocused!\n");
+}
+
+static void
+_mbe_focused_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED )
+{
+ printf("multibuttonentry focused!\n");
+}
+
+// "expanded" smart callback
+static void
+_expanded_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("expanded!\n");
+}
+
+// "contracted" smart callback
+static void
+_contracted_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("contracted!\n");
+}
+
+// "contracted,state,changed" smart callback
+static void
+_shrink_state_changed_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("contracted state changed! \n");
+}
+
+// "longpressed" smart callback
+static void
+_longpressed_cb(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ printf("item = %p longpressed! \n", event_info);
+}
+
+
+// "item verified" confirm callback
+static Eina_Bool
+_item_filter_cb(Evas_Object *obj EINA_UNUSED,
+ const char* item_label,
+ void *item_data EINA_UNUSED,
+ void *data EINA_UNUSED)
+{
+ printf("%s, label: %s\n", __func__, item_label);
+
+ return EINA_TRUE;
+}
+
+static void
+_format_change_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *mbe = data;
+
+ if (format_func) format_func = NULL;
+ else format_func = _custom_format;
+
+ elm_multibuttonentry_format_function_set(mbe, format_func, NULL);
+
+ printf("Changing format function to %p\n", format_func);
+}
+
+static Evas_Object*
+_format_change_btn_add(Evas_Object *mbe)
+{
+ Evas_Object *btn;
+
+ btn = elm_button_add(mbe);
+ evas_object_smart_callback_add(btn, "clicked", _format_change_cb, mbe);
+ elm_object_text_set(btn, "Change format function");
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ return btn;
+}
+
+void
+_select_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *it = (Elm_Object_Item *)event_info;
+ printf("select function called, item = %s\n", elm_object_item_text_get(it));
+}
+
+static Evas_Object*
+_add_multibuttonentry(Evas_Object *parent)
+{
+ Evas_Object *scr = NULL;
+ Evas_Object *mbe = NULL;
+ Evas_Object *btn = NULL;
+ void *data = NULL;
+
+ scr = elm_scroller_add(parent);
+ elm_scroller_bounce_set(scr, EINA_FALSE, EINA_TRUE);
+ elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF,ELM_SCROLLER_POLICY_AUTO);
+ evas_object_show(scr);
+
+ mbe = elm_multibuttonentry_add(parent);
+ elm_object_text_set(mbe, "To: ");
+ elm_object_part_text_set(mbe, "guide", "Tap to add recipient");
+ evas_object_size_hint_weight_set(mbe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(mbe, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(scr, mbe);
+ elm_multibuttonentry_item_append(mbe, "mbe", _select_cb, NULL);
+
+ // Add item verify callback to Multibuttonentry
+ elm_multibuttonentry_item_filter_append(mbe, _item_filter_cb, data);
+
+ // Add "item,selected","item,added", "item,deleted", "clicked", "unfocused",
+ // "expanded", "contracted" and "contracted,state,changed" smart callback
+ evas_object_smart_callback_add(mbe, "item,selected", _item_selected_cb, NULL);
+ evas_object_smart_callback_add(mbe, "item,added", _item_added_cb, NULL);
+ evas_object_smart_callback_add(mbe, "item,deleted", _item_deleted_cb, NULL);
+ evas_object_smart_callback_add(mbe, "item,clicked", _item_clicked_cb, NULL);
+
+ evas_object_smart_callback_add(mbe, "clicked", _mbe_clicked_cb, NULL);
+ evas_object_smart_callback_add(mbe, "focused", _mbe_focused_cb, NULL);
+ evas_object_smart_callback_add(mbe, "unfocused", _mbe_unfocused_cb, NULL);
+
+ evas_object_smart_callback_add(mbe, "expanded", _expanded_cb, NULL);
+ evas_object_smart_callback_add(mbe, "contracted", _contracted_cb, NULL);
+ evas_object_smart_callback_add(mbe, "shrink,state,changed", _shrink_state_changed_cb, NULL);
+ evas_object_smart_callback_add(mbe, "item,longpressed", _longpressed_cb, NULL);
+
+ btn = _format_change_btn_add(mbe);
+ elm_object_part_content_set(parent, "box", btn);
+
+ evas_object_resize(mbe, 220, 300);
+ elm_object_focus_set(mbe, EINA_TRUE);
+
+ return scr;
+}
+
+void
+test_multibuttonentry(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *sc;
+ Evas_Object *ly;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("multibuttonentry", "MultiButtonEntry");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ly = elm_layout_add(win);
+ snprintf(buf, sizeof(buf), "%s/objects/multibuttonentry.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "multibuttonentry_test");
+ evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, ly);
+ evas_object_show(ly);
+
+ sc = _add_multibuttonentry(ly);
+ elm_object_part_content_set(ly, "multibuttonentry", sc);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_naviframe.c b/src/bin/elementary/test_naviframe.c
new file mode 100644
index 0000000000..222b450e61
--- /dev/null
+++ b/src/bin/elementary/test_naviframe.c
@@ -0,0 +1,388 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define BUTTON_TEXT_SET(BT, TEXT) \
+ elm_object_text_set((BT), (TEXT)); \
+ elm_object_tooltip_text_set((BT), (TEXT)); \
+ elm_object_tooltip_window_mode_set((BT), EINA_TRUE)
+
+static char img1[PATH_MAX];
+static char img2[PATH_MAX];
+static char img3[PATH_MAX];
+static char img4[PATH_MAX];
+static char img5[PATH_MAX];
+static char img6[PATH_MAX];
+static char img7[PATH_MAX];
+
+Evas_Object *
+_content_new(Evas_Object *parent, const char *img)
+{
+ Evas_Object *photo = elm_photo_add(parent);
+ elm_photo_file_set(photo, img);
+ elm_photo_fill_inside_set(photo, EINA_TRUE);
+ elm_object_style_set(photo, "shadow");
+ return photo;
+}
+
+void
+_navi_pop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_naviframe_item_pop(data);
+}
+
+void
+_navi_it_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_object_item_del(data);
+}
+
+void
+_title_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("Title Clicked!\n");
+}
+
+void
+_title_visible(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_naviframe_item_title_enabled_set(data,
+ !elm_naviframe_item_title_enabled_get(data),
+ EINA_TRUE);
+}
+
+void
+_promote(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_naviframe_item_promote(data);
+}
+
+void
+_page8(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *bt2, *content, *nf = data;
+ Elm_Object_Item *it;
+
+ snprintf(img6, sizeof(img6), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ bt = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt, "Page 7");
+
+ bt2 = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt2, "Page 1");
+ evas_object_smart_callback_add(bt2, "clicked", _promote,
+ evas_object_data_get(nf, "page1"));
+ content = _content_new(nf, img6);
+ it = elm_naviframe_item_push(nf, "Page 8", bt, bt2, content, NULL);
+ elm_object_item_part_text_set(it, "subtitle", "Overlap style!");
+
+ evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf);
+}
+
+static void
+_page7_btn_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ evas_object_color_set(obj, 100, 0, 0, 100);
+ _page8(data, NULL, NULL);
+}
+
+static void
+_page7_btn_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ evas_object_color_set(obj, 255, 255, 255, 255);
+ printf("Page7 Button Mouse Up!\n");
+}
+
+Evas_Object *
+_page7_content_new(Evas_Object *nf)
+{
+ Evas_Object *bt;
+
+ bt = elm_button_add(nf);
+ elm_object_text_set(bt, "Page 8");
+ evas_object_event_callback_add(bt, EVAS_CALLBACK_MOUSE_DOWN,
+ _page7_btn_down_cb, nf);
+ evas_object_event_callback_add(bt, EVAS_CALLBACK_MOUSE_UP,
+ _page7_btn_up_cb, NULL);
+
+ return bt;
+}
+
+void
+_page7(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *bt2, *content, *nf = data;
+ Elm_Object_Item *it;
+
+ bt = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt, "Page 6");
+
+ bt2 = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt2, "Page 8");
+ evas_object_smart_callback_add(bt2, "clicked", _page8, nf);
+ content = _page7_content_new(nf);
+ it = elm_naviframe_item_push(nf, "Page 7", bt, bt2, content, "overlap");
+ elm_object_item_part_text_set(it, "subtitle", "Overlap style!");
+
+ evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf);
+}
+
+void
+_page6(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *bt2, *content, *nf = data;
+ Elm_Object_Item *it;
+
+ snprintf(img7, sizeof(img7), "%s/images/sky_03.jpg", elm_app_data_dir_get());
+ bt = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt, "Page 5");
+
+ bt2 = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt2, "Page 7");
+ evas_object_smart_callback_add(bt2, "clicked", _page7, nf);
+
+ content = _content_new(nf, img7);
+ it = elm_naviframe_item_push(nf, "Page 6", bt, bt2, content, "overlap");
+ elm_object_item_part_text_set(it, "subtitle", "Overlap style!");
+
+ evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf);
+}
+
+void
+_page5(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *bt2, *content, *nf = data;
+ Elm_Object_Item *it;
+
+ snprintf(img5, sizeof(img5), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ bt = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt, "Page 4");
+
+ bt2 = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt2, "Page 6");
+ evas_object_smart_callback_add(bt2, "clicked", _page6, nf);
+
+ content = _content_new(nf, img5);
+ it = elm_naviframe_item_insert_after(nf,
+ elm_naviframe_top_item_get(nf),
+ "Page 5",
+ bt,
+ bt2,
+ content,
+ NULL);
+ elm_object_item_part_text_set(it, "subtitle", "This page is inserted after top item without transition");
+ evas_object_smart_callback_add(bt, "clicked", _navi_it_del, it);
+}
+
+void
+_page4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *ic, *content, *nf = data;
+ char buf[PATH_MAX];
+ Elm_Object_Item *it;
+
+ snprintf(img4, sizeof(img4), "%s/images/rock_02.jpg", elm_app_data_dir_get());
+ ic = elm_icon_add(nf);
+ elm_icon_standard_set(ic, "arrow_right");
+
+ bt = elm_button_add(nf);
+ evas_object_smart_callback_add(bt, "clicked", _page5, nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_layout_content_set(bt, "icon", ic);
+
+ content = _content_new(nf, img4);
+
+ it = elm_naviframe_item_push(nf,
+ "Page 4",
+ NULL,
+ bt,
+ content,
+ NULL);
+ elm_object_item_part_text_set(it, "subtitle", "Title area visibility test");
+
+ ic = elm_icon_add(nf);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png",
+ elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ elm_object_item_part_content_set(it, "icon", ic);
+ elm_naviframe_item_title_enabled_set(it, EINA_FALSE, EINA_FALSE);
+ evas_object_smart_callback_add(content, "clicked", _title_visible, it);
+}
+
+void
+_page3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt2, *content, *nf = data;
+
+ snprintf(img3, sizeof(img3), "%s/images/rock_01.jpg", elm_app_data_dir_get());
+ bt2 = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt2, "Next");
+ evas_object_smart_callback_add(bt2, "clicked", _page4, nf);
+
+ content = _content_new(nf, img3);
+
+ elm_naviframe_item_push(nf,
+ "Page 3",
+ NULL,
+ bt2,
+ content,
+ NULL);
+}
+
+void
+_page2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *content, *ic, *nf = data;
+ Elm_Object_Item *it;
+
+ snprintf(img2, sizeof(img2), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ bt = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _page3, nf);
+
+ ic = elm_icon_add(nf);
+ elm_icon_standard_set(ic, "arrow_right");
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ elm_layout_content_set(bt, "icon", ic);
+
+ content = _content_new(nf, img2);
+
+ it = elm_naviframe_item_push(nf, "Page 2 - Long Title Here",
+ NULL, bt, content, NULL);
+ elm_object_item_part_text_set(it, "subtitle", "Here is sub-title part!");
+}
+
+void
+test_naviframe(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *nf, *btn, *content;
+ Elm_Object_Item *it;
+
+ snprintf(img1, sizeof(img1), "%s/images/logo.png", elm_app_data_dir_get());
+ win = elm_win_util_standard_add("naviframe", "Naviframe");
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ nf = elm_naviframe_add(win);
+ evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, nf);
+ evas_object_show(nf);
+ evas_object_smart_callback_add(nf, "title,clicked", _title_clicked, 0);
+
+ btn = elm_button_add(nf);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(btn, "clicked", _page2, nf);
+ BUTTON_TEXT_SET(btn, "Next");
+ evas_object_show(btn);
+
+ content = _content_new(nf, img1);
+ it = elm_naviframe_item_push(nf, "Page 1", NULL, btn, content, NULL);
+ evas_object_data_set(nf, "page1", it);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
+
+void
+test_naviframe2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *nf, *sc, *btn, *ico, *content;
+ Elm_Object_Item *it;
+
+ snprintf(img1, sizeof(img1), "%s/images/logo.png", elm_app_data_dir_get());
+ win = elm_win_util_standard_add("naviframe", "Naviframe");
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ nf = elm_naviframe_add(win);
+ evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, nf);
+ evas_object_show(nf);
+
+ sc = elm_segment_control_add(nf);
+ elm_segment_control_item_add(sc, NULL, "Show All");
+ elm_segment_control_item_add(sc, NULL, "Just Filtered");
+
+ btn = elm_button_add(nf);
+ ico = elm_icon_add(btn);
+ elm_icon_standard_set(ico, "refresh");
+ elm_layout_content_set(btn, "icon", ico);
+
+ content = _content_new(nf, img1);
+ it = elm_naviframe_item_push(nf, NULL, NULL, btn, content, NULL);
+ evas_object_data_set(nf, "page1", it);
+
+ elm_object_item_part_content_set(it, "icon", sc);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
+
+static void
+_bt_pop_all(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *it = evas_object_data_get(obj, "root");
+
+ while (elm_naviframe_top_item_get(data) != it)
+ elm_naviframe_item_pop(data);
+}
+
+void
+test_naviframe3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *tb, *bxh, *nf, *btn, *content;
+ Elm_Object_Item *it;
+
+ snprintf(img1, sizeof(img1), "%s/images/logo.png", elm_app_data_dir_get());
+ win = elm_win_util_standard_add("naviframe", "Naviframe");
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bxh = elm_box_add(win);
+ evas_object_size_hint_weight_set(bxh, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_horizontal_set(bxh, EINA_TRUE);
+ elm_win_resize_object_add(win, bxh);
+ evas_object_show(bxh);
+
+ tb = elm_toolbar_add(win);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_toolbar_horizontal_set(tb, EINA_FALSE);
+ elm_toolbar_select_mode_set(tb, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ elm_box_pack_end(bxh, tb);
+ evas_object_show(tb);
+
+ nf = elm_naviframe_add(win);
+ evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(nf, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bxh, nf);
+ evas_object_show(nf);
+
+ btn = elm_button_add(nf);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(btn, "clicked", _page2, nf);
+ BUTTON_TEXT_SET(btn, "Next");
+ evas_object_show(btn);
+
+ content = _content_new(nf, img1);
+ it = elm_naviframe_item_push(nf, "Page 1", NULL, btn, content, NULL);
+ evas_object_data_set(nf, "page1", it);
+
+ evas_object_data_set(tb, "root", it);
+ elm_toolbar_item_append(tb, NULL, "Pop all", _bt_pop_all, nf);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_naviframe_complex.c b/src/bin/elementary/test_naviframe_complex.c
new file mode 100644
index 0000000000..63539c7009
--- /dev/null
+++ b/src/bin/elementary/test_naviframe_complex.c
@@ -0,0 +1,367 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define BUTTON_TEXT_SET(BT, TEXT) \
+ elm_object_text_set((BT), (TEXT)); \
+ elm_object_tooltip_text_set((BT), (TEXT)); \
+ elm_object_tooltip_window_mode_set((BT), EINA_TRUE)
+
+static char *
+gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
+ return strdup(buf);
+}
+
+static Evas_Object *
+gl_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
+{
+ char buf[PATH_MAX];
+ Evas_Object *ic = elm_icon_add(obj);
+ if (!strcmp(part, "elm.swallow.end"))
+ snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
+ else
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return ic;
+}
+
+static Elm_Genlist_Item_Class itc =
+{
+ .version = ELM_GENLIST_ITEM_CLASS_VERSION,
+ .item_style = "default",
+ .func =
+ {
+ .text_get = gl_text_get,
+ .content_get = gl_content_get,
+ .state_get = NULL,
+ .del = NULL
+ }
+};
+
+static Evas_Object *
+_content_image_new(Evas_Object *parent, const char *img)
+{
+ Evas_Object *ic;
+
+ ic = elm_icon_add(parent);
+ elm_image_file_set(ic, img, NULL);
+ elm_image_fill_outside_set(ic, EINA_FALSE);
+ return ic;
+}
+
+static void
+_gl_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("selected: %p\n", event_info);
+}
+
+static void
+_gl_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("double clicked: %p\n", event_info);
+}
+
+static void
+_gl_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("longpress %p\n", event_info);
+}
+
+static void
+_content_list_populate_cb(Evas_Object *gl)
+{
+ int i;
+ for (i = 0; i < 10; i++)
+ elm_genlist_item_append(gl, &itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if (elm_genlist_items_count(gl) < 500)
+ ecore_job_add((Ecore_Cb)_content_list_populate_cb, gl);
+}
+
+static Evas_Object *
+_content_list_new(Evas_Object *parent)
+{
+ Evas_Object *gl;
+
+ gl = elm_genlist_add(parent);
+ evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
+ evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
+ evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
+ // FIXME: This causes genlist to resize the horiz axis very slowly :(
+ // Reenable this and resize the window horizontally, then try to resize it back
+ //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
+
+ ecore_job_add((Ecore_Cb)_content_list_populate_cb, gl);
+ return gl;
+}
+
+static void
+_navi_pop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_naviframe_item_pop(data);
+}
+
+static void
+_navi_it_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_object_item_del(data);
+}
+
+static void
+_title_visible(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_naviframe_item_title_enabled_set(data,
+ !elm_naviframe_item_title_enabled_get(data),
+ EINA_TRUE);
+}
+
+static void
+_promote(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_naviframe_item_promote(data);
+}
+
+static void
+_page7(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *bt2, *content, *nf = data;
+ Elm_Object_Item *it;
+ char img6[PATH_MAX];
+
+ snprintf(img6, sizeof(img6), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ bt = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt, "Page 6");
+
+ bt2 = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt2, "Page 1");
+ evas_object_smart_callback_add(bt2, "clicked", _promote,
+ evas_object_data_get(nf, "page1"));
+ content = _content_image_new(nf, img6);
+ it = elm_naviframe_item_push(nf, "Page 7", bt, bt2, content, "overlap");
+ elm_object_item_part_text_set(it, "subtitle", "Overlap style!");
+
+ evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf);
+}
+
+static void
+_page6(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *bt2, *content, *nf = data;
+ Elm_Object_Item *it;
+ char img7[PATH_MAX];
+
+ snprintf(img7, sizeof(img7), "%s/images/sky_03.jpg", elm_app_data_dir_get());
+ bt = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt, "Page 5");
+
+ bt2 = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt2, "Page 7");
+ evas_object_smart_callback_add(bt2, "clicked", _page7, nf);
+
+ content = _content_image_new(nf, img7);
+ it = elm_naviframe_item_push(nf, "Page 6", bt, bt2, content, "overlap");
+ elm_object_item_part_text_set(it, "subtitle", "Overlap style!");
+
+ evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf);
+}
+
+static void
+_page5(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *bt2, *content, *nf = data;
+ Elm_Object_Item *it;
+ char img5[PATH_MAX];
+
+ snprintf(img5, sizeof(img5), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ bt = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt, "Page 4");
+
+ bt2 = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt2, "Page 6");
+ evas_object_smart_callback_add(bt2, "clicked", _page6, nf);
+
+ content = _content_image_new(nf, img5);
+ it = elm_naviframe_item_insert_after(nf,
+ elm_naviframe_top_item_get(nf),
+ "Page 5",
+ bt,
+ bt2,
+ content,
+ NULL);
+ elm_object_item_part_text_set(it, "subtitle", "This page is inserted without transition");
+ evas_object_smart_callback_add(bt, "clicked", _navi_it_del, it);
+}
+
+static void
+_page4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *ic, *content, *nf = data;
+ char buf[PATH_MAX];
+ char img4[PATH_MAX];
+ Elm_Object_Item *it;
+
+ snprintf(img4, sizeof(img4), "%s/images/rock_02.jpg", elm_app_data_dir_get());
+ ic = elm_icon_add(nf);
+ snprintf(buf, sizeof(buf), "%s/images/icon_right_arrow.png",
+ elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ bt = elm_button_add(nf);
+ evas_object_smart_callback_add(bt, "clicked", _page5, nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_part_content_set(bt, "icon", ic);
+
+ content = _content_image_new(nf, img4);
+
+ it = elm_naviframe_item_push(nf,
+ "Page 4",
+ NULL,
+ bt,
+ content,
+ NULL);
+ elm_object_item_part_text_set(it, "subtitle", "Title area visibility test");
+
+ ic = elm_icon_add(nf);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png",
+ elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ elm_object_item_part_content_set(it, "icon", ic);
+ elm_naviframe_item_title_enabled_set(it, EINA_FALSE, EINA_FALSE);
+ evas_object_smart_callback_add(content, "clicked", _title_visible, it);
+}
+
+static void
+_page3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *bt2, *ic, *content, *nf = data;
+ char buf[PATH_MAX];
+ char img3[PATH_MAX];
+ Elm_Object_Item *it;
+
+ snprintf(img3, sizeof(img3), "%s/images/rock_01.jpg", elm_app_data_dir_get());
+ bt = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt, "Prev");
+ evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf);
+
+ bt2 = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ BUTTON_TEXT_SET(bt2, "Next");
+ evas_object_smart_callback_add(bt2, "clicked", _page4, nf);
+
+ content = _content_image_new(nf, img3);
+
+ it = elm_naviframe_item_push(nf,
+ "Page 3",
+ bt,
+ bt2,
+ content,
+ NULL);
+ ic = elm_icon_add(nf);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ elm_object_item_part_content_set(it, "icon", ic);
+}
+
+static void
+_page2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bt, *content, *ic, *nf = data;
+ char buf[PATH_MAX];
+ char img2[PATH_MAX];
+ Elm_Object_Item *it;
+
+ snprintf(img2, sizeof(img2), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ bt = elm_button_add(nf);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(bt, "clicked", _page3, nf);
+
+ ic = elm_icon_add(nf);
+ snprintf(buf, sizeof(buf), "%s/images/icon_right_arrow.png",
+ elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ elm_object_part_content_set(bt, "icon", ic);
+
+ content = _content_image_new(nf, img2);
+
+ it = elm_naviframe_item_push(nf, "Page 2", NULL, bt, content, NULL);
+ elm_object_item_part_text_set(it, "subtitle", "Here is sub-title part!");
+}
+
+void
+test_naviframe_complex(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *nf, *btn, *box, *content, *tb, *o;
+ Elm_Object_Item *it;
+ int x;
+
+ char img1[PATH_MAX];
+ snprintf(img1, sizeof(img1), "%s/images/logo.png", elm_app_data_dir_get());
+
+ win = elm_win_util_standard_add("naviframe", "Naviframe");
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ tb = elm_toolbar_add(win);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_toolbar_horizontal_set(tb, EINA_FALSE);
+ elm_toolbar_select_mode_set(tb, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ elm_box_pack_end(box, tb);
+ evas_object_show(tb);
+
+ nf = elm_naviframe_add(win);
+ evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(nf, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_naviframe_prev_btn_auto_pushed_set(nf, EINA_FALSE);
+ elm_box_pack_end(box, nf);
+ evas_object_show(nf);
+
+ for (x = 0; x < 4; x++)
+ {
+ const char *label[] = { "View 1", "View 2", "View 3", "View 4" };
+ o = elm_naviframe_add(win);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ btn = elm_button_add(o);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(btn, "clicked", _page2, o);
+ BUTTON_TEXT_SET(btn, "Next");
+ evas_object_show(btn);
+
+ if (x % 2)
+ content = _content_image_new(o, img1);
+ else
+ content = _content_list_new(o);
+ evas_object_data_set(o, "page1", elm_naviframe_item_push(o, "Page 1", NULL, btn, content, NULL));
+
+ it = elm_naviframe_item_simple_push(nf, o);
+ elm_toolbar_item_append(tb, NULL, label[x], _promote, it);
+ evas_object_show(o);
+ }
+
+ elm_toolbar_item_selected_set(elm_toolbar_last_item_get(tb), EINA_TRUE);
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_notify.c b/src/bin/elementary/test_notify.c
new file mode 100644
index 0000000000..3d00006886
--- /dev/null
+++ b/src/bin/elementary/test_notify.c
@@ -0,0 +1,448 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_bt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *notify = data;
+ evas_object_show(notify);
+ elm_object_focus_set(notify, EINA_TRUE);
+}
+
+static void
+_bt_close(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *notify = data;
+ evas_object_hide(notify);
+}
+
+static void
+_bt_timer_close(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *notify = data;
+ elm_notify_timeout_set(notify, 2.0);
+}
+
+static void
+_notify_timeout(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("Notify timed out!\n");
+}
+
+static void
+_notify_block(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("Notify block area clicked!!\n");
+}
+
+static void
+_notify_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+
+ printf("Key down: %s\n", ev->keyname);
+}
+
+void
+test_notify(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *notify, *bt, *lb;
+
+ win = elm_win_util_standard_add("notify", "Notify");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb);
+ evas_object_show(tb);
+
+ // Notify top
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 0.5, 0.0);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_label_line_wrap_set(lb, ELM_WRAP_MIXED);
+ elm_label_wrap_width_set(lb, ELM_SCALE_SIZE(140));
+ elm_object_text_set(lb, "This position is the default. This is multiline text.");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Top");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 2, 1, 1, 1);
+ evas_object_show(bt);
+
+ // Notify bottom
+ notify = elm_notify_add(win);
+ elm_notify_allow_events_set(notify, EINA_FALSE);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 0.5, 1.0);
+
+ elm_notify_timeout_set(notify, 5.0);
+ evas_object_smart_callback_add(notify, "timeout", _notify_timeout, NULL);
+ evas_object_smart_callback_add(notify, "block,clicked", _notify_block, NULL);
+ evas_object_event_callback_add(notify, EVAS_CALLBACK_KEY_DOWN,
+ _notify_key_down_cb, NULL);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Bottom position. This notify uses a timeout of 5 sec.<br/>"
+ "<b>The events outside the window are blocked.</b>");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Bottom");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 2, 3, 1, 1);
+ evas_object_show(bt);
+
+ // Notify left
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 0.0, 0.5);
+ elm_notify_timeout_set(notify, 10.0);
+ evas_object_smart_callback_add(notify, "timeout", _notify_timeout, NULL);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Left position. This notify uses a timeout of 10 sec.");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Left");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 1, 2, 1, 1);
+ evas_object_show(bt);
+
+ // Notify center
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 0.5, 0.5);
+ elm_notify_timeout_set(notify, 10.0);
+ evas_object_smart_callback_add(notify, "timeout", _notify_timeout, NULL);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Center position. This notify uses a timeout of 10 sec.");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Center");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 2, 2, 1, 1);
+ evas_object_show(bt);
+
+ // Notify right
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 1.0, 0.5);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Right position.");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Right");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 3, 2, 1, 1);
+ evas_object_show(bt);
+
+ // Notify top left
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 0.0, 0.0);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Top Left position.");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Top Left");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 1, 1, 1, 1);
+ evas_object_show(bt);
+
+ // Notify top right
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 1.0, 0.0);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Top Right position.");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Top Right");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 3, 1, 1, 1);
+ evas_object_show(bt);
+
+ // Notify bottom left
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 0.0, 1.0);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Bottom Left position.");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Bottom Left");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 1, 3, 1, 1);
+ evas_object_show(bt);
+
+ // Notify bottom right
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 1.0, 1.0);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Bottom Right position.");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close in 2s");
+ evas_object_smart_callback_add(bt, "clicked", _bt_timer_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Bottom Right");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 3, 3, 1, 1);
+ evas_object_show(bt);
+
+ // Notify top fill
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, ELM_NOTIFY_ALIGN_FILL, 0.0);
+ elm_notify_timeout_set(notify, 5.0);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Fill top. This notify fills horizontal area.<br/>"
+ "<b>elm_notify_align_set(notify, ELM_NOTIFY_ALIGN_FILL, 0.0); </b>");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(bt, "Top fill");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 1, 0, 3, 1);
+ evas_object_show(bt);
+
+ // Notify bottom fill
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, ELM_NOTIFY_ALIGN_FILL, 1.0);
+ elm_notify_timeout_set(notify, 5.0);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lb, 0.0, 0.5);
+ elm_object_text_set(lb, "Fill Bottom. This notify fills horizontal area.<br/>"
+ "<b>elm_notify_align_set(notify, ELM_NOTIFY_ALIGN_FILL, 1.0); </b>");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(bt, "Bottom fill");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 1, 4, 3, 1);
+ evas_object_show(bt);
+
+ // Notify left fill
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 0.0, EVAS_HINT_FILL);
+ elm_notify_timeout_set(notify, 5.0);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Left fill.");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, 0.5, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Left fill");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 0, 1, 1, 3);
+ evas_object_show(bt);
+
+ // Notify right fill
+ notify = elm_notify_add(win);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notify, 1.0, EVAS_HINT_FILL);
+ elm_notify_timeout_set(notify, 5.0);
+
+ bx = elm_box_add(win);
+ elm_object_content_set(notify, bx);
+ evas_object_show(bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "Right fill.");
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _bt_close, notify);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ evas_object_size_hint_align_set(bt, 0.5, EVAS_HINT_FILL);
+ elm_object_text_set(bt, "Right fill");
+ evas_object_smart_callback_add(bt, "clicked", _bt, notify);
+ elm_table_pack(tb, bt, 4, 1, 1, 3);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_panel.c b/src/bin/elementary/test_panel.c
new file mode 100644
index 0000000000..9c8d4eb2c8
--- /dev/null
+++ b/src/bin/elementary/test_panel.c
@@ -0,0 +1,369 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+#include <dirent.h>
+
+#define LIST_ITEM_MAX 20
+
+static void _bstatus(void *data, Evas_Object *obj, void *event_info);
+static void _tstatus(void *data, Evas_Object *obj, void *event_info);
+static char *_text_get(void *data, Evas_Object *obj, const char *source);
+static Evas_Object *_content_get(void *data, Evas_Object *obj, const char *source);
+static Eina_Bool _state_get(void *data, Evas_Object *obj, const char *source);
+static void _item_del(void *data, Evas_Object *obj);
+static void _fill_list(Evas_Object *obj, Elm_Genlist_Item_Class *itc);
+static Eina_Bool _dir_has_subs(const char *path);
+
+static Eina_List *dirs = NULL;
+
+static void
+_tstatus(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *tb_it;
+ const char *status;
+
+ if (elm_panel_hidden_get((Evas_Object*)data))
+ status = "hidden";
+ else
+ status = "shown";
+ printf("The top panel is currently %s\n", status);
+ tb_it = elm_toolbar_selected_item_get(obj);
+ elm_toolbar_item_selected_set(tb_it, EINA_FALSE);
+}
+
+static void
+_bstatus(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *tb_it;
+ const char *status;
+
+ if (elm_panel_hidden_get((Evas_Object*)data))
+ status = "hidden";
+ else
+ status = "shown";
+ printf("The bottom panel is currently %s\n", status);
+ tb_it = elm_toolbar_selected_item_get(obj);
+ elm_toolbar_item_selected_set(tb_it, EINA_FALSE);
+}
+
+static char *
+_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *source EINA_UNUSED)
+{
+ return strdup(ecore_file_file_get(data));
+}
+
+static Evas_Object *
+_content_get(void *data, Evas_Object *obj, const char *source)
+{
+ if (!strcmp(source, "elm.swallow.icon"))
+ {
+ Evas_Object *ic;
+
+ ic = elm_icon_add(obj);
+ if (ecore_file_is_dir((char *)data))
+ elm_icon_standard_set(ic, "folder");
+ else
+ elm_icon_standard_set(ic, "file");
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_show(ic);
+ return ic;
+ }
+ return NULL;
+}
+
+static Eina_Bool
+_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *source EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+static void
+_item_del(void *data, Evas_Object *obj EINA_UNUSED)
+{
+ eina_stringshare_del(data);
+}
+
+static void
+_fill_list(Evas_Object *obj, Elm_Genlist_Item_Class *itc)
+{
+ DIR *d;
+ struct dirent *de;
+ Eina_List *l;
+ char *real;
+ const char *home_env = NULL;
+ unsigned int x = 0;
+
+ if (!dirs)
+ {
+ home_env = eina_environment_home_get();
+ if (!home_env) return;
+ if (!(d = opendir(home_env))) return;
+ while ((de = readdir(d)) && (x < LIST_ITEM_MAX))
+ {
+ char buff[PATH_MAX];
+
+ if (de->d_name[0] == '.') continue;
+ snprintf(buff, sizeof(buff), "%s/%s", home_env, de->d_name);
+
+ if (!ecore_file_is_dir(buff)) continue;
+ x++;
+ real = ecore_file_realpath(buff);
+ dirs = eina_list_sorted_insert(dirs, EINA_COMPARE_CB(strcoll), real);
+ }
+ closedir(d);
+ }
+ EINA_LIST_FOREACH(dirs, l, real)
+ {
+ Eina_Bool result = EINA_FALSE;
+
+ result = _dir_has_subs(real);
+ if (!result)
+ elm_genlist_item_append(obj, itc, eina_stringshare_add(real),
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ else
+ elm_genlist_item_append(obj, itc, eina_stringshare_add(real),
+ NULL, ELM_GENLIST_ITEM_TREE,
+ NULL, NULL);
+ }
+}
+
+static Eina_Bool
+_dir_has_subs(const char *path)
+{
+ DIR *d;
+ struct dirent *de;
+ Eina_Bool result = EINA_FALSE;
+
+ if (!path) return result;
+ if (!(d = opendir(path))) return result;
+ while ((de = readdir(d)))
+ {
+ char buff[PATH_MAX];
+
+ if (de->d_name[0] == '.') continue;
+ snprintf(buff, sizeof(buff), "%s/%s", path, de->d_name);
+ if (ecore_file_is_dir(buff))
+ {
+ result = EINA_TRUE;
+ break;
+ }
+ }
+ closedir(d);
+ return result;
+}
+
+static void
+_free_dirs(void)
+{
+ char *dir;
+ EINA_LIST_FREE(dirs, dir)
+ free(dir);
+}
+
+void
+test_panel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *panel, *tb, *vbx, *toolbar, *photo;
+ Evas_Object *list;
+ Elm_Genlist_Item_Class *itc = NULL;
+ char buf[PATH_MAX] = { 0 };
+
+ win = elm_win_util_standard_add("panel", "Panel");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ vbx = elm_box_add(win);
+ evas_object_size_hint_weight_set(vbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, vbx);
+ evas_object_show(vbx);
+
+ // top panel
+ panel = elm_panel_add(vbx);
+ elm_panel_orient_set(panel, ELM_PANEL_ORIENT_TOP);
+ evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(vbx, panel);
+ evas_object_show(panel);
+
+ toolbar = elm_toolbar_add(panel);
+ elm_toolbar_homogeneous_set(toolbar, EINA_FALSE);
+ elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_NONE);
+ elm_toolbar_item_append(toolbar, "home", "Hello", _tstatus, panel);
+ elm_object_content_set(panel, toolbar);
+ evas_object_show(toolbar);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(vbx, tb);
+ evas_object_show(tb);
+
+ photo = elm_photo_add(tb);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(photo, buf);
+ elm_photo_fill_inside_set(photo, EINA_TRUE);
+ elm_object_style_set(photo, "shadow");
+ evas_object_size_hint_weight_set(photo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(photo, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, photo, 0, 0, 4, 5);
+ evas_object_show(photo);
+
+ // left panel
+ panel = elm_panel_add(tb);
+ elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT);
+ evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, panel, 0, 0, 2, 4);
+ evas_object_show(panel);
+
+ itc = elm_genlist_item_class_new();
+ itc->item_style = "default";
+ itc->func.text_get = _text_get;
+ itc->func.content_get = _content_get;
+ itc->func.state_get = _state_get;
+ itc->func.del = _item_del;
+
+ list = elm_genlist_add(panel);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(panel, list);
+ evas_object_show(list);
+
+ _fill_list(list, itc);
+
+ // right panel
+ panel = elm_panel_add(tb);
+ elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT);
+ evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_panel_hidden_set(panel, EINA_TRUE);
+ elm_table_pack(tb, panel, 2, 0, 2, 4);
+ evas_object_show(panel);
+
+ list = elm_genlist_add(panel);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(panel, list);
+ evas_object_show(list);
+
+ _fill_list(list, itc);
+ elm_genlist_item_class_free(itc);
+
+ _free_dirs();
+
+ // bottom panel
+ panel = elm_panel_add(vbx);
+ elm_panel_orient_set(panel, ELM_PANEL_ORIENT_BOTTOM);
+ evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_panel_hidden_set(panel, EINA_TRUE);
+ elm_table_pack(tb, panel, 0, 4, 4, 1);
+ evas_object_show(panel);
+
+ toolbar = elm_toolbar_add(panel);
+ elm_toolbar_homogeneous_set(toolbar, EINA_FALSE);
+ elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_NONE);
+ evas_object_size_hint_weight_set(toolbar, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(toolbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_toolbar_item_append(toolbar, "home", "Hello", _bstatus, panel);
+ elm_object_content_set(panel, toolbar);
+ evas_object_show(toolbar);
+
+ evas_object_resize(win, 320, 400);
+ evas_object_show(win);
+}
+
+static void
+_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *panel = data;
+ elm_panel_toggle(panel);
+}
+
+static void
+_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_config_scroll_thumbscroll_enabled_set(elm_check_state_get(obj));
+}
+
+void
+test_panel2(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *label, *check, *table, *panel, *list, *button;
+ int i;
+
+ // Left Panel
+ win = elm_win_util_standard_add("panel", "Left Panel");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_resize(win, 320, 400);
+ evas_object_show(win);
+
+ // box for button and table
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(box);
+ elm_win_resize_object_add(win, box);
+
+ // label
+ label = elm_label_add(box);
+ elm_object_text_set(label, "You should enable thumb scroll to use scrollable panel.<br/>"
+ "Check below or enable thumb scroll in elementary_config.");
+ evas_object_show(label);
+ elm_box_pack_end(box, label);
+
+ // check
+ check = elm_check_add(box);
+ elm_check_state_set(check, elm_config_scroll_thumbscroll_enabled_get());
+ elm_object_text_set(check, "Enable thumb scroll (temporarily)");
+ evas_object_show(check);
+ elm_box_pack_end(box, check);
+
+ evas_object_smart_callback_add(check, "changed", _changed_cb, NULL);
+
+ // toggle button
+ button = elm_button_add(box);
+ evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(button);
+ elm_object_text_set(button, "Toggle");
+ elm_box_pack_end(box, button);
+
+ // table for panel and center content
+ table = elm_table_add(win);
+ evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(table);
+ elm_box_pack_end(box, table);
+
+ // center content
+ list = elm_list_add(table);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(list);
+ for (i = 0; i < 20; i++)
+ elm_list_item_append(list, "center list item", NULL, NULL, NULL, NULL);
+ elm_table_pack(table, list, 0, 0, 1, 1);
+
+ // panel
+ panel = elm_panel_add(table);
+ evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(panel);
+ elm_table_pack(table, panel, 0, 0, 1, 1);
+
+ elm_panel_scrollable_set(panel, EINA_TRUE);
+ elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT);
+ elm_panel_hidden_set(panel, EINA_TRUE);
+ elm_panel_scrollable_content_size_set(panel, 0.75);
+
+ list = elm_list_add(panel);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ for (i = 0; i < 7; i++)
+ elm_list_item_append(list, "panel list item", NULL, NULL, NULL, NULL);
+ elm_object_content_set(panel, list);
+
+ evas_object_smart_callback_add(button, "clicked", _clicked_cb, panel);
+}
diff --git a/src/bin/elementary/test_panes.c b/src/bin/elementary/test_panes.c
new file mode 100644
index 0000000000..27d9535045
--- /dev/null
+++ b/src/bin/elementary/test_panes.c
@@ -0,0 +1,105 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_press(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("press\n");
+}
+
+static void
+_unpress(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ printf("unpress, size : %f\n", elm_panes_content_left_size_get(obj));
+}
+
+static void
+_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("clicked\n");
+}
+
+static void
+_clicked_double(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ double *size = data;
+ double tmp_size = 0.0;
+
+ tmp_size = elm_panes_content_left_size_get(obj);
+ printf("clicked double\n");
+ if (tmp_size > 0)
+ {
+ elm_panes_content_left_size_set(obj, 0.0);
+ *size = tmp_size;
+ }
+ else
+ elm_panes_content_left_size_set(obj, *size);
+}
+
+void
+test_panes(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *panes, *panes_h, *bt;
+ static double vbar_size = 0.0;
+ static double hbar_size = 0.0;
+
+ win = elm_win_add(NULL, "panes", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Panes");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ evas_object_show(bg);
+
+ panes = elm_panes_add(win);
+ evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_panes_content_left_min_size_set(panes, 100);
+ elm_panes_content_left_size_set(panes, 0.7);
+ elm_win_resize_object_add(win, panes);
+ evas_object_show(panes);
+
+ evas_object_smart_callback_add(panes, "clicked", _clicked, panes);
+ evas_object_smart_callback_add(panes, "clicked,double", _clicked_double, &vbar_size);
+
+ evas_object_smart_callback_add(panes, "press", _press, panes);
+ evas_object_smart_callback_add(panes, "unpress", _unpress, panes);
+
+ // add left button
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Left - min size 100 - size 70%");
+ evas_object_show(bt);
+ elm_object_part_content_set(panes, "left", bt);
+
+ // add panes
+ panes_h = elm_panes_add(win);
+ elm_panes_horizontal_set(panes_h, EINA_TRUE);
+ elm_panes_content_right_min_size_set(panes_h, 100);
+ elm_panes_content_right_size_set(panes_h, 0.3);
+ evas_object_show(panes_h);
+
+ evas_object_smart_callback_add(panes_h, "clicked", _clicked, panes_h);
+ evas_object_smart_callback_add(panes_h, "clicked,double", _clicked_double, &hbar_size);
+
+ evas_object_smart_callback_add(panes_h, "press", _press, panes_h);
+ evas_object_smart_callback_add(panes_h, "unpress", _unpress, panes_h);
+ elm_object_part_content_set(panes, "right", panes_h);
+
+ // add up button
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Up");
+ evas_object_show(bt);
+ elm_object_part_content_set(panes_h, "top", bt);
+
+ // add down button
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Down - min size 100 size 30%");
+ evas_object_show(bt);
+ elm_object_part_content_set(panes_h, "bottom", bt);
+
+ evas_object_resize(win, 320, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_photo.c b/src/bin/elementary/test_photo.c
new file mode 100644
index 0000000000..7a6e0baf53
--- /dev/null
+++ b/src/bin/elementary/test_photo.c
@@ -0,0 +1,100 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("photo clicked\n");
+}
+
+static void
+drag_start_cb(void *mydata EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *evdata EINA_UNUSED)
+{
+ printf("Drag start.\n");
+}
+
+static void
+drag_end_cb(void *mydata EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *evdata EINA_UNUSED)
+{
+ printf("Drag end.\n");
+}
+
+void
+test_photo(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *sc, *tb, *ph;
+ int i, j, n;
+ char buf[PATH_MAX];
+
+ const char *img[9] =
+ {
+ "panel_01.jpg",
+ "mystrale.jpg",
+ "mystrale_2.jpg",
+ "rock_02.jpg",
+ "sky_01.jpg",
+ "sky_02.jpg",
+ "sky_03.jpg",
+ "sky_04.jpg",
+ "wood_01.jpg"
+ };
+
+ elm_need_ethumb();
+
+ win = elm_win_util_standard_add("photo", "Photo");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ n = 0;
+ for (j = 0; j < 12; j++)
+ {
+ for (i = 0; i < 12; i++)
+ {
+ ph = elm_photo_add(win);
+ evas_object_smart_callback_add(ph, "clicked", _clicked_cb, NULL);
+ snprintf(buf, sizeof(buf), "%s/images/%s",
+ elm_app_data_dir_get(), img[n]);
+ n++;
+ if (n >= 9) n = 0;
+ elm_photo_aspect_fixed_set(ph, EINA_FALSE);
+ elm_photo_size_set(ph, 80);
+ if (n == 8)
+ elm_photo_thumb_set(ph, buf, NULL);
+ else
+ elm_photo_file_set(ph, buf);
+ elm_photo_editable_set(ph, EINA_TRUE);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_smart_callback_add(ph, "drag,start",
+ drag_start_cb, NULL);
+ evas_object_smart_callback_add(ph, "drag,end",
+ drag_end_cb, NULL);
+
+ if ((n == 2) || (n == 3))
+ {
+ elm_photo_fill_inside_set(ph, EINA_TRUE);
+ elm_object_style_set(ph, "shadow");
+ }
+ elm_table_pack(tb, ph, i, j, 1, 1);
+ evas_object_show(ph);
+ }
+ }
+
+ sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, sc);
+
+ elm_object_content_set(sc, tb);
+ evas_object_show(tb);
+ evas_object_show(sc);
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_photocam.c b/src/bin/elementary/test_photocam.c
new file mode 100644
index 0000000000..be6a1724b1
--- /dev/null
+++ b/src/bin/elementary/test_photocam.c
@@ -0,0 +1,616 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static const struct {
+ Evas_Image_Orient orient;
+ const char *name;
+} photocam_orient[] = {
+ { EVAS_IMAGE_ORIENT_NONE, "None" },
+ { EVAS_IMAGE_ORIENT_90, "Rotate 90" },
+ { EVAS_IMAGE_ORIENT_180, "Rotate 180" },
+ { EVAS_IMAGE_ORIENT_270, "Rotate 270" },
+ { EVAS_IMAGE_FLIP_HORIZONTAL, "Horizontal Flip" },
+ { EVAS_IMAGE_FLIP_VERTICAL, "Vertical Flip" },
+ { EVAS_IMAGE_FLIP_TRANSPOSE, "Transpose" },
+ { EVAS_IMAGE_FLIP_TRANSVERSE, "Transverse" },
+ { 0, NULL }
+};
+
+static void
+my_ph_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("clicked\n");
+}
+
+static void
+my_ph_ch(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *photocam = data;
+ Evas_Image_Orient orient = elm_radio_value_get(obj);
+
+ elm_photocam_image_orient_set(photocam, orient);
+ fprintf(stderr, "Set %i and got %i\n",
+ orient, elm_photocam_image_orient_get(photocam));
+}
+
+static void
+my_ph_press(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("press\n");
+}
+
+static void
+my_ph_longpressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("longpressed\n");
+}
+
+static void
+my_ph_clicked_double(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("clicked,double\n");
+}
+
+static void
+my_ph_load(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("load\n");
+}
+
+static void
+my_ph_loaded(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("loaded\n");
+}
+
+static void
+my_ph_load_details(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("load,details\n");
+}
+
+static void
+my_ph_loaded_details(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("loaded,details\n");
+}
+
+static void
+my_ph_zoom_start(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("zoom,start\n");
+}
+
+static void
+my_ph_zoom_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("zoom,stop\n");
+}
+
+static void
+my_ph_zoom_change(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("zoom,change\n");
+}
+
+static void
+my_ph_anim_start(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("anim,start\n");
+}
+
+static void
+my_ph_anim_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("anim,stop\n");
+}
+
+static void
+my_ph_drag_start(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("drag,start\n");
+}
+
+static void
+my_ph_drag_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("drag_stop\n");
+}
+
+static void
+my_ph_scroll(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ int x, y, w, h;
+ elm_photocam_image_region_get(obj, &x, &y, &w, &h);
+ printf("scroll %i %i %ix%i\n", x, y, w, h);
+}
+
+static void
+my_bt_open(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Object *ph = data;
+ const char *file = event_info;
+
+ if (file)
+ elm_photocam_file_set(ph, file);
+}
+
+static void
+my_bt_show_reg(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_photocam_image_region_show(data, 30, 50, 500, 300);
+}
+
+static void
+my_bt_bring_reg(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+
+{
+ elm_photocam_image_region_bring_in(data, 800, 300, 500, 300);
+}
+
+static void
+my_bt_zoom_in(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ double zoom;
+
+ zoom = elm_photocam_zoom_get(data);
+ if (zoom > 1.5)
+ zoom -= 0.5;
+ else if ((zoom > 1.0) && (zoom <= 1.5))
+ zoom = 1.0;
+ else if (zoom == 1.0)
+ zoom = 0.8;
+ else
+ zoom = zoom * zoom;
+
+ elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_MANUAL);
+ if (zoom >= (1.0 / 32.0))
+ {
+ printf("zoom %f\n", zoom);
+ elm_photocam_zoom_set(data, zoom);
+ }
+}
+
+static void
+my_bt_zoom_out(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ double zoom;
+
+ zoom = elm_photocam_zoom_get(data);
+ zoom += 0.5;
+ elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_MANUAL);
+ if (zoom <= 256.0)
+ {
+ printf("zoom %f\n", zoom);
+ elm_photocam_zoom_set(data, zoom);
+ }
+}
+
+static void
+my_bt_pause(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_photocam_paused_set(data, !elm_photocam_paused_get(data));
+}
+
+static void
+my_bt_zoom_fit_in(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT_IN);
+}
+
+static void
+my_bt_zoom_fit(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT);
+}
+
+static void
+my_bt_zoom_fill(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL);
+}
+
+static void
+my_bt_gesture(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_photocam_gesture_enabled_set(data, !elm_photocam_gesture_enabled_get(data));
+}
+
+static void
+my_ph_download_progress(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Elm_Photocam_Progress *info = (Elm_Photocam_Progress *) event_info;
+ Evas_Object *pb = evas_object_data_get(obj, "progressbar");
+
+ if (info->total > 0.0)
+ elm_progressbar_value_set(pb, info->now / info->total);
+}
+
+static void
+my_ph_download_done(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *pb = evas_object_data_get(obj, "progressbar");
+
+ evas_object_hide(pb);
+}
+
+static void
+_photocam_mouse_wheel_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Object *photocam = data;
+ Evas_Event_Mouse_Wheel *ev = (Evas_Event_Mouse_Wheel*) event_info;
+ int zoom;
+ double val;
+
+ //unset the mouse wheel
+ ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+
+ zoom = elm_photocam_zoom_get(photocam);
+ if ((ev->z>0) && (zoom == 1)) return;
+
+ if (ev->z > 0)
+ zoom /= 2;
+ else
+ zoom *= 2;
+
+ val = 1;
+ int _zoom = zoom;
+ while (_zoom>1)
+ {
+ _zoom /= 2;
+ val++;
+ }
+
+ elm_photocam_zoom_mode_set(photocam, ELM_PHOTOCAM_ZOOM_MODE_MANUAL);
+ if (zoom >= 1) elm_photocam_zoom_set(photocam, zoom);
+}
+
+static void
+_photocam_move_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ int x, y, w, h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ evas_object_resize(data, w, h);
+ evas_object_move(data, x, y);
+}
+
+void
+test_photocam(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ Evas_Object *win, *ph, *tb2, *bt, *box, *rd, *rdg = NULL;
+ int i;
+ Evas_Object *rect = NULL;
+ win = elm_win_util_standard_add("photocam", "PhotoCam");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ph = elm_photocam_add(win);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get());
+ elm_photocam_file_set(ph, buf);
+ elm_win_resize_object_add(win, ph);
+
+ // this rectangle hooks the event prior to scroller
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rect, 0, 0, 0, 0);
+ evas_object_repeat_events_set(rect, EINA_TRUE);
+ evas_object_show(rect);
+ evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_WHEEL, _photocam_mouse_wheel_cb, ph);
+ evas_object_raise(rect);
+
+ // add move/resize callbacks to resize rect manually
+ evas_object_event_callback_add(ph, EVAS_CALLBACK_RESIZE, _photocam_move_resize_cb, rect);
+ evas_object_event_callback_add(ph, EVAS_CALLBACK_MOVE, _photocam_move_resize_cb, rect);
+
+ evas_object_smart_callback_add(ph, "clicked", my_ph_clicked, win);
+ evas_object_smart_callback_add(ph, "press", my_ph_press, win);
+ evas_object_smart_callback_add(ph, "longpressed", my_ph_longpressed, win);
+ evas_object_smart_callback_add(ph, "clicked,double", my_ph_clicked_double, win);
+ evas_object_smart_callback_add(ph, "load", my_ph_load, win);
+ evas_object_smart_callback_add(ph, "loaded", my_ph_loaded, win);
+ evas_object_smart_callback_add(ph, "load,details", my_ph_load_details, win);
+ evas_object_smart_callback_add(ph, "loaded,details", my_ph_loaded_details, win);
+ evas_object_smart_callback_add(ph, "zoom,start", my_ph_zoom_start, win);
+ evas_object_smart_callback_add(ph, "zoom,stop", my_ph_zoom_stop, win);
+ evas_object_smart_callback_add(ph, "zoom,change", my_ph_zoom_change, win);
+ evas_object_smart_callback_add(ph, "scroll,anim,start", my_ph_anim_start, win);
+ evas_object_smart_callback_add(ph, "scroll,anim,stop", my_ph_anim_stop, win);
+ evas_object_smart_callback_add(ph, "scroll,drag,start", my_ph_drag_start, win);
+ evas_object_smart_callback_add(ph, "scroll,drag,stop", my_ph_drag_stop, win);
+ evas_object_smart_callback_add(ph, "scroll", my_ph_scroll, win);
+
+ evas_object_show(ph);
+
+ tb2 = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb2);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Z -");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_out, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.1, 0.1);
+ elm_table_pack(tb2, bt, 0, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_fileselector_button_add(win);
+ elm_object_text_set(bt, "Select Photo");
+ evas_object_smart_callback_add(bt, "file,chosen", my_bt_open, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.5, 0.1);
+ elm_table_pack(tb2, bt, 1, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Z +");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_in, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.1);
+ elm_table_pack(tb2, bt, 2, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Show 30,50 500x300");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_show_reg, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.1, 0.5);
+ elm_table_pack(tb2, bt, 0, 1, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Bring 800,300 500x300");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_bring_reg, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.5);
+ elm_table_pack(tb2, bt, 2, 1, 1, 1);
+ evas_object_show(bt);
+
+ box = elm_box_add(win);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(box, 0.0, 0.9);
+ elm_table_pack(tb2, box, 0, 2, 1, 1);
+ evas_object_show(box);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pause On/Off");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_pause, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Gesture On/Off");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_gesture, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ box = elm_box_add(win);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(box, 0.9, 0.9);
+ elm_table_pack(tb2, box, 2, 2, 1, 1);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Fit");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Fit_In");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit_in, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Fill");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fill, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ box = elm_box_add(tb2);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(box, 0.9, 0.9);
+ elm_table_pack(tb2, box, 1, 2, 1, 1);
+ evas_object_show(box);
+
+ for (i = 0; photocam_orient[i].name; ++i)
+ {
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, photocam_orient[i].orient);
+ elm_object_text_set(rd, photocam_orient[i].name);
+ elm_box_pack_end(box, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", my_ph_ch, ph);
+ if (!rdg)
+ rdg = rd;
+ else
+ elm_radio_group_add(rd, rdg);
+ }
+ evas_object_show(box);
+ evas_object_show(tb2);
+
+ evas_object_resize(win, 800, 800);
+ evas_object_show(win);
+}
+
+void
+test_photocam_remote(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *ph, *tb2, *bt, *box, *pb, *rd;
+ Evas_Object *rdg = NULL;
+ Evas_Object *rect = NULL;
+ // these were just testing - use the "select photo" browser to select one
+ static const char *url = "http://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73751/world.topo.bathy.200407.3x21600x10800.jpg";
+ int i;
+
+ win = elm_win_util_standard_add("photocam", "PhotoCam");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ph = elm_photocam_add(win);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, ph);
+
+ // this rectangle hooks the event prior to scroller
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_color_set(rect, 0, 0, 0, 0);
+ evas_object_repeat_events_set(rect, EINA_TRUE);
+ evas_object_show(rect);
+ evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_WHEEL, _photocam_mouse_wheel_cb, ph);
+ evas_object_raise(rect);
+
+ // add move/resize callbacks to resize rect manually
+ evas_object_event_callback_add(ph, EVAS_CALLBACK_RESIZE, _photocam_move_resize_cb, rect);
+ evas_object_event_callback_add(ph, EVAS_CALLBACK_MOVE, _photocam_move_resize_cb, rect);
+
+ evas_object_smart_callback_add(ph, "clicked", my_ph_clicked, win);
+ evas_object_smart_callback_add(ph, "press", my_ph_press, win);
+ evas_object_smart_callback_add(ph, "longpressed", my_ph_longpressed, win);
+ evas_object_smart_callback_add(ph, "clicked,double", my_ph_clicked_double, win);
+ evas_object_smart_callback_add(ph, "load", my_ph_load, win);
+ evas_object_smart_callback_add(ph, "loaded", my_ph_loaded, win);
+ evas_object_smart_callback_add(ph, "load,details", my_ph_load_details, win);
+ evas_object_smart_callback_add(ph, "loaded,details", my_ph_loaded_details, win);
+ evas_object_smart_callback_add(ph, "zoom,start", my_ph_zoom_start, win);
+ evas_object_smart_callback_add(ph, "zoom,stop", my_ph_zoom_stop, win);
+ evas_object_smart_callback_add(ph, "zoom,change", my_ph_zoom_change, win);
+ evas_object_smart_callback_add(ph, "scroll,anim,start", my_ph_anim_start, win);
+ evas_object_smart_callback_add(ph, "scroll,anim,stop", my_ph_anim_stop, win);
+ evas_object_smart_callback_add(ph, "scroll,drag,start", my_ph_drag_start, win);
+ evas_object_smart_callback_add(ph, "scroll,drag,stop", my_ph_drag_stop, win);
+ evas_object_smart_callback_add(ph, "scroll", my_ph_scroll, win);
+ evas_object_smart_callback_add(ph, "download,progress", my_ph_download_progress, win);
+ evas_object_smart_callback_add(ph, "download,done", my_ph_download_done, win);
+
+ elm_photocam_file_set(ph, url);
+ evas_object_show(ph);
+
+ tb2 = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb2);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Z -");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_out, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.1, 0.1);
+ elm_table_pack(tb2, bt, 0, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Z +");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_in, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.1);
+ elm_table_pack(tb2, bt, 2, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Show 30,50 500x300");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_show_reg, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.1, 0.5);
+ elm_table_pack(tb2, bt, 0, 1, 1, 1);
+ evas_object_show(bt);
+
+ pb = elm_progressbar_add(win);
+ elm_progressbar_unit_format_set(pb, "Loading %.2f %%");
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb2, pb, 1, 1, 1, 1);
+ evas_object_show(pb);
+ evas_object_data_set(ph, "progressbar", pb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Bring 800,300 500x300");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_bring_reg, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.5);
+ elm_table_pack(tb2, bt, 2, 1, 1, 1);
+ evas_object_show(bt);
+
+ box = elm_box_add(win);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(box, 0.0, 0.9);
+ elm_table_pack(tb2, box, 0, 2, 1, 1);
+ evas_object_show(box);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Pause On/Off");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_pause, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Gesture On/Off");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_gesture, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ box = elm_box_add(win);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(box, 0.9, 0.9);
+ elm_table_pack(tb2, box, 2, 2, 1, 1);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Fit");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Fit_In");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit_in, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Fill");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fill, ph);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ box = elm_box_add(tb2);
+ elm_box_horizontal_set(box, EINA_TRUE);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(box, 0.9, 0.9);
+ elm_table_pack(tb2, box, 1, 2, 1, 1);
+ evas_object_show(box);
+
+ for (i = 0; photocam_orient[i].name; ++i)
+ {
+ rd = elm_radio_add(win);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_radio_state_value_set(rd, photocam_orient[i].orient);
+ elm_object_text_set(rd, photocam_orient[i].name);
+ elm_box_pack_end(box, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", my_ph_ch, ph);
+ if (!rdg)
+ rdg = rd;
+ else
+ elm_radio_group_add(rd, rdg);
+ }
+ evas_object_show(box);
+ evas_object_show(tb2);
+
+ evas_object_resize(win, 800, 800);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_popup.c b/src/bin/elementary/test_popup.c
new file mode 100644
index 0000000000..3ab08e1722
--- /dev/null
+++ b/src/bin/elementary/test_popup.c
@@ -0,0 +1,934 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define POPUP_POINT_MAX 8
+
+typedef struct
+{
+ double x;
+ double y;
+} Evas_Rel_Coord_Point;
+
+static Evas_Object *g_popup = NULL;
+static int times = 0;
+static Eina_Bool is_popup_scroll;
+static Evas_Rel_Coord_Point _popup_point[POPUP_POINT_MAX] =
+{
+ { 0.01, 0.01 },
+ { 0.2, 0.2 },
+ { 0.5, 0.5 },
+ { 0.99, 0.01 },
+ { 0.01, 0.99 },
+ { 0.99, 0.99 },
+ { 0.0, 0.0 },
+ { 1.5, 1.5 }
+};
+
+static void
+_response_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ evas_object_del(obj);
+}
+
+static void
+_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static void
+_popup_dismiss_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ elm_popup_dismiss(data);
+}
+
+static void
+_popup_align_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ static int k = 0;
+ double h = -1, v = -1;
+
+ elm_popup_align_set(data, _popup_point[k].x, _popup_point[k].y);
+ elm_popup_align_get(data, &h, &v);
+
+ printf("elm_popup_align_get :: Aligned: %lf %lf\n", h, v);
+
+ k++;
+ if (k >= POPUP_POINT_MAX)
+ k = 0;
+}
+
+static void
+_g_popup_response_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ evas_object_hide(data);
+}
+
+static void
+_restack_block_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ // remove restacked image if there is any
+ Evas_Object *popup_data = evas_object_data_get(obj, "im");
+ if (popup_data) evas_object_del(popup_data);
+ evas_object_del(obj);
+}
+
+static void
+_restack_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup_data = evas_object_data_get(data, "im");
+ if (popup_data) evas_object_del(popup_data);
+ evas_object_del(data);
+}
+
+static void
+_block_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (data)
+ evas_object_del(data);
+ evas_object_del(obj);
+}
+
+static void
+_item_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ printf("popup item selected: %s\n", elm_object_item_text_get(event_info));
+}
+
+static void
+_list_click(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *it = elm_list_selected_item_get(obj);
+ if (!it) return;
+ elm_list_item_selected_set(it, EINA_FALSE);
+}
+
+static void
+_popup_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+
+ printf("Key: %s\n", ev->keyname);
+}
+
+static void
+_popup_center_text_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+
+ popup = elm_popup_add(data);
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ elm_object_text_set(popup, "This Popup has content area and "
+ "timeout value is 3 seconds");
+ elm_popup_timeout_set(popup, 3.0);
+ evas_object_smart_callback_add(popup, "timeout", _response_cb, popup);
+ evas_object_event_callback_add(popup, EVAS_CALLBACK_KEY_DOWN,
+ _popup_key_down_cb, NULL);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_center_text_1button_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+ Evas_Object *btn;
+
+ popup = elm_popup_add(data);
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ elm_object_text_set(popup, "This Popup has content area and "
+ "action area set, action area has one button Close");
+
+ // popup buttons
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Close");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_center_title_text_1button_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+ Evas_Object *btn;
+
+ popup = elm_popup_add(data);
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+
+ // popup text
+ elm_object_text_set(popup, "This Popup has title area, content area and "
+ "action area set, action area has one button Close");
+ // popup title
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ // popup buttons
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Close");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_center_title_text_block_clicked_event_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+
+ popup = elm_popup_add(data);
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb,
+ NULL);
+
+ // popup text
+ elm_object_text_set(popup, "This Popup has title area and content area. "
+ "When clicked on blocked event region, popup gets "
+ "deleted");
+ // popup title
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_center_title_text_block_clicked_event_with_parent_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *bg, *popup;
+
+ bg = elm_bg_add(data);
+ elm_bg_color_set(bg, 255, 0, 0);
+ evas_object_resize(bg, 350, 200);
+ evas_object_move(bg, 100, 100);
+ evas_object_show(bg);
+
+ popup = elm_popup_add(bg);
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ evas_object_smart_callback_add(popup, "block,clicked",
+ _block_clicked_cb, bg);
+
+ // popup text
+ elm_object_text_set(popup, "This Popup has title area and content area. "
+ "Its blocked event region is a small rectangle. "
+ "When clicked on blocked event region, popup gets "
+ "deleted");
+ // popup title
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_bottom_title_text_3button_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+ Evas_Object *icon, *btn1, *btn2, *btn3;
+ char buf[256];
+
+ popup = elm_popup_add(data);
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM);
+
+ // popup text
+ elm_object_text_set(popup, "This Popup has title area, content area and "
+ "action area set with content being character wrapped. "
+ "action area has three buttons OK, Cancel and Close");
+ elm_popup_content_text_wrap_type_set(popup, ELM_WRAP_CHAR);
+
+ // popup title
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ // popup title icon
+ icon = elm_icon_add(popup);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png",
+ elm_app_data_dir_get());
+ elm_image_file_set(icon, buf, NULL);
+ elm_object_part_content_set(popup, "title,icon", icon);
+
+ // popup buttons
+ btn1 = elm_button_add(popup);
+ elm_object_text_set(btn1, "OK");
+ elm_object_part_content_set(popup, "button1", btn1);
+ evas_object_smart_callback_add(btn1, "clicked", _popup_close_cb, popup);
+
+ btn2 = elm_button_add(popup);
+ elm_object_text_set(btn2, "Cancel");
+ elm_object_part_content_set(popup, "button2", btn2);
+ evas_object_smart_callback_add(btn2, "clicked", _popup_close_cb, popup);
+
+ btn3 = elm_button_add(popup);
+ elm_object_text_set(btn3, "Close");
+ elm_object_part_content_set(popup, "button3", btn3);
+ evas_object_smart_callback_add(btn3, "clicked", _popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_center_title_content_3button_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+ Evas_Object *icon, *btn, *btn1, *btn2, *btn3;
+ char buf[256];
+
+ popup = elm_popup_add(data);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+
+ // popup title
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ // popup content
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Content");
+ icon = elm_icon_add(btn);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png",
+ elm_app_data_dir_get());
+ elm_image_file_set(icon, buf, NULL);
+ elm_object_content_set(btn, icon);
+ elm_object_content_set(popup, btn);
+
+ // popup buttons
+ btn1 = elm_button_add(popup);
+ elm_object_text_set(btn1, "OK");
+ elm_object_part_content_set(popup, "button1", btn1);
+ evas_object_smart_callback_add(btn1, "clicked", _popup_close_cb, popup);
+
+ btn2 = elm_button_add(popup);
+ elm_object_text_set(btn2, "Cancel");
+ elm_object_part_content_set(popup, "button2", btn2);
+ evas_object_smart_callback_add(btn2, "clicked", _popup_close_cb, popup);
+
+ btn3 = elm_button_add(popup);
+ elm_object_text_set(btn3, "Close");
+ elm_object_part_content_set(popup, "button3", btn3);
+ evas_object_smart_callback_add(btn3, "clicked", _popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_item_focused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *it = event_info;
+
+ printf("item,focused:%p\n", it);
+}
+
+static void
+_item_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *it = event_info;
+
+ printf("item,unfocused:%p\n", it);
+}
+
+static void
+_popup_center_title_item_3button_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ char buf[256];
+ unsigned int i;
+ Evas_Object *popup, *icon1, *btn1, *btn2, *btn3;
+
+ popup = elm_popup_add(data);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+
+ // popup title
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ // popup items
+ icon1 = elm_icon_add(popup);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png",
+ elm_app_data_dir_get());
+ elm_image_file_set(icon1, buf, NULL);
+ for (i = 0; i < 20; i++)
+ {
+ snprintf(buf, sizeof(buf), "Item%u", i+1);
+ if (i == 3)
+ elm_popup_item_append(popup, buf, icon1, _item_selected_cb, NULL);
+ else
+ elm_popup_item_append(popup, buf, NULL, _item_selected_cb, NULL);
+ }
+
+ // popup buttons
+ btn1 = elm_button_add(popup);
+ elm_object_text_set(btn1, "OK");
+ elm_object_part_content_set(popup, "button1", btn1);
+ evas_object_smart_callback_add(btn1, "clicked", _popup_close_cb, popup);
+
+ btn2 = elm_button_add(popup);
+ elm_object_text_set(btn2, "Cancel");
+ elm_object_part_content_set(popup, "button2", btn2);
+ evas_object_smart_callback_add(btn2, "clicked", _popup_close_cb, popup);
+
+ btn3 = elm_button_add(popup);
+ elm_object_text_set(btn3, "Close");
+ elm_object_part_content_set(popup, "button3", btn3);
+ evas_object_smart_callback_add(btn3, "clicked", _popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+ evas_object_smart_callback_add(popup, "item,focused", _item_focused_cb, NULL);
+ evas_object_smart_callback_add(popup, "item,unfocused", _item_unfocused_cb, NULL);
+}
+
+static void
+_restack_btn_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *im;
+ char buf[PATH_MAX];
+ void *popup_data;
+
+ popup_data = evas_object_data_get(data, "im");
+ if (popup_data) return;
+
+ im = evas_object_image_filled_add(evas_object_evas_get(obj));
+ snprintf(buf, sizeof(buf), "%s/images/%s",
+ elm_app_data_dir_get(), "twofish.jpg");
+ evas_object_image_file_set(im, buf, NULL);
+ evas_object_move(im, 40, 40);
+ evas_object_resize(im, 320, 320);
+ evas_object_show(im);
+ evas_object_data_set((Evas_Object *)data, "im", im);
+
+ evas_object_raise((Evas_Object *)data);
+}
+
+static void
+_popup_center_title_text_2button_restack_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+ Evas_Object *btn, *btn2;
+
+ popup = elm_popup_add(data);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ evas_object_smart_callback_add(popup, "block,clicked",
+ _restack_block_clicked_cb, NULL);
+
+ // popup text
+ elm_object_text_set(popup, "When you click the 'Restack' button, "
+ "an image will be located under this popup");
+ // popup title
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ // popup buttons
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Restack");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _restack_btn_clicked, popup);
+
+ btn2 = elm_button_add(popup);
+ elm_object_text_set(btn2, "Close");
+ elm_object_part_content_set(popup, "button2", btn2);
+ evas_object_smart_callback_add(btn2, "clicked",
+ _restack_popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_center_text_1button_hide_show_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *btn;
+ char str[128];
+
+ times++;
+ if (g_popup)
+ {
+ sprintf(str, "You have checked this popup %d times.", times);
+ elm_object_text_set(g_popup, str);
+ evas_object_show(g_popup);
+ return;
+ }
+
+ g_popup = elm_popup_add(data);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(g_popup, is_popup_scroll);
+ elm_object_text_set(g_popup, "Hide this popup by using the button."
+ "When you click list item again, you can see this popup.");
+
+ // popup buttons
+ btn = elm_button_add(g_popup);
+ elm_object_text_set(btn, "Hide");
+ elm_object_part_content_set(g_popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _g_popup_response_cb, g_popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(g_popup);
+}
+
+static void
+_toggle_button_cb(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *btn = data;
+ char buf[] = "button0";
+ int i;
+
+ i = (int)(uintptr_t)evas_object_data_get(btn, "index");
+
+ buf[6] = '0' + i + 1;
+ if (evas_object_visible_get(btn))
+ {
+ elm_object_part_content_unset(obj, buf);
+ evas_object_hide(btn);
+ }
+ else
+ elm_object_part_content_set(obj, buf, btn);
+}
+
+static void
+_popup_center_text_3button_add_remove_button_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+ Evas_Object *btns[3];
+
+ char buf[256];
+ int i;
+
+ popup = elm_popup_add(data);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+
+ // popup title
+ elm_object_part_text_set(popup, "title,text",
+ "Click the item to toggle button");
+
+ // popup buttons
+ for (i = 0; i < 3; ++i)
+ {
+ snprintf(buf, sizeof(buf), "Btn #%d", i + 1);
+ btns[i] = elm_button_add(popup);
+ evas_object_data_set(btns[i], "index", (void*)(uintptr_t)i);
+ elm_object_text_set(btns[i], buf);
+
+ elm_popup_item_append(popup, buf, NULL, _toggle_button_cb, btns[i]);
+
+ snprintf(buf, sizeof(buf), "button%d", i + 1);
+ elm_object_part_content_set(popup, buf, btns[i]);
+ evas_object_smart_callback_add(btns[i], "clicked",
+ _popup_close_cb, popup);
+ }
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_transparent_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+ Evas_Object *btn;
+
+ popup = elm_popup_add(data);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ elm_object_style_set(popup, "transparent");
+ elm_object_text_set(popup, "This Popup has transparent background");
+
+ // popup buttons
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Close");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_transparent_align_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+ Evas_Object *btn, *btn1;
+
+ popup = elm_popup_add(data);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ elm_object_style_set(popup, "transparent");
+ elm_object_text_set(popup, "This Popup has transparent background");
+
+ // popup buttons
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Move");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _popup_align_cb, popup);
+
+ btn1 = elm_button_add(popup);
+ elm_object_text_set(btn1, "Close");
+ elm_object_part_content_set(popup, "button2", btn1);
+ evas_object_smart_callback_add(btn1, "clicked", _popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_list_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+char *
+gl_popup_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
+ return strdup(buf);
+}
+
+static void
+_popup_center_title_list_content_1button_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup, *list;
+ Evas_Object *btn;
+
+ popup = elm_popup_add(data);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ // list as a popup content
+ list = elm_list_add(popup);
+ elm_list_mode_set(list, ELM_LIST_EXPAND);
+ elm_list_item_append(list, "List Item #1", NULL, NULL, _list_cb, popup);
+ elm_list_item_append(list, "List Item #2", NULL, NULL, _list_cb, popup);
+ elm_list_item_append(list, "List Item #3", NULL, NULL, _list_cb, popup);
+ elm_object_content_set(popup, list);
+
+ // popup buttons
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "OK");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_center_title_genlist_content_1button_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup, *genlist;
+ Evas_Object *btn;
+ int i;
+
+ popup = elm_popup_add(data);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ Elm_Genlist_Item_Class *itc1 = elm_genlist_item_class_new();
+ itc1->item_style = "default";
+ itc1->func.text_get = gl_popup_text_get;
+ itc1->func.content_get = NULL;
+ itc1->func.state_get = NULL;
+ itc1->func.del = NULL;
+
+ // genlist as a popup content
+ genlist = elm_genlist_add(popup);
+ elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
+ elm_scroller_content_min_limit(genlist, EINA_FALSE, EINA_TRUE);
+
+ for (i = 0; i < 10; i++)
+ {
+ elm_genlist_item_append(genlist,
+ itc1,
+ (void *)(uintptr_t)i/* item data */,
+ NULL/* parent */,
+ ELM_GENLIST_ITEM_NONE,
+ NULL,
+ NULL);
+ }
+ elm_genlist_item_class_free(itc1);
+ elm_object_content_set(popup, genlist);
+
+ // popup buttons
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "OK");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_subpopup_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+ Evas_Object *btn, *btnclose;
+
+ popup = elm_popup_add(data);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+ elm_object_style_set(popup, "subpopup");
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ // button as a popup content
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "content");
+ elm_object_content_set(popup, btn);
+
+ // popup buttons
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "OK");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
+
+ //popup-base close button
+ btnclose = elm_button_add(popup);
+ //TODO: write a X style button theme
+ elm_object_text_set(btnclose, "x");
+ elm_object_part_content_set(popup, "elm.swallow.closebtn", btnclose);
+ evas_object_smart_callback_add(btnclose, "clicked", _popup_close_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_popup_content_only_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup, *bx, *hbx, *lbl, *btn;
+ Evas_Object *win = data;
+
+ popup = elm_popup_add(win);
+ if (is_popup_scroll)
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+
+ bx = elm_box_add(popup);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.0);
+ elm_object_content_set(popup, bx);
+
+ lbl = elm_label_add(popup);
+ elm_object_text_set(lbl,
+ "<align=center>This popup contains content area only.<br>"
+ "The buttons below are the part of content area, not action area");
+ evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(bx, lbl);
+ evas_object_show(lbl);
+
+ hbx = elm_box_add(bx);
+ elm_box_horizontal_set(hbx, EINA_TRUE);
+ evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(bx, hbx);
+ evas_object_show(hbx);
+
+ btn = elm_button_add(hbx);
+ elm_object_text_set(btn, "Save");
+ evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
+ elm_box_pack_end(hbx, btn);
+ evas_object_show(btn);
+
+ btn = elm_button_add(hbx);
+ elm_object_text_set(btn, "Discard");
+ evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
+ elm_box_pack_end(hbx, btn);
+ evas_object_show(btn);
+
+ btn = elm_button_add(hbx);
+ elm_object_text_set(btn, "Cancel");
+ evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
+ elm_box_pack_end(hbx, btn);
+ evas_object_show(btn);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+ elm_object_focus_set(btn, EINA_TRUE);
+}
+
+static void
+_popup_center_title_text_1button_hide_effect_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup;
+ Evas_Object *btn;
+
+ popup = elm_popup_add(data);
+ elm_popup_scrollable_set(popup, is_popup_scroll);
+
+ // popup text
+ elm_object_text_set(popup, "This Popup has title area, content area and "
+ "action area set, action area has one button Close");
+ // popup title
+ elm_object_part_text_set(popup, "title,text", "Title");
+
+ // popup buttons
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Close");
+ elm_object_part_content_set(popup, "button1", btn);
+ evas_object_smart_callback_add(popup, "dismissed", _response_cb, NULL);
+ evas_object_smart_callback_add(btn, "clicked", _popup_dismiss_btn_cb, popup);
+
+ // popup show should be called after adding all the contents and the buttons
+ // of popup to set the focus into popup's contents correctly.
+ evas_object_show(popup);
+}
+
+static void
+_focus_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Eina_Bool check = elm_check_state_get(obj);
+ elm_win_focus_highlight_enabled_set(data, check);
+ elm_win_focus_highlight_animate_set(data, check);
+}
+
+static void
+_popup_scroll_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ is_popup_scroll = elm_check_state_get(obj);
+}
+
+void
+test_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *list, *check;
+
+ win = elm_win_util_standard_add("popup", "Popup");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ list = elm_list_add(box);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, list);
+ elm_list_mode_set(list, ELM_LIST_LIMIT);
+ evas_object_smart_callback_add(list, "selected", _list_click, NULL);
+
+ elm_list_item_append(list, "popup-center-text", NULL, NULL,
+ _popup_center_text_cb, win);
+ elm_list_item_append(list, "popup-center-text + 1 button", NULL, NULL,
+ _popup_center_text_1button_cb, win);
+ elm_list_item_append(list, "popup-center-title + text + 1 button", NULL,
+ NULL, _popup_center_title_text_1button_cb, win);
+
+ elm_list_item_append(list,
+ "popup-center-title + text (block,clicked handling)",
+ NULL, NULL,
+ _popup_center_title_text_block_clicked_event_cb, win);
+ elm_list_item_append(list,
+ "popup-center-title + text (block,clicked handling with parent)",
+ NULL, NULL,
+ _popup_center_title_text_block_clicked_event_with_parent_cb, win);
+ elm_list_item_append(list, "popup-bottom-title-icon + text + 3 buttons", NULL,
+ NULL, _popup_bottom_title_text_3button_cb, win);
+ elm_list_item_append(list, "popup-center-title + content + 3 buttons", NULL,
+ NULL, _popup_center_title_content_3button_cb, win);
+ elm_list_item_append(list, "popup-center-title + items + 3 buttons", NULL,
+ NULL, _popup_center_title_item_3button_cb, win);
+ elm_list_item_append(list, "popup-center-title + text + 2 buttons (check restacking)", NULL, NULL,
+ _popup_center_title_text_2button_restack_cb, win);
+ elm_list_item_append(list, "popup-center-text + 1 button (check hide, show)", NULL, NULL,
+ _popup_center_text_1button_hide_show_cb, win);
+ elm_list_item_append(list, "popup-center-text + 3 button (check add, remove buttons)", NULL, NULL,
+ _popup_center_text_3button_add_remove_button_cb, win);
+ elm_list_item_append(list, "popup-transparent", NULL, NULL,
+ _popup_transparent_cb, win);
+ elm_list_item_append(list, "popup-transparent-align", NULL, NULL,
+ _popup_transparent_align_cb, win);
+ elm_list_item_append(list, "popup-center-title + list content + 1 button",
+ NULL, NULL, _popup_center_title_list_content_1button_cb,
+ win);
+ elm_list_item_append(list, "popup-center-title + genlist content + 1 button",
+ NULL, NULL, _popup_center_title_genlist_content_1button_cb,
+ win);
+ elm_list_item_append(list, "subpopup + X button",
+ NULL, NULL, _subpopup_cb,
+ win);
+ elm_list_item_append(list, "popup with content only",
+ NULL, NULL, _popup_content_only_cb,
+ win);
+ elm_list_item_append(list, "popup-center-title + text + 1 button + hide effect", NULL,
+ NULL, _popup_center_title_text_1button_hide_effect_cb, win);
+ elm_list_go(list);
+ evas_object_show(list);
+
+ check = elm_check_add(box);
+ elm_object_text_set(check, "Enable Focus Highlight");
+ evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, check);
+ evas_object_show(check);
+ evas_object_smart_callback_add(check, "changed", _focus_changed_cb, win);
+
+ check = elm_check_add(box);
+ elm_object_text_set(check, "Enable popup scroll");
+ evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(box, check);
+ evas_object_show(check);
+ evas_object_smart_callback_add(check, "changed", _popup_scroll_cb, NULL);
+
+ evas_object_resize(win, 480, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_prefs.c b/src/bin/elementary/test_prefs.c
new file mode 100644
index 0000000000..591aa095c1
--- /dev/null
+++ b/src/bin/elementary/test_prefs.c
@@ -0,0 +1,119 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define WIDTH (500)
+#define HEIGHT (1000)
+#define MSG_ID_VEL (1)
+
+static void
+_update_animation(Evas_Object *prefs, Evas_Object *layout)
+{
+ Eina_Value value;
+ Eina_Bool animation;
+
+ elm_prefs_item_value_get(prefs, "main:animation", &value);
+ eina_value_get(&value, &animation);
+ if (animation)
+ elm_layout_signal_emit(layout, "start", "animation");
+ else
+ elm_layout_signal_emit(layout, "stop", "animation");
+}
+
+static void
+_update_animation_time(Evas_Object *prefs, Evas_Object *layout)
+{
+ Eina_Value value;
+ float animation_time;
+ Edje_Message_Float msg;
+
+ elm_prefs_item_value_get(prefs, "main:animation_time", &value);
+ eina_value_get(&value, &animation_time);
+ msg.val = animation_time;
+ edje_object_message_send(elm_layout_edje_get(layout), EDJE_MESSAGE_FLOAT,
+ MSG_ID_VEL, &msg);
+}
+
+static void
+_update(Evas_Object *prefs, Evas_Object *layout)
+{
+ _update_animation(prefs, layout);
+ _update_animation_time(prefs, layout);
+}
+
+static void
+_page_loaded_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *layout = data;
+
+ _update(obj, layout);
+}
+
+static void
+_item_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ const char *item = event_info;
+ Evas_Object *layout = data;
+
+ if (!strcmp(item, "main:animation_time"))
+ _update_animation_time(obj, layout);
+ else if (!strcmp(item, "main:animation"))
+ _update_animation(obj, layout);
+}
+
+void
+test_prefs(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *prefs, *layout;
+ Elm_Prefs_Data *prefs_data;
+ char buf[PATH_MAX];
+
+ win = elm_win_add(NULL, "Prefs", ELM_WIN_BASIC);
+ elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+ elm_win_title_set(win, "Prefs");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ elm_win_resize_object_add(win, bg);
+ evas_object_size_hint_min_set(bg, WIDTH, HEIGHT);
+ evas_object_size_hint_max_set(bg, WIDTH, HEIGHT);
+ evas_object_show(bg);
+
+ layout = elm_layout_add(win);
+ snprintf(buf, sizeof(buf),
+ "%s/objects/test_prefs.edj", elm_app_data_dir_get());
+ elm_layout_file_set(layout, buf, "prefs_edje");
+
+ prefs = elm_prefs_add(win);
+ evas_object_size_hint_weight_set(prefs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_resize(prefs, WIDTH, HEIGHT);
+ evas_object_show(prefs);
+
+ evas_object_smart_callback_add(prefs, "page,loaded", _page_loaded_cb,
+ layout);
+ evas_object_smart_callback_add(prefs, "item,changed", _item_changed_cb,
+ layout);
+
+ elm_prefs_autosave_set(prefs, EINA_TRUE);
+
+ prefs_data =
+ elm_prefs_data_new("./test_prefs.cfg", NULL, EET_FILE_MODE_READ_WRITE);
+
+ snprintf(buf, sizeof(buf),
+ "%s/objects/test_prefs.epb", elm_app_data_dir_get());
+
+ elm_prefs_file_set(prefs, buf, NULL);
+ elm_prefs_data_set(prefs, prefs_data);
+
+ elm_prefs_item_swallow(prefs, "main:swal", layout);
+
+ _update_animation_time(prefs, layout);
+ _update_animation(prefs, layout);
+
+ evas_object_resize(win, WIDTH, HEIGHT);
+ evas_object_show(win);
+
+ elm_prefs_data_unref(prefs_data);
+}
diff --git a/src/bin/elementary/test_progressbar.c b/src/bin/elementary/test_progressbar.c
new file mode 100644
index 0000000000..91282c0cde
--- /dev/null
+++ b/src/bin/elementary/test_progressbar.c
@@ -0,0 +1,397 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct Progressbar_Data
+{
+ Evas_Object *pb1;
+ Evas_Object *pb2;
+ Evas_Object *pb3;
+ Evas_Object *pb4;
+ Evas_Object *pb5;
+ Evas_Object *pb6;
+ Evas_Object *pb7;
+ Ecore_Timer *timer;
+ Evas_Object *btn_start;
+ Evas_Object *btn_stop;
+} Progressbar_Data;
+
+static Eina_Bool
+_my_progressbar_value_set(void *data)
+{
+ double progress;
+ Progressbar_Data *pd = data;
+
+ progress = elm_progressbar_value_get (pd->pb1);
+ if (progress < 1.0) progress += 0.0123;
+ else progress = 0.0;
+ elm_progressbar_value_set(pd->pb1, progress);
+ elm_progressbar_value_set(pd->pb4, progress);
+ elm_progressbar_value_set(pd->pb3, progress);
+ elm_progressbar_value_set(pd->pb6, progress);
+
+ if (progress < 1.0) return ECORE_CALLBACK_RENEW;
+
+ pd->timer = NULL;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+my_progressbar_test_start(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Progressbar_Data *pd = data;
+ if (!pd) return;
+
+ fprintf(stderr, "s1\n");
+ elm_progressbar_pulse(pd->pb2, EINA_TRUE);
+ fprintf(stderr, "s2\n");
+ elm_progressbar_pulse(pd->pb5, EINA_TRUE);
+ fprintf(stderr, "s3 %p\n", pd->pb7);
+ elm_progressbar_pulse(pd->pb7, EINA_TRUE);
+ fprintf(stderr, "s4\n");
+
+ elm_object_disabled_set(pd->btn_start, EINA_TRUE);
+ elm_object_disabled_set(pd->btn_stop, EINA_FALSE);
+
+ if (!pd->timer)
+ pd->timer = ecore_timer_add(0.1, _my_progressbar_value_set, pd);
+}
+
+static void
+my_progressbar_test_stop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Progressbar_Data *pd = data;
+ if (!pd) return;
+
+ elm_progressbar_pulse(pd->pb2, EINA_FALSE);
+ elm_progressbar_pulse(pd->pb5, EINA_FALSE);
+ elm_progressbar_pulse(pd->pb7, EINA_FALSE);
+ elm_object_disabled_set(pd->btn_start, EINA_FALSE);
+ elm_object_disabled_set(pd->btn_stop, EINA_TRUE);
+
+ if (pd->timer)
+ {
+ ecore_timer_del(pd->timer);
+ pd->timer = NULL;
+ }
+}
+
+static void
+_progressbar_destroy_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Progressbar_Data *pd = data;
+ if (!pd) return;
+
+ ecore_timer_del(pd->timer);
+ free(pd);
+ my_progressbar_test_stop(NULL, NULL, NULL);
+ evas_object_del(obj);
+}
+
+static char *
+my_progressbar_format_cb(double val)
+{
+ char buf[1024];
+ int files;
+
+ files = (1-val)*14000;
+ if(snprintf(buf, 30, "%i files left", files) > 0)
+ return strdup(buf);
+ return NULL;
+}
+
+void
+test_progressbar(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *pb, *bx, *hbx, *bt, *bt_bx, *ic1, *ic2;
+ char buf[PATH_MAX];
+ Progressbar_Data *pd;
+
+ pd = (Progressbar_Data *)calloc(1, sizeof(Progressbar_Data));
+
+ win = elm_win_util_standard_add("progressbar", "Progressbar");
+ evas_object_smart_callback_add(win, "delete,request",
+ _progressbar_destroy_cb, pd);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ pb = elm_progressbar_add(win);
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, pb);
+ //elm_progressbar_horizontal_set(pb, EINA_TRUE);
+ //elm_object_text_set(pb, "Progression %");
+ elm_progressbar_unit_format_function_set(pb, my_progressbar_format_cb,
+ (void (*)(char *)) free);
+ evas_object_show(pb);
+ pd->pb1 = pb;
+
+ pb = elm_progressbar_add(win);
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(pb, "Infinite bounce");
+ elm_progressbar_pulse_set(pb, EINA_TRUE);
+ elm_box_pack_end(bx, pb);
+ evas_object_show(pb);
+ pd->pb2 = pb;
+
+ ic1 = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic1, buf, NULL);
+ evas_object_size_hint_aspect_set(ic1, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ pb = elm_progressbar_add(win);
+ elm_object_text_set(pb, "Label");
+ elm_object_part_content_set(pb, "icon", ic1);
+ elm_progressbar_inverted_set(pb, EINA_TRUE);
+ elm_progressbar_unit_format_set(pb, "%1.1f units");
+ elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200));
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, pb);
+ evas_object_show(ic1);
+ evas_object_show(pb);
+ pd->pb3 = pb;
+
+ hbx = elm_box_add(win);
+ elm_box_horizontal_set(hbx, EINA_TRUE);
+ evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, hbx);
+ evas_object_show(hbx);
+
+ pb = elm_progressbar_add(win);
+ elm_progressbar_horizontal_set(pb, EINA_FALSE);
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(hbx, pb);
+ elm_object_text_set(pb, "percent");
+ evas_object_show(pb);
+ pd->pb4 = pb;
+
+ pb = elm_progressbar_add(win);
+ elm_progressbar_horizontal_set(pb, EINA_FALSE);
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+ elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(80));
+ elm_progressbar_pulse_set(pb, EINA_TRUE);
+ elm_progressbar_unit_format_set(pb, NULL);
+ elm_object_text_set(pb, "Infinite bounce");
+ elm_box_pack_end(hbx, pb);
+ evas_object_show(pb);
+ pd->pb5 = pb;
+
+ ic2 = elm_icon_add(win);
+ elm_image_file_set(ic2, buf, NULL);
+ evas_object_size_hint_aspect_set(ic2, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+
+ pb = elm_progressbar_add(win);
+ elm_progressbar_horizontal_set(pb, EINA_FALSE);
+ elm_object_text_set(pb, "Label");
+ elm_object_part_content_set(pb, "icon", ic2);
+ elm_progressbar_inverted_set(pb, EINA_TRUE);
+ elm_progressbar_unit_format_set(pb, "%1.2f%%");
+ elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200));
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(hbx, pb);
+ evas_object_show(ic2);
+ evas_object_show(pb);
+ pd->pb6 = pb;
+
+ pb = elm_progressbar_add(win);
+ elm_object_style_set(pb, "wheel");
+ elm_object_text_set(pb, "Style: wheel");
+ elm_progressbar_pulse_set(pb, EINA_TRUE);
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, pb);
+ evas_object_show(pb);
+ pd->pb7 = pb;
+
+ bt_bx = elm_box_add(win);
+ elm_box_horizontal_set(bt_bx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bt_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, bt_bx);
+ evas_object_show(bt_bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Start");
+ evas_object_smart_callback_add(bt, "clicked", my_progressbar_test_start, pd);
+ elm_box_pack_end(bt_bx, bt);
+ evas_object_show(bt);
+ pd->btn_start = bt;
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Stop");
+ elm_object_disabled_set(bt, EINA_TRUE);
+ evas_object_smart_callback_add(bt, "clicked", my_progressbar_test_stop, pd);
+ elm_box_pack_end(bt_bx, bt);
+ evas_object_show(bt);
+ pd->btn_stop = bt;
+
+ evas_object_show(win);
+}
+
+static Eina_Bool
+_set_progress_val(Evas_Object *pb, double inc_value, char *part_name)
+{
+ double progress;
+
+ progress = elm_progressbar_part_value_get(pb, part_name);
+
+ if (progress < 1.0)
+ progress += inc_value;
+ else
+ return EINA_TRUE;
+
+ elm_progressbar_part_value_set(pb, part_name, progress);
+
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+_progressbar2_timer_cb(void *data)
+{
+ Progressbar_Data *pd = data;
+ double progress;
+
+ if (!pd) return ECORE_CALLBACK_CANCEL;
+
+ progress = elm_progressbar_value_get (pd->pb1);
+
+ if (progress < 1.0)
+ {
+ progress += 0.0123;
+ elm_progressbar_part_value_set(pd->pb1, "elm.cur.progressbar", progress);
+ elm_progressbar_part_value_set(pd->pb2, "elm.cur.progressbar1", progress);
+ elm_progressbar_part_value_set(pd->pb3, "elm.cur.progressbar1", progress);
+ elm_progressbar_part_value_set(pd->pb4, "elm.cur.progressbar1", progress);
+ }
+
+ _set_progress_val(pd->pb2, 0.00723, "elm.cur.progressbar");
+ _set_progress_val(pd->pb3, 0.00523, "elm.cur.progressbar");
+
+ if (!_set_progress_val(pd->pb4, 0.00423, "elm.cur.progressbar"))
+ return ECORE_CALLBACK_RENEW;
+
+ pd->timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_pg2_start_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Progressbar_Data *pd = data;
+ if (!pd) return;
+
+ fprintf(stderr, "s1\n");
+
+ elm_object_disabled_set(pd->btn_start, EINA_TRUE);
+ elm_object_disabled_set(pd->btn_stop, EINA_FALSE);
+
+ if (!pd->timer)
+ pd->timer = ecore_timer_add(0.1, _progressbar2_timer_cb, pd);
+}
+
+static void
+_pg2_stop_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Progressbar_Data *pd = data;
+ if (!pd) return;
+
+ elm_object_disabled_set(pd->btn_start, EINA_FALSE);
+ elm_object_disabled_set(pd->btn_stop, EINA_TRUE);
+
+ if (pd->timer)
+ {
+ ecore_timer_del(pd->timer);
+ pd->timer = NULL;
+ }
+}
+
+void
+test_progressbar2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *pb, *bx, *bt, *bt_bx;
+ Progressbar_Data *pd;
+
+ pd = (Progressbar_Data *)calloc(1, sizeof(Progressbar_Data));
+
+ win = elm_win_util_standard_add("progressbar", "Progressbar2");
+ evas_object_smart_callback_add(win, "delete,request",
+ _progressbar_destroy_cb, pd);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ pb = elm_progressbar_add(win);
+ elm_object_text_set(pb, "Style: default");
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+ elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200));
+ elm_box_pack_end(bx, pb);
+ evas_object_show(pb);
+ pd->pb1 = pb;
+
+ pb = elm_progressbar_add(win);
+ elm_object_style_set(pb, "double");
+ elm_object_text_set(pb, "Style: double");
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+ elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200));
+ elm_box_pack_end(bx, pb);
+ evas_object_show(pb);
+ pd->pb2 = pb;
+
+ pb = elm_progressbar_add(win);
+ elm_object_style_set(pb, "double");
+ elm_object_text_set(pb, "Style: double 2");
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+ elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200));
+ elm_box_pack_end(bx, pb);
+ evas_object_show(pb);
+ pd->pb3 = pb;
+
+ pb = elm_progressbar_add(win);
+ elm_object_style_set(pb, "double");
+ elm_progressbar_horizontal_set(pb, EINA_FALSE);
+ elm_object_text_set(pb, "Style: Vertical");
+ evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+ elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200));
+ elm_box_pack_end(bx, pb);
+ evas_object_show(pb);
+ pd->pb4 = pb;
+
+ bt_bx = elm_box_add(win);
+ elm_box_horizontal_set(bt_bx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bt_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, bt_bx);
+ evas_object_show(bt_bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Start");
+ evas_object_smart_callback_add(bt, "clicked", _pg2_start_btn_clicked_cb, pd);
+ elm_box_pack_end(bt_bx, bt);
+ evas_object_show(bt);
+ pd->btn_start = bt;
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Stop");
+ elm_object_disabled_set(bt, EINA_TRUE);
+ evas_object_smart_callback_add(bt, "clicked", _pg2_stop_btn_clicked_cb, pd);
+ elm_box_pack_end(bt_bx, bt);
+ evas_object_show(bt);
+ pd->btn_stop = bt;
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_radio.c b/src/bin/elementary/test_radio.c
new file mode 100644
index 0000000000..99eadfafca
--- /dev/null
+++ b/src/bin/elementary/test_radio.c
@@ -0,0 +1,189 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_rd_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ printf("radio value : %d\n", elm_radio_value_get(obj));
+}
+
+static void
+_rdg_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ printf("radio group value : %d\n", elm_radio_value_get(obj));
+}
+
+static void
+_group_1_create(Evas_Object *bx)
+{
+ Evas_Object *bx2, *fr, *ic, *rd, *rdg;
+ char buf[PATH_MAX];
+
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Radio Group 1");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx2 = elm_box_add(fr);
+ elm_object_content_set(fr, bx2);
+ evas_object_show(bx2);
+
+ // radio 1
+ ic = elm_icon_add(bx2);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, 0);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(rd, "Icon sized to radio");
+ elm_object_part_content_set(rd, "icon", ic);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL);
+
+ // rdg radio group
+ rdg = rd;
+ evas_object_smart_callback_add(rdg, "changed", _rdg_changed_cb, NULL);
+
+ ic = elm_icon_add(bx2);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, 1);
+ elm_radio_group_add(rd, rdg);
+ elm_object_text_set(rd, "Icon no scale");
+ elm_object_part_content_set(rd, "icon", ic);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL);
+
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, 2);
+ elm_radio_group_add(rd, rdg); // add a radio button rd to a radio group rdg.
+ elm_object_text_set(rd, "Label Only");
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL);
+
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, 3);
+ elm_radio_group_add(rd, rdg); // add a radio button rd to a radio group rdg.
+ elm_object_text_set(rd, "Disabled");
+ elm_object_disabled_set(rd, EINA_TRUE);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL);
+
+ ic = elm_icon_add(bx2);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, 4);
+ elm_radio_group_add(rd, rdg); // add a radio button rd to a radio group rdg.
+ elm_object_part_content_set(rd, "icon", ic);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL);
+
+ ic = elm_icon_add(bx2);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, 5);
+ elm_radio_group_add(rd, rdg); // add a radio button rd to a radio group rdg.
+ elm_object_part_content_set(rd, "icon", ic);
+ elm_object_disabled_set(rd, EINA_TRUE);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL);
+
+ elm_radio_value_set(rdg, 2);
+}
+
+static void
+_group_2_create(Evas_Object *bx)
+{
+ Evas_Object *bx2, *fr, *rd, *rdg;
+
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Radio Group 2");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx2 = elm_box_add(fr);
+ elm_object_content_set(fr, bx2);
+ elm_box_align_set(bx2, 0.0, 0.0);
+ evas_object_show(bx2);
+
+ // radio 1
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, 1);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(rd, "Radio Group Test #1");
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+
+ // rdg radio group
+ rdg = rd;
+ // this works only for the first radio object
+ evas_object_smart_callback_add(rdg, "changed", _rdg_changed_cb, NULL);
+
+ // radio 2
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, 2);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(rd, "Radio Group Test #2");
+ elm_radio_group_add(rd, rdg);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+
+ // radio 2
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, 3);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(rd, "Radio Group Test #3");
+ elm_radio_group_add(rd, rdg);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+}
+
+void
+test_radio(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx;
+
+ win = elm_win_util_standard_add("radios", "Radios");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ _group_1_create(bx);
+ _group_2_create(bx);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_scaling.c b/src/bin/elementary/test_scaling.c
new file mode 100644
index 0000000000..84b20c6130
--- /dev/null
+++ b/src/bin/elementary/test_scaling.c
@@ -0,0 +1,119 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+void
+test_scaling(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt;
+
+ win = elm_win_util_standard_add("scaling", "Scaling");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Scale: 0.5");
+ elm_object_scale_set(bt, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Scale: 0.75");
+ elm_object_scale_set(bt, 0.75);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Scale: 1.0");
+ elm_object_scale_set(bt, 1.0);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Scale: 1.5");
+ elm_object_scale_set(bt, 1.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Scale: 2.0");
+ elm_object_scale_set(bt, 2.0);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Scale: 3.0");
+ elm_object_scale_set(bt, 3.0);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
+
+void
+test_scaling2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *bx, *fr, *lb;
+
+ win = elm_win_add(NULL, "scaling2", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Scaling 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Scale: 0.5");
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "Parent frame scale<br/>"
+ "is 0.5. Child should<br/>"
+ "inherit it.");
+ elm_object_content_set(fr, lb);
+ elm_object_scale_set(fr, 0.5);
+ evas_object_show(lb);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Scale: 1.0");
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "Parent frame scale<br/>"
+ "is 1.0. Child should<br/>"
+ "inherit it.");
+ elm_object_content_set(fr, lb);
+ evas_object_show(lb);
+ elm_object_scale_set(fr, 1.0);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ fr = elm_frame_add(win);
+ elm_object_text_set(fr, "Scale: 2.0");
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "Parent frame scale<br/>"
+ "is 2.0. Child should<br/>"
+ "inherit it.");
+ elm_object_content_set(fr, lb);
+ evas_object_show(lb);
+ elm_object_scale_set(fr, 2.0);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_scroller.c b/src/bin/elementary/test_scroller.c
new file mode 100644
index 0000000000..eb00f25946
--- /dev/null
+++ b/src/bin/elementary/test_scroller.c
@@ -0,0 +1,730 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_my_bt_go_300_300(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_scroller_region_bring_in((Evas_Object *)data, 300, 300, 318, 318);
+}
+
+static void
+_my_bt_go_900_300(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_scroller_region_bring_in((Evas_Object *)data, 900, 300, 318, 318);
+}
+
+static void
+_my_bt_go_300_900(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_scroller_region_bring_in((Evas_Object *)data, 300, 900, 318, 318);
+}
+
+static void
+_my_bt_go_900_900(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_scroller_region_bring_in((Evas_Object *)data, 900, 900, 318, 318);
+}
+
+static void
+_my_bt_prev_page(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *sc = (Evas_Object *)data;
+ int page_x = 0, page_y = 0;
+ elm_scroller_current_page_get(sc, &page_x, &page_y);
+ elm_scroller_page_bring_in(sc, --page_x, page_y);
+}
+
+static void
+_my_bt_next_page(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *sc = (Evas_Object *)data;
+ int page_x = 0, page_y = 0;
+ elm_scroller_current_page_get(sc, &page_x, &page_y);
+ elm_scroller_page_bring_in(sc, ++page_x, page_y);
+}
+
+static void
+_my_bt_freeze_toggle(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (elm_check_state_get(obj))
+ elm_object_scroll_freeze_push((Evas_Object *)data);
+ else
+ elm_object_scroll_freeze_pop((Evas_Object *)data);
+}
+
+static void
+_my_bt_hold_toggle(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (elm_check_state_get(obj))
+ elm_object_scroll_hold_push((Evas_Object *)data);
+ else
+ elm_object_scroll_hold_pop((Evas_Object *)data);
+}
+
+static void
+_my_bt_block_movements_x_axis(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Scroller_Movement_Block block;
+
+ block = elm_scroller_movement_block_get((Evas_Object *)data);
+
+ if (elm_check_state_get(obj))
+ {
+ elm_scroller_movement_block_set((Evas_Object *)data,
+ ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL |
+ block);
+ }
+ else if (block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL)
+ {
+ elm_scroller_movement_block_set((Evas_Object *)data,
+ ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL);
+ }
+ else
+ {
+ elm_scroller_movement_block_set((Evas_Object *)data,
+ ELM_SCROLLER_MOVEMENT_NO_BLOCK);
+ }
+}
+
+static void
+_my_bt_snap_to_pages(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ if (elm_check_state_get(obj))
+ {
+ elm_scroller_page_snap_set(data, EINA_TRUE, EINA_TRUE);
+ }
+ else
+ {
+ elm_scroller_page_snap_set(data, EINA_FALSE, EINA_FALSE);
+ }
+}
+
+static void
+_my_bt_block_movements_y_axis(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Scroller_Movement_Block block;
+
+ block = elm_scroller_movement_block_get((Evas_Object *)data);
+
+ if (elm_check_state_get(obj))
+ {
+ elm_scroller_movement_block_set((Evas_Object *)data,
+ ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL |
+ block);
+ }
+ else if (block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL)
+ {
+ elm_scroller_movement_block_set((Evas_Object *)data,
+ ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
+ }
+ else
+ {
+ elm_scroller_movement_block_set((Evas_Object *)data,
+ ELM_SCROLLER_MOVEMENT_NO_BLOCK);
+ }
+}
+
+static void
+_my_bt_loop_x_axis(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool loop_h, loop_v;
+ Evas_Object *scroller = (Evas_Object *)data;
+
+ elm_scroller_loop_get(scroller, &loop_h, &loop_v);
+ elm_scroller_loop_set(scroller, !loop_h, loop_v);
+}
+
+static void
+_my_bt_loop_y_axis(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Eina_Bool loop_h, loop_v;
+ Evas_Object *scroller = (Evas_Object *)data;
+
+ elm_scroller_loop_get(scroller, &loop_h, &loop_v);
+ elm_scroller_loop_set(scroller, loop_h, !loop_v);
+}
+
+static void
+_my_bt_wheel_disable_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *scroller = (Evas_Object *)data;
+
+ elm_scroller_wheel_disabled_set(scroller, elm_check_state_get(obj));
+}
+
+static void
+_page_change_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ int page_x = 0, page_y = 0;
+
+ elm_scroller_current_page_get(obj, &page_x, &page_y);
+
+ printf("Page changed to %d, %d\n", page_x, page_y);
+}
+
+static void
+_sc_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Coord x = 0, y = 0;
+ evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+ evas_object_move(data, x, y);
+}
+
+static void
+_sc_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Coord w = 0, h = 0;
+ evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+ evas_object_resize(data, w, h);
+}
+
+static void
+_size_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *sc = data;
+ int size = elm_spinner_value_get(obj);
+ elm_scroller_step_size_set(sc, ELM_SCALE_SIZE(size), ELM_SCALE_SIZE(size));
+}
+
+void
+test_scroller(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg2, *tb, *tb2, *sc, *bt, *ck1, *ck2, *bx, *bx2, *fr,
+ *ck3, *ck4, *ck5, *ck6, *ck7, *ck8;
+ int i, j, n;
+ char buf[PATH_MAX];
+ Evas_Coord x = 0, y = 0, w = 0, h = 0;
+ const char *img[9] =
+ {
+ "panel_01.jpg",
+ "plant_01.jpg",
+ "rock_01.jpg",
+ "rock_02.jpg",
+ "sky_01.jpg",
+ "sky_02.jpg",
+ "sky_03.jpg",
+ "sky_04.jpg",
+ "wood_01.jpg"
+ };
+
+ win = elm_win_util_standard_add("scroller", "Scroller");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0);
+ elm_object_text_set(fr, "Options");
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx2 = elm_box_add(win);
+ elm_object_content_set(fr, bx2);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_show(bx2);
+
+ ck1 = elm_check_add(win);
+ elm_object_text_set(ck1, "Freeze");
+ elm_box_pack_end(bx2, ck1);
+ evas_object_show(ck1);
+
+ ck2 = elm_check_add(win);
+ elm_object_text_set(ck2, "Hold");
+ elm_box_pack_end(bx2, ck2);
+ evas_object_show(ck2);
+
+ ck3 = elm_check_add(win);
+ elm_object_text_set(ck3, "Block movements in X axis");
+ elm_box_pack_end(bx2, ck3);
+ evas_object_show(ck3);
+
+ ck4 = elm_check_add(win);
+ elm_object_text_set(ck4, "Block movements in Y axis");
+ elm_box_pack_end(bx2, ck4);
+ evas_object_show(ck4);
+
+ ck5 = elm_check_add(win);
+ elm_object_text_set(ck5, "Snap to pages");
+ elm_box_pack_end(bx2, ck5);
+ evas_object_show(ck5);
+
+ ck6 = elm_check_add(win);
+ elm_object_text_set(ck6, "Loop in X axis");
+ elm_box_pack_end(bx2, ck6);
+ evas_object_show(ck6);
+
+ ck7 = elm_check_add(win);
+ elm_object_text_set(ck7, "Loop in Y axis");
+ elm_box_pack_end(bx2, ck7);
+ evas_object_show(ck7);
+
+ ck8 = elm_check_add(win);
+ elm_object_text_set(ck8, "Wheel Disable");
+ elm_box_pack_end(bx2, ck8);
+ evas_object_show(ck8);
+
+ sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, sc);
+
+ tb = elm_table_add(win);
+
+ n = 0;
+ for (j = 0; j < 12; j++)
+ {
+ for (i = 0; i < 12; i++)
+ {
+ bg2 = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/%s",
+ elm_app_data_dir_get(), img[n]);
+ n++;
+ if (n >= 9) n = 0;
+ elm_bg_file_set(bg2, buf, NULL);
+ evas_object_size_hint_weight_set(bg2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_min_set(bg2, 318, 318);
+ elm_table_pack(tb, bg2, i, j, 1, 1);
+ evas_object_show(bg2);
+ }
+ }
+
+ elm_object_content_set(sc, tb);
+ evas_object_show(tb);
+
+ elm_scroller_page_size_set(sc, 318, 318);
+ evas_object_show(sc);
+
+ evas_object_smart_callback_add
+ (sc, "scroll,page,changed", _page_change_cb, sc);
+
+ evas_object_smart_callback_add(ck1, "changed", _my_bt_freeze_toggle, tb);
+ evas_object_smart_callback_add(ck2, "changed", _my_bt_hold_toggle, tb);
+ evas_object_smart_callback_add(ck3, "changed", _my_bt_block_movements_x_axis,
+ sc);
+ evas_object_smart_callback_add(ck4, "changed", _my_bt_block_movements_y_axis,
+ sc);
+ evas_object_smart_callback_add(ck5, "changed", _my_bt_snap_to_pages, sc);
+ evas_object_smart_callback_add(ck6, "changed", _my_bt_loop_x_axis, sc);
+ evas_object_smart_callback_add(ck7, "changed", _my_bt_loop_y_axis, sc);
+ evas_object_smart_callback_add(ck8, "changed", _my_bt_wheel_disable_cb, sc);
+
+ bt = elm_spinner_add(win);
+ elm_spinner_min_max_set(bt, 0, 500);
+ elm_scroller_step_size_get(sc, &x, &y);
+ elm_spinner_value_set(bt, x);
+ elm_spinner_editable_set(bt, EINA_TRUE);
+ elm_spinner_label_format_set(bt, "Step size: %.0f");
+ evas_object_smart_callback_add(bt, "changed", _size_changed, sc);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ tb2 = elm_table_add(win);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "to 300 300");
+ evas_object_smart_callback_add(bt, "clicked", _my_bt_go_300_300, sc);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.1, 0.1);
+ elm_table_pack(tb2, bt, 0, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "to 900 300");
+ evas_object_smart_callback_add(bt, "clicked", _my_bt_go_900_300, sc);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.1);
+ elm_table_pack(tb2, bt, 2, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "to 300 900");
+ evas_object_smart_callback_add(bt, "clicked", _my_bt_go_300_900, sc);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.1, 0.9);
+ elm_table_pack(tb2, bt, 0, 2, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "to 900 900");
+ evas_object_smart_callback_add(bt, "clicked", _my_bt_go_900_900, sc);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.9);
+ elm_table_pack(tb2, bt, 2, 2, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "prev page");
+ evas_object_smart_callback_add(bt, "clicked", _my_bt_prev_page, sc);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.1, 0.5);
+ elm_table_pack(tb2, bt, 0, 1, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "next page");
+ evas_object_smart_callback_add(bt, "clicked", _my_bt_next_page, sc);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.9, 0.5);
+ elm_table_pack(tb2, bt, 2, 1, 1, 1);
+ evas_object_show(bt);
+
+ evas_object_event_callback_add(sc, EVAS_CALLBACK_MOVE, _sc_move_cb, tb2);
+ evas_object_event_callback_add(sc, EVAS_CALLBACK_RESIZE, _sc_resize_cb, tb2);
+ evas_object_geometry_get(sc, &x, &y, &w, &h);
+ evas_object_move(tb2, x, y);
+ evas_object_resize(tb2, w, h);
+ evas_object_show(tb2);
+
+ evas_object_resize(win, 320, 420);
+ evas_object_show(win);
+}
+
+static void
+_click_through(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ printf("click went through on %p\n", obj);
+}
+
+void
+test_scroller2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *bx, *bx2, *sc, *tb, *tb2, *rc;
+ int i, j;
+
+ win = elm_win_util_standard_add("scroller2", "Scroller 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.0);
+
+ /* { */
+ for (i = 0; i < 3; i++)
+ {
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Vertical");
+ evas_object_smart_callback_add(bt, "clicked", _click_through, NULL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ }
+ /* } */
+
+ /* { */
+ sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, 0.5);
+ elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE);
+ elm_scroller_content_min_limit(sc, 0, 1);
+ elm_box_pack_end(bx, sc);
+ evas_object_show(sc);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+
+ for (i = 0; i < 10; i++)
+ {
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "... Horizontal scrolling ...");
+ evas_object_smart_callback_add(bt, "clicked", _click_through, NULL);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+ }
+
+ elm_object_content_set(sc, bx2);
+ evas_object_show(bx2);
+ /* } */
+
+ /* { */
+ for (i = 0; i < 3; i++)
+ {
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Vertical");
+ evas_object_smart_callback_add(bt, "clicked", _click_through, NULL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ }
+ /* } */
+
+ /* { */
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ rc = evas_object_rectangle_add(evas_object_evas_get(win));
+ evas_object_size_hint_min_set(rc, 200, 120);
+ elm_table_pack(tb, rc, 0, 0, 1, 1);
+
+ sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, sc, 0, 0, 1, 1);
+ evas_object_show(sc);
+
+ tb2 = elm_table_add(win);
+
+ for (j = 0; j < 16; j++)
+ {
+ for (i = 0; i < 16; i++)
+ {
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Both");
+ evas_object_smart_callback_add(bt, "clicked", _click_through, NULL);
+ elm_table_pack(tb2, bt, i, j, 1, 1);
+ evas_object_show(bt);
+ }
+ }
+
+ elm_object_content_set(sc, tb2);
+ evas_object_show(tb2);
+ /* } */
+
+ for (i = 0; i < 24; i++)
+ {
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Vertical");
+ evas_object_smart_callback_add(bt, "clicked", _click_through, NULL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ }
+
+ sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
+ elm_win_resize_object_add(win, sc);
+ elm_object_content_set(sc, bx);
+ evas_object_show(bx);
+ evas_object_show(sc);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+static Ecore_Timer *_timer = NULL;
+static int _append = 0;
+static int _count = 0;
+
+static void
+_del_item(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ evas_object_del(obj);
+}
+
+static void
+_append_item(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bx = data, *bt;
+ char buf[PATH_MAX];
+
+ bt = elm_button_add(bx);
+ snprintf(buf, sizeof(buf), "Item %d", ++_count);
+ elm_object_text_set(bt, buf);
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", _del_item, NULL);
+ evas_object_show(bt);
+}
+
+static void
+_prepend_item(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *bx = data, *bt;
+ char buf[PATH_MAX];
+
+ bt = elm_button_add(bx);
+ snprintf(buf, sizeof(buf), "Item %d", ++_count);
+ elm_object_text_set(bt, buf);
+ elm_box_pack_start(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", _del_item, NULL);
+ evas_object_show(bt);
+}
+
+static Eina_Bool
+_append_cb(void *data)
+{
+ Evas_Object *bx = data, *bt;
+ char buf[PATH_MAX];
+
+ bt = elm_button_add(bx);
+ snprintf(buf, sizeof(buf), "Item %d", ++_count);
+ elm_object_text_set(bt, buf);
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", _del_item, NULL);
+ evas_object_show(bt);
+
+ _append--;
+
+ if (_append <= 0)
+ {
+ _timer = NULL;
+ return ECORE_CALLBACK_CANCEL;
+ }
+ else
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_append_items(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ _append += 10;
+ _timer = ecore_timer_add(0.3, _append_cb, data);
+}
+
+static void
+_win_del_cb(void *data EINA_UNUSED,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_timer_del(_timer);
+ _timer = NULL;
+}
+
+void
+test_scroller3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *bt2, *bt3, *bx, *bx2, *bx3, *bx4, *sc;
+ _count = 0;
+
+ win = elm_win_util_standard_add("scroller3", "Scroller 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _win_del_cb, NULL);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bx2 = elm_box_add(bx);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.1);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bt = elm_button_add(bx2);
+ elm_object_text_set(bt, "Append Item");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt2 = elm_button_add(bx2);
+ elm_object_text_set(bt2, "Prepend Item");
+ elm_box_pack_end(bx2, bt2);
+ evas_object_show(bt2);
+
+ bt3 = elm_button_add(bx2);
+ elm_object_text_set(bt3, "Append 10 Items in 3s");
+ elm_box_pack_end(bx2, bt3);
+ evas_object_show(bt3);
+
+ bx3 = elm_box_add(bx);
+ evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.9);
+ elm_box_pack_end(bx, bx3);
+ evas_object_show(bx3);
+
+ sc = elm_scroller_add(bx3);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx3, sc);
+ evas_object_show(sc);
+
+ bx4 = elm_box_add(sc);
+ elm_box_padding_set(bx4, 0, 5);
+ evas_object_size_hint_weight_set(bx4, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(sc, bx4);
+ evas_object_show(bx4);
+
+ evas_object_smart_callback_add(bt, "clicked", _append_item, bx4);
+ evas_object_smart_callback_add(bt2, "clicked", _prepend_item, bx4);
+ evas_object_smart_callback_add(bt3, "clicked", _append_items, bx4);
+
+ evas_object_resize(win, 500, 500);
+ evas_object_show(win);
+}
+
+void
+test_scroller4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *sc, *bx, *ly, *sc2, *rect, *rect2;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("scroller3", "Scroller 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ sc = elm_scroller_add(win);
+ elm_scroller_loop_set(sc, EINA_TRUE, EINA_FALSE);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_scroller_page_relative_set(sc, 1.0, 0.0);
+ elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_scroller_page_scroll_limit_set(sc, 1, 0);
+ elm_win_resize_object_add(win, sc);
+ evas_object_show(sc);
+
+ bx = elm_box_add(sc);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ elm_object_content_set(sc, bx);
+ evas_object_show(bx);
+
+ ly = elm_layout_add(bx);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "page_layout");
+ elm_object_part_text_set(ly, "text", "Page1");
+ elm_box_pack_end(bx, ly);
+ evas_object_show(ly);
+
+ sc2 = elm_scroller_add(ly);
+ elm_object_part_content_set(ly, "page", sc2);
+ evas_object_show(sc2);
+
+ rect2 = evas_object_rectangle_add(evas_object_evas_get(sc2));
+ evas_object_color_set(rect2, 50, 0, 0, 50);
+ evas_object_size_hint_min_set(rect2, 0, 2000);
+ elm_object_content_set(sc2, rect2);
+ evas_object_show(rect2);
+
+ ly = elm_layout_add(bx);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "page_layout");
+ rect = evas_object_rectangle_add(evas_object_evas_get(ly));
+ evas_object_color_set(rect, 0, 50, 0, 50);
+ elm_object_part_content_set(ly, "page", rect);
+ elm_object_part_text_set(ly, "text", "Page2");
+ elm_box_pack_end(bx, ly);
+ evas_object_show(ly);
+
+ ly = elm_layout_add(bx);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(ly, buf, "page_layout");
+ rect = evas_object_rectangle_add(evas_object_evas_get(ly));
+ evas_object_color_set(rect, 0, 0, 50, 50);
+ elm_object_part_content_set(ly, "page", rect);
+ elm_object_part_text_set(ly, "text", "Page3");
+ elm_box_pack_end(bx, ly);
+ evas_object_show(ly);
+
+ evas_object_resize(win, 400, 550);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_segment_control.c b/src/bin/elementary/test_segment_control.c
new file mode 100644
index 0000000000..9f5d674013
--- /dev/null
+++ b/src/bin/elementary/test_segment_control.c
@@ -0,0 +1,156 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+changed_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event)
+{
+ Elm_Object_Item *it = event;
+ printf("Segment Item (%p) %s\n", it, elm_object_item_text_get(it));
+}
+
+void
+test_segment_control(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *sc, *ic;
+ Elm_Object_Item *seg_it;
+ unsigned int i;
+ char buf[PATH_MAX];
+
+ struct exp_mode {
+ struct {
+ double w, h;
+ } weight;
+ struct {
+ double x, y;
+ } align;
+ } exp_modes[2] = {
+ {{EVAS_HINT_EXPAND, 0.0}, {EVAS_HINT_FILL, EVAS_HINT_FILL}},
+ {{0.0, 0.0}, {0.5, 0.5}}
+ };
+
+ win = elm_win_util_standard_add("segmentcontrol", "Segment Control");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ //box
+ bx = elm_box_add(win);
+ elm_box_padding_set(bx, 0, 5);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png",
+ elm_app_data_dir_get());
+
+ for (i = 0; i < EINA_C_ARRAY_LENGTH(exp_modes); i++)
+ {
+ const struct exp_mode *em = exp_modes + i;
+
+ //segment control
+ sc = elm_segment_control_add(bx);
+ evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h);
+ evas_object_size_hint_align_set(sc, em->align.x, em->align.y);
+ elm_segment_control_item_add(sc, NULL, "Text Only");
+
+ //icon
+ ic = elm_icon_add(sc);
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
+
+ seg_it = elm_segment_control_item_add(sc, ic, NULL);
+ elm_segment_control_item_selected_set(seg_it, EINA_TRUE);
+
+ //icon
+ ic = elm_icon_add(sc);
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1,
+ 1);
+ elm_segment_control_item_add(sc, ic, "Text + Icon");
+ evas_object_smart_callback_add(sc, "changed", changed_cb, NULL);
+ evas_object_show(sc);
+ elm_box_pack_end(bx, sc);
+
+ //segment control 2
+ sc = elm_segment_control_add(bx);
+ evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h);
+ evas_object_size_hint_align_set(sc, em->align.x, em->align.y);
+ elm_segment_control_item_add(sc, NULL, "Segment Control Item");
+ seg_it = elm_segment_control_item_add(sc, NULL, "Segment Control Item");
+ elm_segment_control_item_selected_set(seg_it, EINA_TRUE);
+ elm_segment_control_item_add(sc, NULL, "Segment Control Item");
+ elm_segment_control_item_add(sc, NULL, "Segment Control Item");
+ evas_object_smart_callback_add(sc, "changed", changed_cb, NULL);
+ evas_object_show(sc);
+ elm_box_pack_end(bx, sc);
+
+ //segment control 3 (icon only)
+ sc = elm_segment_control_add(bx);
+ evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h);
+ evas_object_size_hint_align_set(sc, em->align.x, em->align.y);
+
+ //icon
+ ic = elm_icon_add(sc);
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
+ elm_segment_control_item_add(sc, ic, NULL);
+
+ //icon
+ ic = elm_icon_add(sc);
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
+ seg_it = elm_segment_control_item_add(sc, ic, NULL);
+ elm_segment_control_item_selected_set(seg_it, EINA_TRUE);
+
+ //icon
+ ic = elm_icon_add(sc);
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
+ elm_segment_control_item_add(sc, ic, NULL);
+
+ evas_object_smart_callback_add(sc, "changed", changed_cb, NULL);
+ evas_object_show(sc);
+ elm_box_pack_end(bx, sc);
+
+ //segment control 4 (text only disabled)
+ sc = elm_segment_control_add(bx);
+ evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h);
+ evas_object_size_hint_align_set(sc, em->align.x, em->align.y);
+ elm_segment_control_item_add(sc, NULL, "Disabled");
+
+ //icon
+ ic = elm_icon_add(sc);
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
+
+ seg_it = elm_segment_control_item_add(sc, ic, "Disabled");
+ elm_segment_control_item_selected_set(seg_it, EINA_TRUE);
+ elm_segment_control_item_add(sc, NULL, "Disabled");
+ elm_object_disabled_set(sc, EINA_TRUE);
+ evas_object_smart_callback_add(sc, "changed", changed_cb, NULL);
+ evas_object_show(sc);
+ elm_box_pack_end(bx, sc);
+
+ //segment control 5 (single)
+ sc = elm_segment_control_add(bx);
+ evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h);
+ evas_object_size_hint_align_set(sc, em->align.x, em->align.y);
+ elm_segment_control_item_add(sc, NULL, "Single");
+ evas_object_smart_callback_add(sc, "changed", changed_cb, NULL);
+ evas_object_show(sc);
+ elm_box_pack_end(bx, sc);
+
+ //segment control 6 (single disabled)
+ sc = elm_segment_control_add(bx);
+ evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h);
+ evas_object_size_hint_align_set(sc, em->align.x, em->align.y);
+ elm_segment_control_item_add(sc, NULL, "Single Disabled");
+ elm_object_disabled_set(sc, EINA_TRUE);
+ evas_object_smart_callback_add(sc, "changed", changed_cb, NULL);
+ evas_object_show(sc);
+ elm_box_pack_end(bx, sc);
+ }
+
+ evas_object_resize(win, 400, 300);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_separator.c b/src/bin/elementary/test_separator.c
new file mode 100644
index 0000000000..00d9985c42
--- /dev/null
+++ b/src/bin/elementary/test_separator.c
@@ -0,0 +1,67 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+void
+test_separator(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx0, *bx, *bt, *sp;
+
+ win = elm_win_util_standard_add("separators", "Separators");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx0 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_horizontal_set(bx0, EINA_TRUE);
+ elm_win_resize_object_add(win, bx0);
+ evas_object_show(bx0);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx0, bx);
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Left upper corner");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE); // by default, separator is vertical, we must set it horizontal
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Left lower corner");
+ elm_object_disabled_set(bt, EINA_TRUE);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ sp = elm_separator_add(win); // now we need vertical separator
+ elm_box_pack_end(bx0, sp);
+ evas_object_show(sp);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx0, bx);
+ evas_object_show(bx);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Right upper corner");
+ elm_object_disabled_set(bt, EINA_TRUE);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ sp = elm_separator_add(win);
+ elm_separator_horizontal_set(sp, EINA_TRUE);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Right lower corner");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_slider.c b/src/bin/elementary/test_slider.c
new file mode 100644
index 0000000000..c613da6266
--- /dev/null
+++ b/src/bin/elementary/test_slider.c
@@ -0,0 +1,307 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+void
+_delay_change_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ printf("delay,changed! slider value : %d\n", (int)round(elm_slider_value_get(obj)));
+}
+
+void
+_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ elm_slider_value_set(data, val);
+}
+
+void
+_change_print_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ double val = elm_slider_value_get(obj);
+ printf("change to %3.3f\n", val);
+}
+
+void
+_bt_0(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_slider_value_set(data, 0.0);
+}
+
+void
+_bt_1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_slider_value_set(data, 1.0);
+}
+
+void
+_bt_p1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_slider_value_set(data, elm_slider_value_get(data) + 0.1);
+}
+
+void
+_bt_m1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_slider_value_set(data, elm_slider_value_get(data) - 0.1);
+}
+
+static double
+_step_size_calculate(double min, double max)
+{
+ double step = 0.0;
+ int steps = 0;
+
+ steps = max - min;
+ if (steps) step = (1.0 / steps);
+ return step;
+}
+
+void
+test_slider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *fr, *bx, *sl, *ic, *sl1, *bx2, *bt;
+ double step;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("slider", "Slider");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ fr = elm_frame_add(win);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, fr);
+ elm_object_style_set(fr, "pad_large");
+ evas_object_show(fr);
+
+ bx = elm_box_add(fr);
+ elm_object_content_set(fr, bx);
+ evas_object_show(bx);
+
+ // disabled horizontal slider
+ ic = elm_icon_add(bx);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_show(ic);
+
+ sl = elm_slider_add(bx);
+ elm_object_text_set(sl, "Disabled");
+ elm_object_part_content_set(sl, "icon", ic);
+ elm_slider_unit_format_set(sl, "%1.1f units");
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_min_max_set(sl, 50, 150);
+ elm_slider_value_set(sl, 80);
+ elm_object_disabled_set(sl, EINA_TRUE);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ sl = elm_slider_add(bx);
+ elm_slider_unit_format_set(sl, "%1.0f units");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_min_max_set(sl, 0, 9);
+ elm_object_text_set(sl, "Manual step");
+ step = _step_size_calculate(0, 9);
+ elm_slider_step_set(sl, step);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ sl = elm_slider_add(bx);
+ elm_slider_unit_format_set(sl, "%1.0f units");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_min_max_set(sl, 0, 100);
+ elm_object_text_set(sl, "Show Indicator on Focus: ");
+ step = _step_size_calculate(0, 9);
+ elm_slider_step_set(sl, step);
+ elm_slider_indicator_show_on_focus_set(sl, EINA_TRUE);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ // normal horizontal slider
+ ic = elm_icon_add(bx);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ sl1 = sl = elm_slider_add(bx);
+ elm_object_text_set(sl, "Horizontal");
+ elm_object_part_content_set(sl, "icon", ic);
+ elm_slider_unit_format_set(sl, "%1.1f units");
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_span_size_set(sl, 120);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(ic);
+ evas_object_show(sl);
+
+ // horizontally inverted slider
+ ic = elm_icon_add(bx);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_show(ic);
+
+ sl = elm_slider_add(bx);
+ elm_object_text_set(sl, "Horizontal inverted");
+ elm_object_part_content_set(sl, "end", ic);
+ elm_slider_unit_format_set(sl, "%3.0f units");
+ elm_slider_span_size_set(sl, 80);
+ elm_slider_indicator_format_set(sl, "%3.0f");
+ elm_slider_min_max_set(sl, 50, 150);
+ elm_slider_value_set(sl, 80);
+ elm_slider_inverted_set(sl, EINA_TRUE);
+ evas_object_size_hint_align_set(sl, 0.5, 0.5);
+ evas_object_size_hint_weight_set(sl, 0.0, 0.0);
+ evas_object_smart_callback_add(sl, "delay,changed", _delay_change_cb, NULL);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ // disabled horizontally inverted slider
+ ic = elm_icon_add(bx);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_show(ic);
+
+ sl = elm_slider_add(bx);
+ elm_object_text_set(sl, "Disabled inverted");
+ elm_object_part_content_set(sl, "end", ic);
+ elm_slider_span_size_set(sl, 80);
+ elm_slider_indicator_format_set(sl, "%3.0f");
+ elm_slider_min_max_set(sl, 50, 150);
+ elm_slider_value_set(sl, 80);
+ elm_slider_inverted_set(sl, EINA_TRUE);
+ elm_object_disabled_set(sl, EINA_TRUE);
+ evas_object_size_hint_align_set(sl, 0.5, 0.5);
+ evas_object_size_hint_weight_set(sl, 0.0, 0.0);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ // scale doubled slider
+ sl = elm_slider_add(bx);
+ elm_slider_indicator_show_set(sl, EINA_FALSE);
+ elm_object_text_set(sl, "Scale doubled");
+ elm_slider_unit_format_set(sl, "%3.0f units");
+ elm_slider_span_size_set(sl, 40);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ elm_slider_indicator_format_set(sl, "%3.0f");
+ elm_slider_min_max_set(sl, 50, 150);
+ elm_slider_value_set(sl, 80);
+ elm_slider_inverted_set(sl, EINA_TRUE);
+ elm_object_scale_set(sl, 2.0);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ // horizontal box
+ bx2 = elm_box_add(bx);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx2, 0.5, EVAS_HINT_FILL);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ // vertical inverted slider
+ ic = elm_icon_add(bx2);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+ evas_object_show(ic);
+
+ sl = elm_slider_add(bx2);
+ elm_object_part_content_set(sl, "icon", ic);
+ elm_object_text_set(sl, "Vertical inverted");
+ elm_slider_inverted_set(sl, EINA_TRUE);
+ elm_slider_unit_format_set(sl, "%1.1f units");
+ elm_slider_span_size_set(sl, 60);
+ evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_value_set(sl, 0.2);
+ elm_object_scale_set(sl, 1.0);
+ elm_slider_horizontal_set(sl, EINA_FALSE);
+ elm_box_pack_end(bx2, sl);
+ evas_object_show(sl);
+
+ evas_object_smart_callback_add(sl1, "changed", _change_cb, sl);
+
+ // disabled vertical slider
+ ic = elm_icon_add(bx2);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+ evas_object_show(ic);
+
+ sl = elm_slider_add(bx2);
+ elm_object_part_content_set(sl, "icon", ic);
+ elm_object_text_set(sl, "Disabled vertical");
+ elm_slider_inverted_set(sl, EINA_TRUE);
+ elm_slider_unit_format_set(sl, "%1.1f units");
+ elm_slider_span_size_set(sl, 100);
+ evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
+ elm_slider_indicator_format_set(sl, "%1.1f");
+ elm_slider_value_set(sl, 0.2);
+ elm_object_scale_set(sl, 1.0);
+ elm_slider_horizontal_set(sl, EINA_FALSE);
+ elm_object_disabled_set(sl, EINA_TRUE);
+ elm_box_pack_end(bx2, sl);
+ evas_object_show(sl);
+
+ // normal vertical slider
+ sl = elm_slider_add(bx2);
+ elm_object_text_set(sl, "Vertical");
+ elm_slider_unit_format_set(sl, "%1.1f units");
+ elm_slider_span_size_set(sl, 60);
+ evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND);
+ elm_slider_indicator_show_set(sl, EINA_FALSE);
+ elm_slider_value_set(sl, 0.2);
+ elm_object_scale_set(sl, 1.0);
+ elm_slider_horizontal_set(sl, EINA_FALSE);
+ evas_object_smart_callback_add(sl, "changed", _change_print_cb, sl);
+ elm_box_pack_end(bx2, sl);
+ evas_object_show(sl);
+
+ // box for bottom buttons
+ bx2 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "0");
+ evas_object_smart_callback_add(bt, "clicked", _bt_0, sl);
+ evas_object_show(bt);
+ elm_box_pack_end(bx2, bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "1");
+ evas_object_smart_callback_add(bt, "clicked", _bt_1, sl);
+ evas_object_show(bt);
+ elm_box_pack_end(bx2, bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "+0.1");
+ evas_object_smart_callback_add(bt, "clicked", _bt_p1, sl);
+ evas_object_show(bt);
+ elm_box_pack_end(bx2, bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "-0.1");
+ evas_object_smart_callback_add(bt, "clicked", _bt_m1, sl);
+ evas_object_show(bt);
+ elm_box_pack_end(bx2, bt);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_slideshow.c b/src/bin/elementary/test_slideshow.c
new file mode 100644
index 0000000000..449d0164cc
--- /dev/null
+++ b/src/bin/elementary/test_slideshow.c
@@ -0,0 +1,236 @@
+#include "elementary_config.h"
+#include <Elementary.h>
+
+static Evas_Object *slideshow, *bt_start, *bt_stop;
+static Elm_Slideshow_Item_Class itc;
+
+static void
+_notify_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_show(data);
+}
+
+static void
+_next(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_slideshow_next(data);
+}
+
+static void
+_previous(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_slideshow_previous(data);
+}
+
+static void
+_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_notify_timeout_set(data, 0.0);
+ evas_object_show(data);
+}
+
+static void
+_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_notify_timeout_set(data, 3.0);
+}
+
+static void
+_hv_select(void *data, Evas_Object *obj, void *event_info)
+{
+ elm_slideshow_transition_set(slideshow, data);
+ elm_object_text_set(obj, elm_object_item_text_get(event_info));
+}
+
+static void
+_layout_select(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_slideshow_layout_set(slideshow, data);
+ elm_object_text_set(obj, data);
+}
+
+static void
+_start(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_slideshow_timeout_set(slideshow, elm_spinner_value_get(data));
+
+ elm_object_disabled_set(bt_start, EINA_TRUE);
+ elm_object_disabled_set(bt_stop, EINA_FALSE);
+}
+
+static void
+_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_slideshow_timeout_set(slideshow, 0.0);
+ elm_object_disabled_set(bt_start, EINA_FALSE);
+ elm_object_disabled_set(bt_stop, EINA_TRUE);
+}
+
+static void
+_spin(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (elm_slideshow_timeout_get(slideshow) > 0)
+ elm_slideshow_timeout_set(slideshow, elm_spinner_value_get(data));
+}
+
+static Evas_Object *
+_get(void *data, Evas_Object *obj)
+{
+ //Evas_Object *photo = elm_photocam_add(obj);
+ //elm_photocam_file_set(photo, data);
+ //elm_photocam_zoom_mode_set(photo, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT);
+
+ printf("_get (item data: '%s')\n", (char*)data);
+ Evas_Object *photo = elm_image_add(obj);
+ elm_image_file_set(photo, data, NULL);
+ elm_image_fill_outside_set(photo, EINA_FALSE);
+
+ return photo;
+}
+
+static void
+_del(void *data, Evas_Object *obj EINA_UNUSED)
+{
+ printf("_del (item data: '%s')\n", (char*)data);
+}
+
+
+static void
+_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *slide_it = (Elm_Object_Item *) event_info;
+ printf("CHANGED (item data: '%s')\n",
+ (char*)elm_object_item_data_get(slide_it));
+}
+
+static void
+_transition_end_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Elm_Object_Item *slide_it = (Elm_Object_Item *) event_info;
+ printf("TRANSITION,END (item data: '%s')\n",
+ (char*)elm_object_item_data_get(slide_it));
+ if (data == slide_it)
+ printf("Reaches to End of slides\n");
+}
+
+void
+test_slideshow(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *notify, *bx, *bt, *hv, *spin;
+ const Eina_List *l;
+ const char *transition, *layout;
+ Elm_Object_Item *slide_last_it = NULL;
+ unsigned long i;
+
+ const char *imgs[] = {
+ "logo.png",
+ "rock_01.jpg",
+ "rock_02.jpg",
+ "sky_01.jpg",
+ "sky_04.jpg",
+ "wood_01.jpg",
+ "mystrale.jpg",
+ "mystrale_2.jpg",
+ NULL
+ };
+
+
+ win = elm_win_util_standard_add("slideshow", "Slideshow");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ slideshow = elm_slideshow_add(win);
+ elm_slideshow_loop_set(slideshow, EINA_TRUE);
+ evas_object_size_hint_weight_set(slideshow, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_smart_callback_add(slideshow, "changed", _changed_cb, NULL);
+ elm_win_resize_object_add(win, slideshow);
+ evas_object_show(slideshow);
+
+ itc.func.get = _get;
+ itc.func.del = _del;
+
+ for (i = 0; imgs[i]; i++)
+ {
+ const char *img = eina_stringshare_printf("%s/images/%s", elm_app_data_dir_get(), imgs[i]);
+ slide_last_it = elm_slideshow_item_add(slideshow, &itc, img);
+ }
+
+ evas_object_smart_callback_add(slideshow, "transition,end",
+ _transition_end_cb, slide_last_it);
+
+ notify = elm_notify_add(win);
+ elm_notify_align_set(notify, 0.5, 1.0);
+ evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, notify);
+ elm_notify_timeout_set(notify, 3.0);
+
+ bx = elm_box_add(win);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ elm_object_content_set(notify, bx);
+ evas_object_show(bx);
+
+ evas_object_event_callback_add(bx, EVAS_CALLBACK_MOUSE_IN, _mouse_in,
+ notify);
+ evas_object_event_callback_add(bx, EVAS_CALLBACK_MOUSE_OUT, _mouse_out,
+ notify);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Previous");
+ evas_object_smart_callback_add(bt, "clicked", _previous, slideshow);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Next");
+ evas_object_smart_callback_add(bt, "clicked", _next, slideshow);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ hv = elm_hoversel_add(win);
+ elm_box_pack_end(bx, hv);
+ elm_hoversel_hover_parent_set(hv, win);
+ EINA_LIST_FOREACH(elm_slideshow_transitions_get(slideshow), l, transition)
+ elm_hoversel_item_add(hv, transition, NULL, 0, _hv_select, transition);
+ elm_hoversel_item_add(hv, "None", NULL, 0, _hv_select, NULL);
+ elm_object_text_set(hv, eina_list_data_get(elm_slideshow_transitions_get(slideshow)));
+ evas_object_show(hv);
+
+ hv = elm_hoversel_add(win);
+ elm_box_pack_end(bx, hv);
+ elm_hoversel_hover_parent_set(hv, win);
+ EINA_LIST_FOREACH(elm_slideshow_layouts_get(slideshow), l, layout)
+ elm_hoversel_item_add(hv, layout, NULL, 0, _layout_select, layout);
+ elm_object_text_set(hv, elm_slideshow_layout_get(slideshow));
+ evas_object_show(hv);
+
+ spin = elm_spinner_add(win);
+ elm_spinner_label_format_set(spin, "%2.0f secs.");
+ evas_object_smart_callback_add(spin, "changed", _spin, spin);
+ elm_spinner_step_set(spin, 1);
+ elm_spinner_min_max_set(spin, 1, 30);
+ elm_spinner_value_set(spin, 3);
+ elm_box_pack_end(bx, spin);
+ evas_object_show(spin);
+
+ bt = elm_button_add(win);
+ bt_start = bt;
+ elm_object_text_set(bt, "Start");
+ evas_object_smart_callback_add(bt, "clicked", _start, spin);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ bt_stop = bt;
+ elm_object_text_set(bt, "Stop");
+ evas_object_smart_callback_add(bt, "clicked", _stop, spin);
+ elm_box_pack_end(bx, bt);
+ elm_object_disabled_set(bt, EINA_TRUE);
+ evas_object_show(bt);
+
+ evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_UP,
+ _notify_show, notify);
+ evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_MOVE,
+ _notify_show, notify);
+
+ evas_object_resize(win, 500, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_spinner.c b/src/bin/elementary/test_spinner.c
new file mode 100644
index 0000000000..41eb63f48e
--- /dev/null
+++ b/src/bin/elementary/test_spinner.c
@@ -0,0 +1,113 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_spinner_drag_start_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event EINA_UNUSED)
+{
+ printf("spinner drag started\n");
+}
+
+static void
+_spinner_drag_stop_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event EINA_UNUSED)
+{
+ printf("spinner drag stopped\n");
+}
+
+void
+test_spinner(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *sp;
+
+ win = elm_win_util_standard_add("spinner", "Spinner");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ sp = elm_spinner_add(win);
+ elm_spinner_editable_set(sp, EINA_TRUE);
+ elm_spinner_label_format_set(sp, "%1.1f units");
+ elm_spinner_step_set(sp, 1.3);
+ elm_spinner_wrap_set(sp, EINA_TRUE);
+ elm_spinner_min_max_set(sp, -5000.0, 5000.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_smart_callback_add(sp, "spinner,drag,start",
+ _spinner_drag_start_cb, NULL);
+ evas_object_smart_callback_add(sp, "spinner,drag,stop",
+ _spinner_drag_stop_cb, NULL);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ sp = elm_spinner_add(win);
+ elm_spinner_label_format_set(sp, "Base 5.5, Round 2 : %1.1f");
+ elm_spinner_min_max_set(sp, -100.0, 100.0);
+ elm_spinner_round_set(sp, 2);
+ elm_spinner_base_set(sp, 5.5);
+ elm_spinner_value_set(sp, 5.5);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ sp = elm_spinner_add(win);
+ elm_spinner_label_format_set(sp, "Percentage %%%1.2f something");
+ elm_spinner_step_set(sp, 5.0);
+ elm_spinner_min_max_set(sp, 0.0, 100.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ sp = elm_spinner_add(win);
+ elm_spinner_label_format_set(sp, "%1.1f units");
+ elm_spinner_step_set(sp, 1.3);
+ elm_spinner_wrap_set(sp, EINA_TRUE);
+ elm_object_style_set (sp, "vertical");
+ elm_spinner_min_max_set(sp, -50.0, 250.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ sp = elm_spinner_add(win);
+ elm_spinner_label_format_set(sp, "Disabled %.0f");
+ elm_object_disabled_set(sp, EINA_TRUE);
+ elm_spinner_min_max_set(sp, -50.0, 250.0);
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ sp = elm_spinner_add(win);
+ elm_spinner_wrap_set(sp, EINA_TRUE);
+ elm_spinner_min_max_set(sp, 1, 12);
+ elm_spinner_value_set(sp, 1);
+ elm_spinner_label_format_set(sp, "%.0f");
+ elm_spinner_editable_set(sp, EINA_FALSE);
+ elm_spinner_special_value_add(sp, 1, "January");
+ elm_spinner_special_value_add(sp, 2, "February");
+ elm_spinner_special_value_add(sp, 3, "March");
+ elm_spinner_special_value_add(sp, 4, "April");
+ elm_spinner_special_value_add(sp, 5, "May");
+ elm_spinner_special_value_add(sp, 6, "June");
+ elm_spinner_special_value_add(sp, 7, "July");
+ elm_spinner_special_value_add(sp, 8, "August");
+ elm_spinner_special_value_add(sp, 9, "September");
+ elm_spinner_special_value_add(sp, 10, "October");
+ elm_spinner_special_value_add(sp, 11, "November");
+ elm_spinner_special_value_add(sp, 12, "December");
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_store.c b/src/bin/elementary/test_store.c
new file mode 100644
index 0000000000..95beb8b387
--- /dev/null
+++ b/src/bin/elementary/test_store.c
@@ -0,0 +1,267 @@
+/* NOTE : Before testing elm_store,
+ email data files should exist in your local storage.
+ And you can just get example files in enlightenment website.
+ Use wget to obtain it. It almost 50 Megabytes.
+ http://www.enlightenment.org/~raster/store.tar.gz
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct _My_Item My_Item;
+
+struct _My_Item
+{
+ char *from, *subject, *date, *head_content;
+};
+
+// callbacks just to see user interacting with genlist
+static void
+_st_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("selected: %p\n", event_info);
+}
+
+static void
+_st_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("double clicked: %p\n", event_info);
+}
+
+static void
+_st_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("longpress %p\n", event_info);
+}
+
+// store callbacks to handle loading/parsing/freeing of store items from src
+static Elm_Genlist_Item_Class *itc1;
+
+static const Elm_Store_Item_Mapping it1_mapping[] =
+{
+ {
+ ELM_STORE_ITEM_MAPPING_LABEL,
+ "elm.title.1", ELM_STORE_ITEM_MAPPING_OFFSET(My_Item, from),
+ { .empty = {
+ EINA_TRUE
+ } } },
+ {
+ ELM_STORE_ITEM_MAPPING_LABEL,
+ "elm.title.2", ELM_STORE_ITEM_MAPPING_OFFSET(My_Item, subject),
+ { .empty = {
+ EINA_TRUE
+ } } },
+ {
+ ELM_STORE_ITEM_MAPPING_LABEL,
+ "elm.text", ELM_STORE_ITEM_MAPPING_OFFSET(My_Item, head_content),
+ { .empty = {
+ EINA_TRUE
+ } } },
+ {
+ ELM_STORE_ITEM_MAPPING_ICON,
+ "elm.swallow.icon", 0,
+ { .icon = {
+ 48, 48,
+ ELM_ICON_LOOKUP_THEME_FDO,
+ EINA_TRUE, EINA_FALSE,
+ EINA_TRUE,
+ EINA_FALSE, EINA_FALSE,
+ } } },
+ {
+ ELM_STORE_ITEM_MAPPING_CUSTOM,
+ "elm.swallow.end", 0,
+ { .custom = {
+ NULL
+ } } },
+ ELM_STORE_ITEM_MAPPING_END
+};
+
+////// **** WARNING ***********************************************************
+//// * This function runs inside a thread outside efl mainloop. Be careful! *
+// ************************************************************************
+static Eina_Bool
+_st_store_list(void *data EINA_UNUSED, Elm_Store_Item_Info *item_info)
+{
+ Elm_Store_Item_Info_Filesystem *info = (Elm_Store_Item_Info_Filesystem *)item_info;
+ int id;
+ char sort_id[7];
+
+ // create a sort id based on the filename itself assuming it is a numeric
+ // value like the id number in mh mail folders which is what this test
+ // uses as a data source
+ char *file = strrchr(info->path, '/');
+ if (file) file++;
+ else file = info->path;
+ id = atoi(file);
+ sort_id[0] = ((id >> 30) & 0x3f) + 32;
+ sort_id[1] = ((id >> 24) & 0x3f) + 32;
+ sort_id[2] = ((id >> 18) & 0x3f) + 32;
+ sort_id[3] = ((id >> 12) & 0x3f) + 32;
+ sort_id[4] = ((id >> 6) & 0x3f) + 32;
+ sort_id[5] = ((id >> 0) & 0x3f) + 32;
+ sort_id[6] = 0;
+ info->base.sort_id = strdup(sort_id);
+ // choose the item genlist item class to use (only item style should be
+ // provided by the app, store will fill everything else in, so it also
+ // has to be writable
+ info->base.item_class = itc1; // based on item info - return the item class wanted (only style field used - rest reset to internal funcs store sets up to get label/icon etc)
+ info->base.mapping = it1_mapping;
+ info->base.data = NULL; // if we can already parse and load all of item here and want to - set this
+ return EINA_TRUE; // return true to include this, false not to
+}
+// ************************************************************************
+//// * End of separate thread function. *
+////// ************************************************************************
+
+////// **** WARNING ***********************************************************
+//// * This function runs inside a thread outside efl mainloop. Be careful! *
+// ************************************************************************
+static void
+_st_store_fetch(void *data EINA_UNUSED, Elm_Store_Item *sti)
+{
+ const char *path = elm_store_item_filesystem_path_get(sti);
+ My_Item *myit;
+ FILE *f;
+ char buf[4096], *p;
+ Eina_Bool have_content = EINA_FALSE;
+ char *content = NULL, *content_pos = NULL, *content_end = NULL;
+
+ // if we already have my item data - skip
+ if (elm_store_item_data_get(sti)) return;
+ // open the mail file and parse it
+ f = fopen(path, "rb");
+ if (!f) return;
+
+ // alloc my item in memory that holds data to show in the list
+ myit = calloc(1, sizeof(My_Item));
+ if (!myit)
+ {
+ fclose(f);
+ return;
+ }
+ while (fgets(buf, sizeof(buf), f))
+ {
+ if (!have_content)
+ {
+ if (!isblank(buf[0]))
+ {
+ // get key: From:, Subject: etc.
+ if (!strncmp(buf, "From:", 5))
+ {
+ p = buf + 5;
+ while ((*p) && (isblank(*p))) p++;
+ p = strdup(p);
+ if (p)
+ {
+ myit->from = p;
+ p = strchr(p, '\n');
+ if (p) *p = 0;
+ }
+ }
+ else if (!strncmp(buf, "Subject:", 8))
+ {
+ p = buf + 8;
+ while ((*p) && (isblank(*p))) p++;
+ p = strdup(p);
+ if (p)
+ {
+ myit->subject = p;
+ p = strchr(p, '\n');
+ if (p) *p = 0;
+ }
+ }
+ else if (!strncmp(buf, "Date:", 5))
+ {
+ p = buf + 5;
+ while ((*p) && (isblank(*p))) p++;
+ p = strdup(p);
+ if (p)
+ {
+ myit->date = p;
+ p = strchr(p, '\n');
+ if (p) *p = 0;
+ }
+ }
+ else if (buf[0] == '\n') // begin of content
+ have_content = EINA_TRUE;
+ }
+ }
+ else
+ {
+ // get first 320 bytes of content/body
+ if (!content)
+ {
+ content = calloc(1, 320);
+ content_pos = content;
+ content_end = content + 319;
+ }
+ strncat(content_pos, buf, content_end - content_pos - 1);
+ content_pos = content + strlen(content);
+ }
+ }
+ fclose(f);
+ myit->head_content = elm_entry_utf8_to_markup(content);
+ free(content);
+ elm_store_item_data_set(sti, myit);
+}
+// ************************************************************************
+//// * End of separate thread function. *
+////// ************************************************************************
+
+static void
+_st_store_unfetch(void *data EINA_UNUSED, Elm_Store_Item *sti)
+{
+ My_Item *myit = elm_store_item_data_get(sti);
+ if (!myit) return;
+ if (myit->from) free(myit->from);
+ if (myit->subject) free(myit->subject);
+ if (myit->date) free(myit->date);
+ if (myit->head_content) free(myit->head_content);
+ free(myit);
+}
+
+void
+test_store(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *gl, *bx;
+ Elm_Store *st;
+
+ win = elm_win_util_standard_add("store", "Store");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ gl = elm_genlist_add(win);
+ elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
+ evas_object_smart_callback_add(gl, "selected", _st_selected, NULL);
+ evas_object_smart_callback_add(gl, "clicked,double", _st_double_clicked, NULL);
+ evas_object_smart_callback_add(gl, "longpressed", _st_longpress, NULL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, gl);
+ evas_object_show(gl);
+
+ itc1 = elm_genlist_item_class_new();
+ itc1->item_style = "message";
+
+ st = elm_store_filesystem_new();
+ elm_store_list_func_set(st, _st_store_list, NULL);
+ elm_store_fetch_func_set(st, _st_store_fetch, NULL);
+ //elm_store_fetch_thread_set(st, EINA_FALSE);
+ elm_store_unfetch_func_set(st, _st_store_unfetch, NULL);
+ elm_store_sorted_set(st, EINA_TRUE);
+ elm_store_target_genlist_set(st, gl);
+ elm_store_filesystem_directory_set(st, "./store");
+
+ /* item_class_ref is needed for itc1. some items can be added in callbacks */
+ elm_genlist_item_class_ref(itc1);
+ elm_genlist_item_class_free(itc1);
+
+ evas_object_resize(win, 480, 800);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_sys_notify.c b/src/bin/elementary/test_sys_notify.c
new file mode 100644
index 0000000000..92cbdd1753
--- /dev/null
+++ b/src/bin/elementary/test_sys_notify.c
@@ -0,0 +1,148 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define WIDTH 320
+#define HEIGHT 160
+
+struct _Sys_Notify_Data {
+ Evas_Object *l;
+ Evas_Object *n;
+ Ecore_Event_Handler *handlers[2];
+};
+typedef struct _Sys_Notify_Data Sys_Notify_Data;
+
+static Eina_Bool
+_ev_handler(void *data EINA_UNUSED,
+ int type,
+ void *event)
+{
+ Elm_Sys_Notify_Notification_Closed *closed;
+ Elm_Sys_Notify_Action_Invoked *action;
+
+ if (type == ELM_EVENT_SYS_NOTIFY_NOTIFICATION_CLOSED)
+ {
+ closed = event;
+ printf("Notification Closed Event: %u %d.\n",
+ closed->id, closed->reason);
+ }
+ else if (type == ELM_EVENT_SYS_NOTIFY_ACTION_INVOKED)
+ {
+ action = event;
+ printf("Notification Action Event: %u %s.\n",
+ action->id, action->action_key);
+ }
+ else
+ return ECORE_CALLBACK_PASS_ON;
+
+ return ECORE_CALLBACK_DONE;
+}
+
+static void _sys_notify_cb(void *data, unsigned int id EINA_UNUSED)
+{
+ Sys_Notify_Data *notify_data = data;
+
+ elm_object_text_set(notify_data->l, "notify is done");
+ evas_object_show(notify_data->n);
+}
+
+static void
+_bt_clicked(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *s, *b;
+ s = evas_object_data_get(obj, "summary");
+ b = evas_object_data_get(obj, "body");
+
+ elm_sys_notify_send(0, "", elm_entry_entry_get(s), elm_entry_entry_get(b),
+ ELM_SYS_NOTIFY_URGENCY_NORMAL,
+ -1, _sys_notify_cb, data);
+}
+
+static void
+_test_sys_notify_win_del_cb(void *data,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Sys_Notify_Data *notify_data = data;
+ ecore_event_handler_del(notify_data->handlers[0]);
+ ecore_event_handler_del(notify_data->handlers[1]);
+
+ free(notify_data);
+}
+
+void
+test_sys_notify(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *it, *btn;
+ Evas_Object *s, *b, *n, *l;
+ Sys_Notify_Data *notify_data;
+
+ elm_need_sys_notify();
+
+ notify_data = malloc(sizeof(Sys_Notify_Data));
+
+ win = elm_win_add(NULL, "Sys Notify", ELM_WIN_BASIC);
+ elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+ elm_win_title_set(win, "System Notification");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
+ _test_sys_notify_win_del_cb, notify_data);
+
+ it = elm_bg_add(win);
+ elm_win_resize_object_add(win, it);
+ evas_object_size_hint_min_set(it, WIDTH, HEIGHT);
+ evas_object_size_hint_max_set(it, WIDTH, HEIGHT);
+ evas_object_show(it);
+
+ notify_data->n = n = elm_notify_add(win);
+ evas_object_size_hint_weight_set(n, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(n, 0.5, 0.0);
+ elm_notify_timeout_set(n, 2.0);
+
+ notify_data->l = l = elm_label_add(win);
+ elm_object_content_set(n, l);
+ evas_object_show(l);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ s = elm_entry_add(win);
+ elm_entry_single_line_set(s, EINA_TRUE);
+ elm_entry_scrollable_set(s, EINA_TRUE);
+ elm_entry_entry_set(s, "Summary");
+ evas_object_size_hint_align_set(s, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, s);
+ evas_object_show(s);
+
+ b = elm_entry_add(win);
+ elm_entry_single_line_set(b, EINA_TRUE);
+ elm_entry_scrollable_set(b, EINA_TRUE);
+ elm_entry_entry_set(b, "Body long description.");
+ evas_object_size_hint_align_set(b, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, b);
+ evas_object_show(b);
+
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "Send Notification");
+ evas_object_smart_callback_add(btn, "clicked", _bt_clicked, notify_data);
+ evas_object_data_set(btn, "summary", s);
+ evas_object_data_set(btn, "body", b);
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ evas_object_resize(win, WIDTH, HEIGHT);
+ evas_object_show(win);
+
+ notify_data->handlers[0] = ecore_event_handler_add(ELM_EVENT_SYS_NOTIFY_NOTIFICATION_CLOSED,
+ _ev_handler, notify_data);
+ notify_data->handlers[1] = ecore_event_handler_add(ELM_EVENT_SYS_NOTIFY_ACTION_INVOKED,
+ _ev_handler, notify_data);
+}
diff --git a/src/bin/elementary/test_systray.c b/src/bin/elementary/test_systray.c
new file mode 100644
index 0000000000..1271242d54
--- /dev/null
+++ b/src/bin/elementary/test_systray.c
@@ -0,0 +1,192 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define WIDTH 320
+#define HEIGHT 160
+
+static Evas_Object *ai = NULL;
+static Evas_Object *i = NULL;
+static Evas_Object *r = NULL;
+static Eo *item = NULL;
+
+static Eina_Bool
+_ev_handler(void *data EINA_UNUSED,
+ int type EINA_UNUSED,
+ void *event EINA_UNUSED)
+{
+ Eina_Bool ret = EINA_FALSE;
+
+ printf("systray ready event\n");
+
+ ret = elm_obj_systray_register(item);
+
+ printf("Item Registration: ");
+ if (ret)
+ printf("OK!\n");
+ else
+ printf("Failed!\n");
+
+ return ECORE_CALLBACK_DONE;
+}
+
+static void
+_bt_clicked(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ elm_obj_systray_icon_name_set(item, elm_entry_entry_get(i));
+ elm_obj_systray_att_icon_name_set(item, elm_entry_entry_get(ai));
+}
+
+static void
+ _r_clicked(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ elm_obj_systray_status_set(item, elm_radio_value_get(r));
+}
+
+static void
+_menu_clicked(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Menu Item Clicked: %s\n", (const char *) data);
+}
+
+void
+test_systray(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *it;
+ Elm_Object_Item *it2;
+ int st = 1;
+
+ Eina_Bool init_ok = elm_need_systray();
+
+ ecore_event_handler_add(ELM_EVENT_SYSTRAY_READY,
+ _ev_handler, NULL);
+
+ win = elm_win_add(NULL, "Systray", ELM_WIN_BASIC);
+ elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+ elm_win_title_set(win, "Systemtray - Status Notifier Item");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ it = elm_menu_add(win);
+ elm_menu_item_add(it, NULL, NULL, "root 1", _menu_clicked, "root 1");
+ it2 = elm_menu_item_add(it, NULL, NULL, "root 2", _menu_clicked, "root 2");
+ elm_menu_item_add(it, it2, NULL, "item 1", _menu_clicked, "item 1");
+ elm_menu_item_add(it, it2, NULL, "item 2", _menu_clicked, "item 2");
+
+ // Status Notifier Item Handler
+ item = eo_add(ELM_SYSTRAY_CLASS, win);
+ elm_obj_systray_icon_name_set(item, "elementary");
+ elm_obj_systray_att_icon_name_set(item, "elementary");
+ elm_obj_systray_menu_set(item, it);
+
+ it = elm_bg_add(win);
+ elm_win_resize_object_add(win, it);
+ evas_object_size_hint_min_set(it, WIDTH, HEIGHT);
+ evas_object_size_hint_max_set(it, WIDTH, HEIGHT);
+ evas_object_show(it);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ if (!init_ok)
+ {
+ it = elm_label_add(win);
+ evas_object_size_hint_align_set(it, 0, EVAS_HINT_FILL);
+ elm_object_text_set(it, "Systray initialization failed. "
+ "This test will do nothing.");
+ elm_box_pack_end(bx, it);
+ evas_object_show(it);
+ }
+
+ it = elm_label_add(win);
+ evas_object_size_hint_align_set(it, 0, EVAS_HINT_FILL);
+ elm_object_text_set(it, "Icon:");
+ elm_box_pack_end(bx, it);
+ evas_object_show(it);
+
+ i = elm_entry_add(win);
+ elm_entry_single_line_set(i, EINA_TRUE);
+ elm_entry_scrollable_set(i, EINA_TRUE);
+ elm_entry_entry_set(i, "elementary");
+ evas_object_size_hint_align_set(i, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, i);
+ evas_object_show(i);
+
+ it = elm_label_add(win);
+ evas_object_size_hint_align_set(it, 0, EVAS_HINT_FILL);
+ elm_object_text_set(it, "Attention Icon:");
+ elm_box_pack_end(bx, it);
+ evas_object_show(it);
+
+ ai = elm_entry_add(win);
+ elm_entry_single_line_set(ai, EINA_TRUE);
+ elm_entry_scrollable_set(ai, EINA_TRUE);
+ elm_entry_entry_set(ai, "elementary");
+ evas_object_size_hint_align_set(ai, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, ai);
+ evas_object_show(ai);
+
+ it = elm_button_add(win);
+ elm_object_text_set(it, "Update");
+ evas_object_smart_callback_add(it, "clicked", _bt_clicked, NULL);
+ elm_box_pack_end(bx, it);
+ evas_object_show(it);
+
+ it = elm_separator_add(win);
+ elm_separator_horizontal_set(it, EINA_TRUE);
+ elm_box_pack_end(bx, it);
+ evas_object_show(it);
+
+ it = elm_label_add(win);
+ evas_object_size_hint_align_set(it, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_text_set(it, "Status:");
+ elm_box_pack_end(bx, it);
+ evas_object_show(it);
+
+ it = elm_box_add(win);
+ elm_box_horizontal_set(it, EINA_TRUE);
+ elm_box_homogeneous_set(it, EINA_TRUE);
+ elm_box_pack_end(bx, it);
+ evas_object_show(it);
+ bx = it;
+
+ r = elm_radio_add(win);
+ evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(r, "changed", _r_clicked, NULL);
+ elm_radio_value_pointer_set(r, &st);
+ elm_radio_state_value_set(r, 0);
+ elm_object_text_set(r, "Passive");
+ elm_box_pack_end(bx, r);
+ evas_object_show(r);
+
+ it = elm_radio_add(win);
+ evas_object_size_hint_align_set(it, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(it, "changed", _r_clicked, NULL);
+ elm_radio_state_value_set(it, 1);
+ elm_radio_group_add(it, r);
+ elm_object_text_set(it, "Active");
+ elm_box_pack_end(bx, it);
+ evas_object_show(it);
+
+ it = elm_radio_add(win);
+ evas_object_size_hint_align_set(it, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(it, "changed", _r_clicked, NULL);
+ elm_radio_state_value_set(it, 2);
+ elm_radio_group_add(it, r);
+ elm_object_text_set(it, "Needs Attention");
+ elm_box_pack_end(bx, it);
+ evas_object_show(it);
+
+ evas_object_resize(win, WIDTH, HEIGHT);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_table.c b/src/bin/elementary/test_table.c
new file mode 100644
index 0000000000..76aa89f276
--- /dev/null
+++ b/src/bin/elementary/test_table.c
@@ -0,0 +1,539 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+void
+test_table(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *tb, *bt;
+
+ win = elm_win_util_standard_add("table", "Table");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb);
+ evas_object_show(tb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 3");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 2, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 4");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 1, 2, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 5");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 2, 1, 1, 2);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button a");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 2, 2, 1);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
+
+void
+test_table2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *tb, *bt;
+
+ win = elm_win_util_standard_add("table2", "Table Homogeneous");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ tb = elm_table_add(win);
+ elm_table_homogeneous_set(tb, EINA_TRUE);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb);
+ evas_object_show(tb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "A");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 1, 2, 2);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Blah blah blah");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 3, 0, 2, 3);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Hallow");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 3, 10, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "B");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 2, 5, 2, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "C");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 8, 8, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Wide");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 7, 7, 2);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
+
+static void
+my_tb_ch(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *tb = evas_object_data_get(win, "tb");
+ Evas_Object *b2 = evas_object_data_get(win, "b2");
+
+ elm_table_unpack(tb, b2);
+ elm_table_pack(tb, b2, 1, 0, 1, 2);
+}
+
+void
+test_table3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *tb, *bt;
+
+ win = elm_win_util_standard_add("table3", "Table 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb);
+ evas_object_data_set(win, "tb", tb);
+ evas_object_show(tb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 0, 1, 1);
+ evas_object_data_set(win, "b1", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 0, 1, 1);
+ evas_object_data_set(win, "b2", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 3");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 1, 1, 1);
+ evas_object_data_set(win, "b3", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
+
+void
+test_table4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *tb, *bt;
+
+ win = elm_win_util_standard_add("table4", "Table 4");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb);
+ evas_object_data_set(win, "tb", tb);
+ evas_object_show(tb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 1");
+ evas_object_size_hint_weight_set(bt, 0.25, 0.25);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 0, 1, 1);
+ evas_object_data_set(win, "b1", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 2");
+ evas_object_size_hint_weight_set(bt, 0.75, 0.25);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 0, 1, 1);
+ evas_object_data_set(win, "b2", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button 3");
+ evas_object_size_hint_weight_set(bt, 0.25, 0.75);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 1, 1, 1);
+ evas_object_data_set(win, "b3", bt);
+ evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
+
+void
+test_table5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *tb, *bt;
+
+ win = elm_win_util_standard_add("table5", "Table 5");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ tb = elm_table_add(win);
+ elm_table_homogeneous_set(tb, EINA_TRUE);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb);
+ evas_object_show(tb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "A");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 33, 0, 34, 33);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "B");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 67, 33, 33, 34);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "C");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 33, 67, 34, 33);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "D");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 33, 33, 34);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "X");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 33, 33, 34, 34);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
+
+void
+test_table6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *tb, *bt;
+
+ win = elm_win_util_standard_add("table6", "Table 6");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ tb = elm_table_add(win);
+ elm_table_homogeneous_set(tb, EINA_TRUE);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb);
+ evas_object_show(tb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "C");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 1, 2, 2);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "A");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 1, 2, 2);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Blah blah blah");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 3, 0, 2, 3);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Hallow");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 3, 10, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "B");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 1, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Wide");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 7, 7, 2);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
+
+void
+test_table7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *tb, *bt;
+
+ win = elm_win_util_standard_add("table7", "Table 7");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ tb = elm_table_add(win);
+ elm_table_padding_set(tb, 10, 20);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb);
+ evas_object_show(tb);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "C");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 1, 2, 2);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "A");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 1, 2, 2);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Blah blah blah");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 3, 0, 2, 3);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Hallow");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 3, 10, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "B");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 1, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Wide");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 7, 7, 2);
+ evas_object_show(bt);
+
+ evas_object_show(win);
+}
+
+static void
+_hor_sl_delay_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Coord h = 0;
+
+ elm_table_padding_get(data, NULL, &h);
+ elm_table_padding_set(data, elm_slider_value_get(obj), h);
+}
+
+static void
+_vert_sl_delay_changed_cb(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Coord w = 0;
+
+ elm_table_padding_get(data, &w, NULL);
+ elm_table_padding_set(data, w, elm_slider_value_get(obj));
+}
+
+void
+test_table8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb_out, *tb, *bt, *bg, *sl;
+
+ win = elm_win_util_standard_add("table8", "Table Padding");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ // outer table for the table alignment and background
+ tb_out = elm_table_add(bx);
+ evas_object_size_hint_weight_set(tb_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb_out, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, tb_out);
+ evas_object_show(tb_out);
+
+ // table background
+ bg = elm_bg_add(tb_out);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb_out, bg, 0, 0, 1, 1);
+ elm_bg_color_set(bg, 255, 255, 0);
+ evas_object_show(bg);
+
+ // actual table for a padding test
+ tb = elm_table_add(tb_out);
+ elm_table_padding_set(tb, 10, 10);
+ evas_object_size_hint_align_set(tb_out, 0.5, 0.5);
+ elm_table_pack(tb_out, tb, 0, 0, 1, 1);
+ evas_object_show(tb);
+
+ // first row
+ bt = elm_button_add(tb);
+ elm_object_text_set(bt, "colspan 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(tb);
+ elm_object_text_set(bt, "colspan 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 0, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(tb);
+ elm_object_text_set(bt, "colspan 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 2, 0, 1, 1);
+ evas_object_show(bt);
+
+ // second row
+ bt = elm_button_add(tb);
+ elm_object_text_set(bt, "colspan 3");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 1, 3, 1);
+ evas_object_show(bt);
+
+ // third row
+ bt = elm_button_add(tb);
+ elm_object_text_set(bt, "rowspan 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 2, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(tb);
+ elm_object_text_set(bt, "rowspan 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 2, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(tb);
+ elm_object_text_set(bt, "rowspan 2");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 2, 2, 1, 2);
+ evas_object_show(bt);
+
+ // fourth row
+ bt = elm_button_add(tb);
+ elm_object_text_set(bt, "rowspan 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 0, 3, 1, 1);
+ evas_object_show(bt);
+
+ bt = elm_button_add(tb);
+ elm_object_text_set(bt, "rowspan 1");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(tb, bt, 1, 3, 1, 1);
+ evas_object_show(bt);
+
+ // horizontal padding sliders
+ sl = elm_slider_add(bx);
+ elm_object_text_set(sl, "Horizontal Padding");
+ elm_slider_unit_format_set(sl, "%1.0f pixel");
+ elm_slider_min_max_set(sl, 0, 100);
+ elm_slider_value_set(sl, 10);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.0);
+ evas_object_smart_callback_add(sl, "delay,changed", _hor_sl_delay_changed_cb, tb);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ // vertical padding sliders
+ sl = elm_slider_add(bx);
+ elm_object_text_set(sl, "Vertical Padding");
+ elm_slider_unit_format_set(sl, "%1.0f pixel");
+ elm_slider_min_max_set(sl, 0, 100);
+ elm_slider_value_set(sl, 10);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.0);
+ evas_object_smart_callback_add(sl, "delay,changed", _vert_sl_delay_changed_cb, tb);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_task_switcher.c b/src/bin/elementary/test_task_switcher.c
new file mode 100644
index 0000000000..fae686edef
--- /dev/null
+++ b/src/bin/elementary/test_task_switcher.c
@@ -0,0 +1,400 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+#include <Eina.h>
+
+#define APPS_COL 0
+#define VIEWS_COL 1
+#define PROPS_VIEW_COL 2
+
+static Evas_Object *table = NULL;
+static Elm_App_Client *app_selected = NULL;
+static Eina_List *apps_list = NULL;
+
+static void _app_view_clicked(void *data, Evas_Object *obj, void *event_info);
+static void _apps_list_update(void);
+
+static void _btn_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client_View *view = data;
+ elm_app_client_view_close(view, NULL, NULL);
+}
+
+static void _btn_pause_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client_View *view = data;
+ elm_app_client_view_pause(view, NULL, NULL);
+}
+
+static void _btn_resume_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client_View *view = data;
+ elm_app_client_view_resume(view, NULL, NULL);
+}
+
+static Eina_Bool
+_app_view_prop_changed_cb(void *data EINA_UNUSED, const Eo_Event *event)
+{
+ Elm_App_View_State state = ELM_APP_VIEW_STATE_UNKNOWN;
+
+ state = elm_app_client_view_state_get(event->obj);
+
+ if (state == ELM_APP_VIEW_STATE_CLOSED)
+ {
+ Evas_Object *props = elm_table_child_get(table, PROPS_VIEW_COL, 0);
+ elm_table_unpack(table, props);
+ evas_object_del(props);
+ }
+ else
+ _app_view_clicked(event->obj, NULL, NULL);
+
+ return EINA_TRUE;
+}
+
+static void
+_app_view_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client_View *view = data;
+ Evas_Object *view_props, *close_btn, *resume_btn, *pause_btn;
+ const char *title = NULL, *icon = NULL;
+ int new_events = 0, window = 0;
+ unsigned short progress = 0;
+ Elm_App_View_State state = ELM_APP_VIEW_STATE_UNKNOWN;
+ char buffer[1024];
+
+ view_props = elm_table_child_get(table, PROPS_VIEW_COL, 0);
+ if (view_props)
+ {
+ Elm_App_Client_View *old_view;
+
+ old_view = evas_object_data_del(view_props, "view");
+ eo_event_callback_del(old_view, ELM_APP_CLIENT_VIEW_EVENT_PROPERTY_CHANGED, _app_view_prop_changed_cb, table);
+ elm_list_clear(view_props);
+ }
+ else
+ {
+ view_props = elm_list_add(table);
+ evas_object_size_hint_align_set(view_props, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_show(view_props);
+ elm_table_pack(table, view_props, PROPS_VIEW_COL, 0, 1, 1);
+ }
+
+ evas_object_data_set(view_props, "view", view);
+
+ title = elm_app_client_view_title_get(view);
+ icon = elm_app_client_view_icon_get(view);
+ progress = elm_app_client_view_progress_get(view);
+ new_events = elm_app_client_view_new_events_get(view);
+ window = elm_app_client_view_window_get(view);
+ eo_event_callback_add(view, ELM_APP_CLIENT_VIEW_EVENT_PROPERTY_CHANGED, _app_view_prop_changed_cb, table);
+
+ snprintf(buffer, sizeof(buffer), "Title=%s", title);
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ snprintf(buffer, sizeof(buffer), "Icon=%s", icon);
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ snprintf(buffer, sizeof(buffer), "Progress=%d", progress);
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ snprintf(buffer, sizeof(buffer), "New events=%d", new_events);
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ snprintf(buffer, sizeof(buffer), "WindowID=%d", window);
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ state = elm_app_client_view_state_get(view);
+ if (state == ELM_APP_VIEW_STATE_LIVE)
+ snprintf(buffer, sizeof(buffer), "State=alive");
+ else if (state == ELM_APP_VIEW_STATE_PAUSED)
+ snprintf(buffer, sizeof(buffer), "State=paused");
+ else if (state == ELM_APP_VIEW_STATE_CLOSED)
+ snprintf(buffer, sizeof(buffer), "State=closed");
+ else if (state == ELM_APP_VIEW_STATE_SHALLOW)
+ snprintf(buffer, sizeof(buffer), "State=shallow");
+ else
+ snprintf(buffer, sizeof(buffer), "State=unknown");
+ elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
+
+ close_btn = elm_button_add(view_props);
+ elm_object_text_set(close_btn, "Close view");
+ evas_object_smart_callback_add(close_btn, "clicked", _btn_close_cb, view);
+ elm_list_item_append(view_props, NULL, close_btn, NULL, NULL, NULL);
+
+ pause_btn = elm_button_add(view_props);
+ elm_object_text_set(pause_btn, "Pause view");
+ evas_object_smart_callback_add(pause_btn, "clicked", _btn_pause_cb, view);
+ elm_list_item_append(view_props, NULL, pause_btn, NULL, NULL, NULL );
+
+ resume_btn = elm_button_add(view_props);
+ elm_object_text_set(resume_btn, "Resume view");
+ evas_object_smart_callback_add(resume_btn, "clicked", _btn_resume_cb, view);
+ elm_list_item_append(view_props, NULL, resume_btn, NULL, NULL, NULL );
+
+ elm_list_go(view_props);
+}
+
+static void
+_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static void app_client_view_open_cb(void *data EINA_UNUSED, Elm_App_Client_View *view, const char *error, const char *error_message)
+{
+ Evas_Object *popup, *btn_ok;
+ char buf[1024];
+
+ popup = elm_popup_add(table);
+
+ if (view)
+ {
+ _app_view_clicked(view, NULL, NULL);
+ return;
+ }
+
+ snprintf(buf, sizeof(buf), "Some error happen opening view: %s %s", error, error_message);
+ elm_object_part_text_set(popup, "default", buf);
+
+ btn_ok = elm_button_add(popup);
+ elm_object_text_set(btn_ok, "Ok");
+ elm_object_part_content_set(popup, "button1", btn_ok);
+ evas_object_smart_callback_add(btn_ok, "clicked", _popup_close_cb, popup);
+
+ elm_popup_orient_set(popup, ELM_POPUP_ORIENT_TOP);
+ evas_object_show(popup);
+}
+
+static void _popup_btn_open_view_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *popup = data;
+ Eina_Value *args = NULL;//TODO fill with args of popup
+ Elm_App_Client *app = evas_object_data_get(popup, "app");
+
+ elm_app_client_view_open(app, args, app_client_view_open_cb, NULL);
+
+ evas_object_del(popup);
+}
+
+static void
+_app_view_open(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client *app = data;
+ Evas_Object *popup, *btn_open, *btn_cancel, *args_box;
+
+ popup = elm_popup_add(table);
+ elm_object_part_text_set(popup, "title,text", "Open a view");
+
+ btn_open = elm_button_add(popup);
+ elm_object_text_set(btn_open, "Open");
+ elm_object_part_content_set(popup, "button1", btn_open);
+ evas_object_smart_callback_add(btn_open, "clicked", _popup_btn_open_view_cb, popup);
+ evas_object_show(btn_open);
+
+ btn_cancel = elm_button_add(popup);
+ elm_object_text_set(btn_cancel, "Cancel");
+ elm_object_part_content_set(popup, "button2", btn_cancel);
+ evas_object_smart_callback_add(btn_cancel, "clicked", _popup_close_cb, popup);
+ evas_object_show(btn_cancel);
+
+ args_box = elm_box_add(popup);
+ elm_object_part_content_set(popup, "default", args_box);
+ elm_object_part_text_set(popup, "default", "TODO: add some entrys to add some parameters to view.");
+
+ evas_object_data_set(popup, "app", app);
+ elm_popup_orient_set(popup, ELM_POPUP_ORIENT_TOP);
+ evas_object_show(popup);
+}
+
+static void _app_close_all_views_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client *app = data;
+ elm_app_client_view_all_close(app);
+}
+
+static void
+_app_terminate_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_App_Client *app = data;
+ elm_app_client_terminate(app);
+}
+
+static void
+_app_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *views, *btn_close_all, *btn_terminate, *btn_open_view;
+ Eina_Iterator *views_iter = NULL;
+ Elm_App_Client_View *client_view;
+ Elm_App_Client *app = data;
+
+ app_selected = app;
+
+ views = elm_table_child_get(table, VIEWS_COL, 0);
+ if (!views)
+ {
+ views = elm_list_add(table);
+ evas_object_size_hint_align_set(views, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(views);
+ elm_table_pack(table, views, VIEWS_COL, 0, 1, 1);
+ }
+ else
+ elm_list_clear(views);
+
+ btn_open_view = elm_button_add(views);
+ elm_object_text_set(btn_open_view, "Open a view");
+ evas_object_smart_callback_add(btn_open_view, "clicked", _app_view_open, app);
+ elm_list_item_append(views, NULL, btn_open_view, NULL, NULL, NULL);
+
+ views_iter = elm_app_client_views_get(app);
+ EINA_ITERATOR_FOREACH(views_iter, client_view)
+ {
+ const char *path = NULL;
+
+ path = elm_app_client_view_path_get(client_view);
+ elm_list_item_append(views, path, NULL, NULL, _app_view_clicked, client_view);
+ }
+ eina_iterator_free(views_iter);
+
+ btn_close_all = elm_button_add(views);
+ elm_object_text_set(btn_close_all, "Close all views");
+ evas_object_smart_callback_add(btn_close_all, "clicked", _app_close_all_views_cb, app);
+ elm_list_item_append(views, NULL, btn_close_all, NULL, NULL, NULL);
+
+ btn_terminate = elm_button_add(views);
+ elm_object_text_set(btn_terminate, "Terminate application");
+ evas_object_smart_callback_add(btn_terminate, "clicked", _app_terminate_cb, app);
+ elm_list_item_append(views, NULL, btn_terminate, NULL, NULL, NULL);
+
+ elm_list_go(views);
+}
+
+static Eina_Bool
+_view_list_update_cb(void *data EINA_UNUSED, const Eo_Event *event)
+{
+ if (app_selected == event->obj)
+ _app_clicked(event->obj, NULL, NULL);
+ return EINA_TRUE;
+}
+
+static void
+_win_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ Elm_App_Client *app;
+ EINA_LIST_FREE(apps_list, app)
+ eo_del(app);
+}
+
+static void
+_app_open(const char *package)
+{
+ Elm_App_Client *app;
+ Eina_List *l;
+
+ EINA_LIST_FOREACH(apps_list, l, app)
+ {
+ const char *app_package = NULL;
+
+ app_package = elm_app_client_package_get(app);
+ if (!app_package)
+ return;
+ if (!strcmp(package, app_package))
+ return;
+ }
+
+ app = eo_add(ELM_APP_CLIENT_CLASS, NULL, elm_app_client_constructor(eo_self, package));
+ eo_event_callback_add(app, ELM_APP_CLIENT_EVENT_VIEW_LIST_LOADED, _view_list_update_cb, table);
+ eo_event_callback_add(app, ELM_APP_CLIENT_EVENT_VIEW_CREATED, _view_list_update_cb, table);
+ eo_event_callback_add(app, ELM_APP_CLIENT_EVENT_VIEW_DELETED, _view_list_update_cb, table);
+ apps_list = eina_list_append(apps_list, app);
+}
+
+static void
+_btn_app_open_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *entry = data;
+ const char *pkg = elm_object_text_get(entry);
+
+ if (!pkg || !pkg[0])
+ return;
+
+ _app_open(pkg);
+ _apps_list_update();
+}
+
+static void
+_open_custom_app_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ elm_list_item_selected_set(event_info, EINA_FALSE);
+ elm_object_focus_set(data, EINA_TRUE);
+}
+
+static void
+_apps_list_update(void)
+{
+ Evas_Object *entry, *btn_open, *apps;
+ Elm_App_Client *app;
+ Eina_List *l;
+
+ apps = elm_table_child_get(table, APPS_COL, 0);
+ elm_list_clear(apps);
+
+ EINA_LIST_FOREACH(apps_list, l, app)
+ {
+ const char *app_package = NULL;
+ app_package = elm_app_client_package_get(app);
+ elm_list_item_append(apps, app_package, NULL, NULL, _app_clicked, app);
+ }
+
+ entry = elm_entry_add(apps);
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5);
+
+ btn_open = elm_button_add(apps);
+ elm_object_text_set(btn_open, "Open");
+ evas_object_smart_callback_add(btn_open, "clicked", _btn_app_open_cb, entry);
+ elm_list_item_append(apps, NULL, entry, btn_open, _open_custom_app_cb, entry);
+
+ elm_list_go(apps);
+}
+
+void
+test_task_switcher(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *apps;
+
+ if (apps_list)
+ {
+ printf("Task switcher already open.\n");
+ return;
+ }
+
+ win = elm_win_util_standard_add("task switcher", "Task switcher");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ evas_object_smart_callback_add(win, "delete,request", _win_del, NULL);
+
+ table = elm_table_add(win);
+ elm_win_resize_object_add(win, table);
+ elm_table_padding_set(table, 0, 0);
+ elm_table_homogeneous_set(table, EINA_TRUE);
+ evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ _app_open("org.enlightenment.message");
+ _app_open("org.enlightenment.phone");
+
+ apps = elm_list_add(table);
+ evas_object_size_hint_align_set(apps, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(apps);
+ elm_table_pack(table, apps, APPS_COL, 0, 1, 1);
+ _apps_list_update();
+
+ evas_object_show(table);
+ evas_object_resize(win, 1024, 768);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_thumb.c b/src/bin/elementary/test_thumb.c
new file mode 100644
index 0000000000..9d4a33ed28
--- /dev/null
+++ b/src/bin/elementary/test_thumb.c
@@ -0,0 +1,63 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+void
+test_thumb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *sc, *tb, *th;
+ int i, j;
+ char buf[PATH_MAX];
+ const char *img[] =
+ {
+ "panel_01.jpg",
+ "plant_01.jpg",
+ "rock_01.jpg",
+ "rock_02.jpg",
+ "sky_01.jpg",
+ "sky_02.jpg",
+ "sky_03.jpg",
+ "sky_04.jpg",
+ "wood_01.jpg",
+ "mystrale.jpg",
+ "mystrale_2.jpg"
+ };
+
+ elm_need_ethumb();
+
+ win = elm_win_util_standard_add("thumb", "Thumb");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ for (j = 0; j < (int)EINA_C_ARRAY_LENGTH(img); j++)
+ {
+ for (i = 0; i < (int)EINA_C_ARRAY_LENGTH(img); i++)
+ {
+ th = elm_thumb_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(),
+ img[i]);
+ elm_thumb_file_set(th, buf, NULL);
+ evas_object_size_hint_weight_set(th, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(th, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ elm_table_pack(tb, th, i, j, 1, 1);
+ elm_thumb_editable_set(th, EINA_TRUE);
+ evas_object_show(th);
+ }
+ }
+
+ sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, sc);
+
+ elm_object_content_set(sc, tb);
+ evas_object_show(tb);
+ evas_object_show(sc);
+
+ evas_object_resize(win, 600, 600);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_toolbar.c b/src/bin/elementary/test_toolbar.c
new file mode 100644
index 0000000000..11c07578e8
--- /dev/null
+++ b/src/bin/elementary/test_toolbar.c
@@ -0,0 +1,1314 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+Evas_Object * _focus_autoscroll_mode_frame_create(Evas_Object *parent);
+
+static void
+_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ const char *str = elm_object_item_text_get(event_info);
+ printf("item %p is %s.", event_info, (char *)data);
+ if (str)
+ printf(" string is \"%s\"\n", str);
+ else
+ printf("\n");
+}
+
+static void
+_tb_sel1_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/panel_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(data, buf);
+}
+
+static void
+_tb_sel2_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(data, buf);
+}
+
+static void
+_tb_sel3_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/wood_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(data, buf);
+}
+
+static void
+_tb_sel3a_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ _tb_sel3_cb(data, obj, event_info);
+ elm_toolbar_item_state_set(event_info, elm_toolbar_item_state_next(event_info));
+}
+
+static void
+_tb_sel3b_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ _tb_sel3_cb(data, obj, event_info);
+ elm_toolbar_item_state_unset(event_info);
+}
+
+static void
+_tb_sel4_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(data, buf);
+}
+
+static void
+_tb_sel4a_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_toolbar_item_state_set(event_info, elm_toolbar_item_state_prev(event_info));
+}
+
+static void
+_tb_sel5_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_photo_file_set(data, NULL);
+}
+
+static void
+toolbar_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Elm_Object_Item *more_it = elm_toolbar_more_item_get(obj);
+
+ printf("toolbar item %p is clicked\n", event_info);
+
+ if (!strcmp(elm_object_item_text_get(more_it), "Open") &&
+ (more_it == elm_toolbar_selected_item_get(obj)))
+ {
+ elm_toolbar_item_icon_set(more_it, "arrow_up");
+ elm_object_item_text_set(more_it, "Close");
+ }
+ else if (!strcmp(elm_object_item_text_get(more_it), "Close"))
+ {
+ elm_toolbar_item_icon_set(more_it, "arrow_down");
+ elm_object_item_text_set(more_it, "Open");
+ }
+}
+
+void
+test_toolbar(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *ph, *menu;
+ Evas_Object *ph1, *ph2, *ph3, *ph4;
+ Elm_Object_Item *tb_it;
+ Elm_Object_Item *menu_it;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("toolbar", "Toolbar");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ tb = elm_toolbar_add(win);
+ evas_object_smart_callback_add(tb, "selected", _selected_cb, "selected");
+ evas_object_smart_callback_add(tb, "unselected", _selected_cb, "unselected");
+ elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_MENU);
+ evas_object_size_hint_weight_set(tb, 0.0, 0.0);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0);
+// elm_object_scale_set(tb, 0.9);
+
+ ph1 = elm_photo_add(win);
+ ph2 = elm_photo_add(win);
+ ph3 = elm_photo_add(win);
+ ph4 = elm_photo_add(win);
+
+ tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1);
+ elm_object_item_disabled_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, 100);
+
+ tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1);
+ elm_toolbar_item_priority_set(tb_it, -100);
+
+ tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 150);
+
+ tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 0);
+
+ tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL);
+ elm_toolbar_item_menu_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, -9999);
+ elm_toolbar_menu_parent_set(tb, win);
+ menu = elm_toolbar_item_menu_get(tb_it);
+
+ elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4);
+ menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel5_cb, ph4);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ tb = elm_table_add(win);
+ //elm_table_homogeneous_set(tb, EINA_TRUE);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph = ph1;
+ elm_photo_size_set(ph, 40);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph2;
+ elm_photo_size_set(ph, 80);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph3;
+ elm_photo_size_set(ph, 20);
+ snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 1, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph4;
+ elm_photo_size_set(ph, 60);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 1, 1, 1);
+ evas_object_show(ph);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+void
+test_toolbar2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *ph, *menu;
+ Evas_Object *ph1, *ph2, *ph3, *ph4;
+ Elm_Object_Item *tb_it;
+ Elm_Object_Item *menu_it;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("toolbar2", "Toolbar 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ tb = elm_toolbar_add(win);
+ elm_toolbar_homogeneous_set(tb, EINA_FALSE);
+ elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_SCROLL);
+ evas_object_size_hint_weight_set(tb, 0.0, 0.0);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0);
+
+ ph1 = elm_photo_add(win);
+ ph2 = elm_photo_add(win);
+ ph3 = elm_photo_add(win);
+ ph4 = elm_photo_add(win);
+
+ tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1);
+ elm_object_item_disabled_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, -100);
+
+ tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1);
+ elm_toolbar_item_priority_set(tb_it, 100);
+
+ tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -150);
+
+ tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 0);
+
+ tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL);
+ elm_toolbar_item_menu_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, -9999);
+ elm_toolbar_menu_parent_set(tb, win);
+ menu = elm_toolbar_item_menu_get(tb_it);
+
+ elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4);
+ menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, NULL, "edit-delete", "Scroll", _tb_sel5_cb, ph4);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ tb = elm_table_add(win);
+ //elm_table_homogeneous_set(tb, EINA_TRUE);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph = ph1;
+ elm_photo_size_set(ph, 40);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph2;
+ elm_photo_size_set(ph, 80);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph3;
+ elm_photo_size_set(ph, 20);
+ snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 1, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph4;
+ elm_photo_size_set(ph, 60);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 1, 1, 1);
+ evas_object_show(ph);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+void
+test_toolbar3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *ph, *menu;
+ Evas_Object *ph1, *ph2, *ph3, *ph4;
+ Elm_Object_Item *tb_it;
+ Elm_Object_Item *menu_it;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("toolbar3", "Toolbar 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ tb = elm_toolbar_add(win);
+ elm_toolbar_homogeneous_set(tb, EINA_FALSE);
+ elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_NONE);
+ evas_object_size_hint_weight_set(tb, 0.0, 0.0);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0);
+
+ ph1 = elm_photo_add(win);
+ ph2 = elm_photo_add(win);
+ ph3 = elm_photo_add(win);
+ ph4 = elm_photo_add(win);
+
+ tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1);
+ elm_object_item_disabled_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, EINA_FALSE);
+
+ tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, EINA_TRUE);
+
+ tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -10);
+
+ tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 50);
+
+ tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL);
+ elm_toolbar_item_menu_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, 9999);
+ elm_toolbar_menu_parent_set(tb, win);
+ menu = elm_toolbar_item_menu_get(tb_it);
+
+ elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4);
+ menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, NULL, "edit-delete", "None", _tb_sel5_cb, ph4);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph = ph1;
+ elm_photo_size_set(ph, 40);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph2;
+ elm_photo_size_set(ph, 80);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph3;
+ elm_photo_size_set(ph, 20);
+ snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 1, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph4;
+ elm_photo_size_set(ph, 60);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 1, 1, 1);
+ evas_object_show(ph);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+/* The same test of toolbar, but using hide shrink mode instead of menu */
+void
+test_toolbar4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *ph, *menu;
+ Evas_Object *ph1, *ph2, *ph3, *ph4;
+ Elm_Object_Item *tb_it;
+ Elm_Object_Item *menu_it;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("toolbar4", "Toolbar 4");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ tb = elm_toolbar_add(win);
+ elm_toolbar_homogeneous_set(tb, EINA_FALSE);
+ elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_HIDE);
+ evas_object_size_hint_weight_set(tb, 0.0, 0.0);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0);
+
+ ph1 = elm_photo_add(win);
+ ph2 = elm_photo_add(win);
+ ph3 = elm_photo_add(win);
+ ph4 = elm_photo_add(win);
+
+ tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1);
+ elm_object_item_disabled_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, 100);
+
+ tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1);
+ elm_toolbar_item_priority_set(tb_it, -100);
+
+ tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 150);
+
+ tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 0);
+
+ tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL);
+ elm_toolbar_item_menu_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, -9999);
+ elm_toolbar_menu_parent_set(tb, win);
+ menu = elm_toolbar_item_menu_get(tb_it);
+
+ elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4);
+ menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel5_cb, ph4);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph = ph1;
+ elm_photo_size_set(ph, 40);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph2;
+ elm_photo_size_set(ph, 80);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph3;
+ elm_photo_size_set(ph, 20);
+ snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 1, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph4;
+ elm_photo_size_set(ph, 60);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 1, 1, 1);
+ evas_object_show(ph);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+/* Toolbar with multiple state buttons */
+void
+test_toolbar5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *ph, *menu;
+ Evas_Object *ph1, *ph2, *ph3, *ph4;
+ Elm_Object_Item *tb_it;
+ Elm_Object_Item *menu_it;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("toolbar5", "Toolbar 5");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ tb = elm_toolbar_add(win);
+ elm_toolbar_homogeneous_set(tb, EINA_FALSE);
+ elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_MENU);
+ evas_object_size_hint_weight_set(tb, 0.0, 0.0);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0);
+ elm_toolbar_select_mode_set(tb, ELM_OBJECT_SELECT_MODE_NONE);
+
+ ph1 = elm_photo_add(win);
+ ph2 = elm_photo_add(win);
+ ph3 = elm_photo_add(win);
+ ph4 = elm_photo_add(win);
+
+ tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1);
+ elm_object_item_disabled_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, 100);
+
+ snprintf(buf, sizeof(buf), "%s/images/icon_04.png", elm_app_data_dir_get());
+ tb_it = elm_toolbar_item_append(tb, buf, "World", _tb_sel2_cb, ph1);
+ elm_toolbar_item_priority_set(tb_it, -100);
+
+ tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3a_cb, ph4);
+ elm_toolbar_item_state_add(tb_it, "object-rotate-left", "H2", _tb_sel3b_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 150);
+
+ tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4a_cb, ph4);
+ elm_toolbar_item_state_add(tb_it, "emptytrash", "Comes2", _tb_sel4a_cb, ph4);
+ elm_toolbar_item_state_add(tb_it, "trashcan_full", "Comes3", _tb_sel4a_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 0);
+
+ tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL);
+ elm_toolbar_item_menu_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, -9999);
+ elm_toolbar_menu_parent_set(tb, win);
+ menu = elm_toolbar_item_menu_get(tb_it);
+
+ elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4);
+ menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel5_cb, ph4);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph = ph1;
+ elm_photo_size_set(ph, 40);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph2;
+ elm_photo_size_set(ph, 80);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph3;
+ elm_photo_size_set(ph, 20);
+ snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 1, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph4;
+ elm_photo_size_set(ph, 60);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 1, 1, 1);
+ evas_object_show(ph);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+void
+test_toolbar_vertical(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *ph, *menu;
+ Evas_Object *ph1, *ph2, *ph3, *ph4;
+ Elm_Object_Item *tb_it;
+ Elm_Object_Item *menu_it;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("toolbar-vertical", "Toolbar Vertical");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_show(bx);
+
+ tb = elm_toolbar_add(win);
+ elm_toolbar_horizontal_set(tb, EINA_FALSE);
+ elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_MENU);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph1 = elm_photo_add(win);
+ ph2 = elm_photo_add(win);
+ ph3 = elm_photo_add(win);
+ ph4 = elm_photo_add(win);
+
+ tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1);
+ elm_object_item_disabled_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, 100);
+
+ tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1);
+ elm_toolbar_item_priority_set(tb_it, -100);
+
+ tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 150);
+
+ tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 0);
+
+ tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL);
+ elm_toolbar_item_menu_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, -9999);
+ elm_toolbar_menu_parent_set(tb, win);
+ menu = elm_toolbar_item_menu_get(tb_it);
+
+ elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4);
+ menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel5_cb, ph4);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph = ph1;
+ elm_photo_size_set(ph, 40);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph2;
+ elm_photo_size_set(ph, 80);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph3;
+ elm_photo_size_set(ph, 20);
+ snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 1, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph4;
+ elm_photo_size_set(ph, 60);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 1, 1, 1);
+ evas_object_show(ph);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+void
+test_toolbar6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *ph, *menu;
+ Evas_Object *ph1, *ph2, *ph3, *ph4;
+ Elm_Object_Item *tb_it;
+ Elm_Object_Item *menu_it;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("toolbar6", "Toolbar 6");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ tb = elm_toolbar_add(win);
+ elm_object_style_set(tb, "item_horizontal");
+ elm_toolbar_homogeneous_set(tb, EINA_FALSE);
+ elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_MENU);
+ evas_object_size_hint_weight_set(tb, 0.0, 0.0);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0);
+
+ ph1 = elm_photo_add(win);
+ ph2 = elm_photo_add(win);
+ ph3 = elm_photo_add(win);
+ ph4 = elm_photo_add(win);
+
+ tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1);
+ elm_object_item_disabled_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, 100);
+
+ tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1);
+ elm_toolbar_item_priority_set(tb_it, -100);
+
+ tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 150);
+
+ tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 0);
+
+ tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL);
+ elm_toolbar_item_menu_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, -9999);
+ elm_toolbar_menu_parent_set(tb, win);
+ menu = elm_toolbar_item_menu_get(tb_it);
+
+ elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4);
+ menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4);
+ elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel5_cb, ph4);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ tb = elm_table_add(win);
+ //elm_table_homogeneous_set(tb, EINA_TRUE);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph = ph1;
+ elm_photo_size_set(ph, 40);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph2;
+ elm_photo_size_set(ph, 80);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph3;
+ elm_photo_size_set(ph, 20);
+ snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 1, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph4;
+ elm_photo_size_set(ph, 60);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 1, 1, 1);
+ evas_object_show(ph);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+void
+test_toolbar7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *ph, *sl;
+ Evas_Object *ph1, *ph2, *ph3, *ph4;
+ Elm_Object_Item *tb_it;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("toolbar7", "Toolbar 7");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ tb = elm_toolbar_add(win);
+ elm_toolbar_homogeneous_set(tb, EINA_FALSE);
+ elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_EXPAND);
+ elm_toolbar_transverse_expanded_set(tb, EINA_TRUE);
+ elm_toolbar_standard_priority_set(tb, 0);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph1 = elm_photo_add(win);
+ ph2 = elm_photo_add(win);
+ ph3 = elm_photo_add(win);
+ ph4 = elm_photo_add(win);
+
+ tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1);
+ elm_object_item_disabled_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_priority_set(tb_it, -100);
+
+ elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1);
+ elm_toolbar_item_priority_set(tb_it, 100);
+
+ elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -150);
+
+ elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ sl = elm_slider_add(win);
+ evas_object_size_hint_min_set(sl, 100, 50);
+ tb_it = elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL);
+ elm_object_item_part_content_set(tb_it, "object", sl);
+
+ elm_toolbar_item_priority_set(tb_it, 500);
+
+ elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ tb_it = elm_toolbar_item_append(tb, "edit-cut", "Shrink", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ tb_it = elm_toolbar_item_append(tb, "edit-copy", "Mode", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ tb_it = elm_toolbar_item_append(tb, "edit-paste", "is set to", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -200);
+
+ elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ tb_it = elm_toolbar_item_append(tb, "edit-delete", "Menu", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 200);
+
+ elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, 200);
+
+ elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE);
+
+ tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4);
+ elm_toolbar_item_priority_set(tb_it, -300);
+
+ elm_object_item_text_set(elm_toolbar_more_item_get(tb), "Open");
+
+ evas_object_smart_callback_add(tb, "clicked", toolbar_clicked_cb, NULL);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph = ph1;
+ elm_photo_size_set(ph, 80);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph2;
+ elm_photo_size_set(ph, 160);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph3;
+ elm_photo_size_set(ph, 40);
+ snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 1, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph4;
+ elm_photo_size_set(ph, 120);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 1, 1, 1);
+ evas_object_show(ph);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ evas_object_resize(win, 420, 250);
+ evas_object_show(win);
+}
+
+void
+test_toolbar8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *ph;
+ Evas_Object *ph1, *ph2, *ph3, *ph4;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("toolbar8", "Toolbar 8");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ elm_win_resize_object_add(win, bx);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bx);
+
+ tb = elm_toolbar_add(win);
+ elm_toolbar_homogeneous_set(tb, EINA_FALSE);
+ elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_EXPAND);
+ elm_toolbar_transverse_expanded_set(tb, EINA_TRUE);
+ elm_toolbar_reorder_mode_set(tb, EINA_TRUE);
+ elm_toolbar_select_mode_set(tb, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ elm_object_style_set(tb, "item_centered");
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph1 = elm_photo_add(win);
+ ph2 = elm_photo_add(win);
+ ph3 = elm_photo_add(win);
+ ph4 = elm_photo_add(win);
+
+ elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1);
+ elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1);
+ elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4);
+ elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4);
+ elm_toolbar_item_append(tb, "edit-cut", "Shrink", _tb_sel4_cb, ph4);
+ elm_toolbar_item_append(tb, "edit-copy", "Mode", _tb_sel4_cb, ph4);
+ elm_toolbar_item_append(tb, "edit-paste", "is set to", _tb_sel4_cb, ph4);
+ elm_toolbar_item_append(tb, "edit-delete", "Menu", _tb_sel4_cb, ph4);
+ elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4);
+
+ evas_object_smart_callback_add(tb, "clicked", toolbar_clicked_cb, NULL);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ ph = ph1;
+ elm_photo_size_set(ph, 80);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph2;
+ elm_photo_size_set(ph, 160);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 0, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph3;
+ elm_photo_size_set(ph, 40);
+ snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 0, 1, 1, 1);
+ evas_object_show(ph);
+
+ ph = ph4;
+ elm_photo_size_set(ph, 120);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_photo_file_set(ph, buf);
+ evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ph, 0.5, 0.5);
+ elm_table_pack(tb, ph, 1, 1, 1, 1);
+ evas_object_show(ph);
+
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ evas_object_resize(win, 420, 250);
+ evas_object_show(win);
+}
+
+static void
+_item_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ printf("%s: %p\n", (char *)data, event_info);
+}
+
+static void
+_test_toolbar_focus_focus_highlight_check_changed(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_enabled_set(data,
+ elm_check_state_get(obj));
+}
+
+static void
+_test_toolbar_focus_focus_animate_check_changed(void *data, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_win_focus_highlight_animate_set(data,
+ elm_check_state_get(obj));
+}
+
+static void
+_test_toolbar_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
+}
+
+static void
+_toolbar_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ printf("\n=== Key Down : %s ===\n", ev->keyname);
+}
+
+static Ecore_Timer *timer = NULL;
+static void
+_test_toolbar_focus_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_timer_del(timer);
+ timer = NULL;
+}
+
+static Eina_Bool
+_focus_timer_cb(void *data)
+{
+ Elm_Object_Item *it = data;
+ elm_object_item_focus_set(it, EINA_TRUE);
+ timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_test_toolbar_focus_item_set_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_timer_del(timer);
+ timer = ecore_timer_add(1.5, _focus_timer_cb, data);
+}
+
+static void
+_test_toolbar_focus_disable_item_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ elm_object_item_disabled_set(data, EINA_TRUE);
+}
+
+static void
+test_toolbar_focus_focus_move_policy_changed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ int val = elm_radio_value_get(obj);
+
+ if (val == 0)
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK);
+ else if (val == 1)
+ elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN);
+}
+
+void
+test_toolbar_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *toolbar, *fr, *btn, *bx_opt, *chk, *bx_mv, *rd, *rdg;
+ Elm_Object_Item *tb_it, *it_0, *it_3;
+
+ win = elm_win_util_standard_add("toolbar-focus", "Toolbar Focus");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
+ _test_toolbar_focus_win_del_cb, NULL);
+ elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+ elm_win_focus_highlight_animate_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "Up");
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ toolbar = elm_toolbar_add(win);
+ elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_SCROLL);
+ evas_object_size_hint_align_set(toolbar, EVAS_HINT_FILL, 0.0);
+ it_0 = elm_toolbar_item_append(toolbar, "document-print", "Print", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL);
+ it_3 = elm_toolbar_item_append(toolbar, "clock", "Clock", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "refresh", "Update", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "clock", "Clock", NULL, NULL);
+ tb_it = elm_toolbar_item_append(toolbar, "document-print", "Print", NULL, NULL);
+ elm_object_item_disabled_set(tb_it, EINA_TRUE);
+ elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "refresh", "Update", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "clock", "Clock", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "document-print", "Print", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "refresh", "Update", NULL, NULL);
+ elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL);
+ elm_box_pack_end(bx, toolbar);
+ evas_object_show(toolbar);
+ evas_object_smart_callback_add(toolbar, "clicked", _item_cb, "clicked");
+ evas_object_smart_callback_add(toolbar, "item,focused", _item_cb, "item,focused");
+ evas_object_smart_callback_add(toolbar, "item,unfocused", _item_cb, "item,unfcoused");
+ evas_object_event_callback_add(toolbar, EVAS_CALLBACK_KEY_DOWN, _toolbar_focus_key_down_cb, NULL);
+
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "Down");
+ elm_box_pack_end(bx, btn);
+ evas_object_show(btn);
+
+ //Options
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Options");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_opt = elm_box_add(fr);
+ elm_box_horizontal_set(bx_opt, EINA_TRUE);
+ elm_object_content_set(fr, bx_opt);
+ evas_object_show(bx_opt);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Focus Highlight");
+ elm_check_state_set(chk, EINA_TRUE);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+ evas_object_smart_callback_add(chk, "changed",
+ _test_toolbar_focus_focus_highlight_check_changed,
+ win);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "Focus Animation");
+ elm_check_state_set(chk, EINA_TRUE);
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+ evas_object_smart_callback_add(chk, "changed",
+ _test_toolbar_focus_focus_animate_check_changed,
+ win);
+
+ chk = elm_check_add(bx_opt);
+ elm_object_text_set(chk, "First item focus on first focus in");
+ elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get());
+ evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx_opt, chk);
+ evas_object_show(chk);
+ evas_object_smart_callback_add(chk, "changed",
+ _test_toolbar_first_item_focus_on_first_focus_in_cb,
+ win);
+
+ // Focus Autoscroll Mode
+ fr = _focus_autoscroll_mode_frame_create(bx);
+ elm_box_pack_end(bx, fr);
+
+ // Focus movement policy
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Focus Movement Policy");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_mv = elm_box_add(fr);
+ elm_box_horizontal_set(bx_mv, EINA_TRUE);
+ elm_object_content_set(fr, bx_mv);
+ evas_object_show(bx_mv);
+
+ rdg = rd = elm_radio_add(bx_mv);
+ elm_object_text_set(rd, "Focus Move by Click");
+ elm_radio_state_value_set(rd, 0);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(rd, "changed",
+ test_toolbar_focus_focus_move_policy_changed,
+ NULL);
+ elm_box_pack_end(bx_mv, rd);
+ evas_object_show(rd);
+
+ rd = elm_radio_add(bx_mv);
+ elm_object_text_set(rd, "Focus Move by Mouse-In");
+ elm_radio_group_add(rd, rdg);
+ elm_radio_state_value_set(rd, 1);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(rd, "changed",
+ test_toolbar_focus_focus_move_policy_changed,
+ NULL);
+ elm_box_pack_end(bx_mv, rd);
+ evas_object_show(rd);
+
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Focus");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx_opt = elm_box_add(fr);
+ elm_object_content_set(fr, bx_opt);
+ evas_object_show(bx_opt);
+
+ btn = elm_button_add(bx_opt);
+ elm_object_text_set(btn, "Set focus to 3rd toolbar item after 1.5 seconds.");
+ evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_opt, btn);
+ evas_object_show(btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _test_toolbar_focus_item_set_btn_cb,
+ it_3);
+
+ btn = elm_button_add(bx_opt);
+ elm_object_text_set(btn, "Disable 1st item.");
+ evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx_opt, btn);
+ evas_object_show(btn);
+ evas_object_smart_callback_add(btn, "clicked",
+ _test_toolbar_focus_disable_item_btn_cb,
+ it_0);
+
+ evas_object_resize(win, 420, 200);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_tooltip.c b/src/bin/elementary/test_tooltip.c
new file mode 100644
index 0000000000..23290671e8
--- /dev/null
+++ b/src/bin/elementary/test_tooltip.c
@@ -0,0 +1,745 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct _Testitem
+{
+ Elm_Object_Item *item;
+ const char *path;
+ int mode;
+ int onoff;
+} Testitem;
+
+static Elm_Gengrid_Item_Class gic;
+
+char *
+grdt_lbl_get(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ const char *part EINA_UNUSED)
+{
+ const Testitem *ti = data;
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Photo %s", ti->path);
+ return strdup(buf);
+}
+
+Evas_Object *
+grdt_content_get(void *data,
+ Evas_Object *obj,
+ const char *part)
+{
+ const Testitem *ti = data;
+ if (!strcmp(part, "elm.swallow.icon"))
+ {
+ Evas_Object *icon = elm_bg_add(obj);
+ elm_bg_file_set(icon, ti->path, NULL);
+ evas_object_size_hint_aspect_set(icon,
+ EVAS_ASPECT_CONTROL_VERTICAL,
+ 1, 1);
+ evas_object_show(icon);
+ return icon;
+ }
+ return NULL;
+}
+
+static Elm_Genlist_Item_Class itct;
+
+static void
+gltt_exp(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ Evas_Object *gl = elm_object_item_widget_get(glit);
+ int val = (int)(uintptr_t) elm_object_item_data_get(glit);
+ Elm_Object_Item *glit1, *glit2, *glit3;
+
+ val *= 10;
+ glit1 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 1), glit,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ glit2 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 2), glit,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ glit3 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 3), glit,
+ ELM_GENLIST_ITEM_TREE, NULL, NULL);
+
+ elm_genlist_item_tooltip_text_set(glit1, "Testing A");
+ elm_genlist_item_tooltip_text_set(glit2, "Testing B");
+ elm_genlist_item_tooltip_text_set(glit3, "Testing C");
+}
+
+static void
+gltt_con(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_subitems_clear(glit);
+}
+
+static void
+gltt_exp_req(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_expanded_set(glit, EINA_TRUE);
+}
+
+static void
+gltt_con_req(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Elm_Object_Item *glit = event_info;
+ elm_genlist_item_expanded_set(glit, EINA_FALSE);
+}
+
+char *
+gltt_text_get(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ const char *part EINA_UNUSED)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Item mode %i", (int)(uintptr_t)data);
+ return strdup(buf);
+}
+
+static Evas_Object *
+_tt_item_icon(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ Evas_Object *tt,
+ void *item EINA_UNUSED)
+{
+ Evas_Object *ic = elm_icon_add(tt);
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png",
+ elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_resize(ic, 64, 64);
+ return ic;
+}
+
+static Evas_Object *
+_tt_item_icon2(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ Evas_Object *tt,
+ void *item EINA_UNUSED)
+{
+ Evas_Object *ic = elm_icon_add(tt);
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ return ic;
+}
+
+static Evas_Object *
+_tt_item_icon3(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ Evas_Object *tt,
+ void *item EINA_UNUSED)
+{
+ int w, h, sw, sh;
+ Evas_Object *ic = elm_icon_add(tt);
+
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/insanely_huge_test_image.jpg", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_object_size_get(ic, &w, &h);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ elm_win_screen_size_get(tt, NULL, NULL, &sw, &sh);
+ if ((w > sw) || (h > sh))
+ {
+ float sc = 0;
+ if ((float)w / (float)sw >= 0.8)
+ sc = ((float)sw * 0.8) / (float)w;
+ else if ((float)h / (float)sh >= 0.8)
+ sc = ((float)sh * 0.8) / (float)h;
+ if (sc) elm_object_scale_set(ic, sc);
+ }
+ return ic;
+}
+
+static Evas_Object *
+_tt_item_label(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ Evas_Object *tt,
+ void *item EINA_UNUSED)
+{
+ Evas_Object *l = elm_label_add(tt);
+ elm_object_text_set(l, "Something useful here?<ps/>"
+ "No probably not, but this is a super long label<ps/>"
+ "which probably breaks on your system, now doesn't it?<ps/>"
+ "Yeah, I thought so.");
+ elm_label_line_wrap_set(l, ELM_WRAP_MIXED);
+ return l;
+}
+
+static void
+_tt_item_icon_del(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ // test to check for del_cb behavior!
+ printf("_tt_icon_del: data=%ld (== 456?), event_info=%p\n",
+ (long)(uintptr_t)data, event_info);
+}
+
+static void
+_tt_text_replace(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ static int count = 0;
+ char buf[64];
+ snprintf(buf, sizeof(buf), "count=%d", count);
+ count++;
+ elm_object_tooltip_text_set(obj, buf);
+}
+
+static void
+_tt_move_freeze(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ if (elm_object_tooltip_move_freeze_get(obj) == 0)
+ {
+ elm_object_tooltip_move_freeze_push(obj);
+ elm_object_tooltip_text_set(obj, "Fronzen");
+ }
+ else
+ {
+ elm_object_tooltip_move_freeze_pop(obj);
+ elm_object_tooltip_text_set(obj, "Free");
+ }
+}
+
+static void
+_tt_orient_text_replace(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ static Elm_Tooltip_Orient orient;
+
+ orient = elm_object_tooltip_orient_get(obj);
+ orient++;
+ if (orient >= ELM_TOOLTIP_ORIENT_LAST)
+ orient = ELM_TOOLTIP_ORIENT_TOP_LEFT;
+ switch(orient)
+ {
+ case ELM_TOOLTIP_ORIENT_TOP_LEFT:
+ {
+ elm_object_tooltip_text_set(obj, "Top Left");
+ elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_TOP_LEFT);
+ printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_TOP_LEFT\n");
+ break;
+ }
+ case ELM_TOOLTIP_ORIENT_TOP:
+ {
+ elm_object_tooltip_text_set(obj, "Top");
+ elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_TOP);
+ printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_TOP\n");
+ break;
+ }
+ case ELM_TOOLTIP_ORIENT_TOP_RIGHT:
+ {
+ elm_object_tooltip_text_set(obj, "Top Right");
+ elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_TOP_RIGHT);
+ printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_TOP_RIGHT\n");
+ break;
+ }
+ case ELM_TOOLTIP_ORIENT_LEFT:
+ {
+ elm_object_tooltip_text_set(obj, "Left");
+ elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_LEFT);
+ printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_LEFT\n");
+ break;
+ }
+ case ELM_TOOLTIP_ORIENT_CENTER:
+ {
+ elm_object_tooltip_text_set(obj, "Center");
+ elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_CENTER);
+ printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_CENTER\n");
+ break;
+ }
+ case ELM_TOOLTIP_ORIENT_RIGHT:
+ {
+ elm_object_tooltip_text_set(obj, "Right");
+ elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_RIGHT);
+ printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_RIGHT\n");
+ break;
+ }
+ case ELM_TOOLTIP_ORIENT_BOTTOM_LEFT:
+ {
+ elm_object_tooltip_text_set(obj, "Bottom Left");
+ elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_BOTTOM_LEFT);
+ printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_BOTTOM_LEFT\n");
+ break;
+ }
+ case ELM_TOOLTIP_ORIENT_BOTTOM:
+ {
+ elm_object_tooltip_text_set(obj, "Bottom");
+ elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_BOTTOM);
+ printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_BOTTOM\n");
+ break;
+ }
+ case ELM_TOOLTIP_ORIENT_BOTTOM_RIGHT:
+ {
+ elm_object_tooltip_text_set(obj, "Bottom Right");
+ elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_BOTTOM_RIGHT);
+ printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_BOTTOM_RIGHT\n");
+ break;
+ }
+ default:
+ {
+ elm_object_tooltip_text_set(obj, "No Orientation");
+ elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_NONE);
+ printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_NONE\n");
+ }
+ };
+}
+
+static void
+_tt_timer_del(void *data EINA_UNUSED,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Ecore_Timer *timer = evas_object_data_del(obj, "test-timer");
+ if (!timer) return;
+ ecore_timer_del(timer);
+}
+
+static Eina_Bool
+_tt_text_replace_timer_cb(void *data)
+{
+ _tt_text_replace(NULL, data, NULL);
+ return EINA_TRUE;
+}
+
+static void
+_tt_text_replace_timed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Ecore_Timer *timer = evas_object_data_get(obj, "test-timer");
+ if (timer)
+ {
+ ecore_timer_del(timer);
+ evas_object_data_del(obj, "test-timer");
+ elm_object_text_set(obj, "Simple text tooltip, click to start"
+ " changed timed");
+ return;
+ }
+
+ timer = ecore_timer_add(1.5, _tt_text_replace_timer_cb, obj);
+ evas_object_data_set(obj, "test-timer", timer);
+ elm_object_text_set(obj, "Simple text tooltip, click to stop changed"
+ " timed");
+}
+
+static Evas_Object *
+_tt_icon(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ Evas_Object *tt)
+{
+ Evas_Object *ic = elm_icon_add(tt);
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png",
+ elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_resize(ic, 64, 64);
+ return ic;
+}
+
+static Evas_Object *
+_tt_icon2(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ Evas_Object *tt)
+{
+ Evas_Object *ic = elm_icon_add(tt);
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/icon_00.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_resize(ic, 64, 64);
+ return ic;
+}
+
+static void
+_tt_icon_del(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ // test to check for del_cb behavior!
+ printf("_tt_icon_del: data=%ld (== 123?), event_info=%p\n",
+ (long)(uintptr_t)data, event_info);
+}
+
+static Eina_Bool
+_tt_icon_replace_timer_cb(void *data)
+{
+ static int current = 0;
+
+ elm_object_tooltip_content_cb_set
+ (data, current ? _tt_icon2 : _tt_icon, NULL, NULL);
+
+ current = !current;
+ return EINA_TRUE;
+}
+
+static void
+_tt_icon_replace_timed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Ecore_Timer *timer = evas_object_data_get(obj, "test-timer");
+ if (timer)
+ {
+ ecore_timer_del(timer);
+ evas_object_data_del(obj, "test-timer");
+ elm_object_text_set(obj, "Icon tooltip, click to start changed"
+ " timed");
+ return;
+ }
+
+ timer = ecore_timer_add(1.5, _tt_icon_replace_timer_cb, obj);
+ evas_object_data_set(obj, "test-timer", timer);
+ elm_object_text_set(obj, "Icon tooltip, click to stop changed timed");
+}
+
+static Eina_Bool
+_tt_style_replace_timer_cb(void *data)
+{
+ static int current = 0;
+ elm_object_tooltip_style_set(data, current ? NULL : "transparent");
+ current = !current;
+ return EINA_TRUE;
+}
+
+static void
+_tt_style_replace_timed(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Ecore_Timer *timer = evas_object_data_get(obj, "test-timer");
+ if (timer)
+ {
+ ecore_timer_del(timer);
+ evas_object_data_del(obj, "test-timer");
+ elm_object_text_set(obj, "Icon tooltip style, click to start"
+ " changed timed");
+ return;
+ }
+
+ timer = ecore_timer_add(1.5, _tt_style_replace_timer_cb, obj);
+ evas_object_data_set(obj, "test-timer", timer);
+ elm_object_text_set(obj, "Icon tooltip style, click to stop changed"
+ " timed");
+}
+
+static void
+_tt_visible_lock_toggle(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ static int locked = 0;
+
+ locked = !locked;
+ if (locked)
+ {
+ elm_object_text_set(obj, "Locked tooltip visibility");
+ elm_object_tooltip_text_set(obj, "This tooltip is locked"
+ " visible,<br/> click the button"
+ " to unlock!");
+ elm_object_tooltip_show(obj);
+ }
+ else
+ {
+ elm_object_text_set(obj, "Unlocked tooltip visibility");
+ elm_object_tooltip_text_set(obj, "This tooltip is unlocked"
+ " visible,<br/> click the button"
+ " to lock!");
+ elm_object_tooltip_hide(obj);
+ }
+}
+
+void
+test_tooltip(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *tb, *bt, *se, *lst;
+ Elm_Object_Item *tb_it;
+ Elm_Object_Item *lit;
+
+ win = elm_win_util_standard_add("tooltip", "Tooltip");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ tb = elm_toolbar_add(win);
+ elm_toolbar_homogeneous_set(tb, EINA_FALSE);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(bx, tb);
+ evas_object_show(tb);
+
+ tb_it = elm_toolbar_item_append(tb, NULL, "Open", NULL, NULL);
+ elm_object_item_tooltip_text_set(tb_it, "Opens a file");
+
+ tb_it = elm_toolbar_item_append(tb, NULL, "Icon", NULL, NULL);
+ elm_object_item_tooltip_content_cb_set
+ (tb_it, _tt_item_icon, (void *)456L, _tt_item_icon_del);
+ elm_object_item_tooltip_style_set(tb_it, "transparent");
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Simple text tooltip");
+ elm_object_tooltip_text_set(bt, "Simple text tooltip");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Movement Freeze Tooltip, click to change");
+ elm_object_tooltip_text_set(bt, "Free");
+ evas_object_smart_callback_add(bt, "clicked", _tt_move_freeze, NULL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Orient Tooltip, click to change");
+ elm_object_tooltip_text_set(bt, "Top Left");
+ elm_object_tooltip_orient_set(bt, ELM_TOOLTIP_ORIENT_TOP_LEFT);
+ evas_object_smart_callback_add(bt, "clicked", _tt_orient_text_replace, NULL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Simple text tooltip, click to change");
+ elm_object_tooltip_text_set(bt, "Initial");
+ evas_object_smart_callback_add(bt, "clicked", _tt_text_replace, NULL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Simple text tooltip, click to start"
+ " changed timed");
+ elm_object_tooltip_text_set(bt, "Initial");
+ evas_object_smart_callback_add(bt, "clicked", _tt_text_replace_timed,
+ NULL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _tt_timer_del,
+ NULL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Icon tooltip");
+ elm_object_tooltip_content_cb_set(bt, _tt_icon, (void *)123L,
+ _tt_icon_del);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Icon tooltip, click to start changed timed");
+ elm_object_tooltip_content_cb_set(bt, _tt_icon, NULL, NULL);
+ evas_object_smart_callback_add(bt, "clicked", _tt_icon_replace_timed,
+ NULL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _tt_timer_del,
+ NULL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Transparent Icon tooltip");
+ elm_object_tooltip_content_cb_set(bt, _tt_icon, NULL, NULL);
+ elm_object_tooltip_style_set(bt, "transparent");
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Icon tooltip style, click to start changed"
+ " timed");
+ elm_object_tooltip_content_cb_set(bt, _tt_icon, NULL, NULL);
+ evas_object_smart_callback_add(bt, "clicked", _tt_style_replace_timed,
+ NULL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _tt_timer_del,
+ NULL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Unlocked tooltip visibility");
+ elm_object_tooltip_text_set(bt, "This tooltip is unlocked visible,<br/>"
+ " click the button to lock!");
+ evas_object_smart_callback_add(bt, "clicked", _tt_visible_lock_toggle,
+ NULL);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ se = elm_entry_add(win);
+ elm_entry_scrollable_set(se, EINA_TRUE);
+ evas_object_size_hint_weight_set(se, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(se, EVAS_HINT_FILL, 0.5);
+ elm_scroller_policy_set(se, ELM_SCROLLER_POLICY_OFF,
+ ELM_SCROLLER_POLICY_OFF);
+ elm_object_text_set(se, "Hello, some entry here!");
+ elm_object_tooltip_text_set(se, "Type something here!");
+ elm_entry_single_line_set(se, EINA_TRUE);
+ elm_box_pack_end(bx, se);
+ evas_object_show(se);
+
+ lst = elm_list_add(win);
+ lit = elm_list_item_append(lst, "Hello", NULL, NULL, NULL, NULL);
+ elm_object_item_tooltip_content_cb_set(lit, _tt_item_label, NULL, NULL);
+ elm_object_item_tooltip_window_mode_set(lit, EINA_TRUE);
+ lit = elm_list_item_append(lst, "Icon Tooltip", NULL, NULL, NULL, NULL);
+ elm_object_item_tooltip_content_cb_set(lit, _tt_item_icon, NULL, NULL);
+ lit = elm_list_item_append(lst, "Big Icon Tooltip", NULL, NULL, NULL, NULL);
+ elm_object_item_tooltip_content_cb_set(lit, _tt_item_icon2, NULL, NULL);
+ elm_object_item_tooltip_style_set(lit, "transparent");
+ elm_object_item_tooltip_window_mode_set(lit, EINA_TRUE);
+ lit = elm_list_item_append(lst, "Insanely Big Icon Tooltip", NULL, NULL, NULL, NULL);
+ elm_object_item_tooltip_content_cb_set(lit, _tt_item_icon3, NULL, NULL);
+ elm_object_item_tooltip_style_set(lit, "transparent");
+ elm_object_item_tooltip_window_mode_set(lit, EINA_TRUE);
+ evas_object_size_hint_weight_set(lst, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lst, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_min_set(lst, 100, 100);
+ elm_list_go(lst);
+ elm_box_pack_end(bx, lst);
+ evas_object_show(lst);
+
+ evas_object_resize(win, 320, 580);
+ evas_object_show(win);
+}
+
+void
+test_tooltip2(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *grid, *gl;
+ Elm_Object_Item *glit1, *glit2, *glit3;
+ static Testitem ti[144];
+ int i, n;
+ char buf[PATH_MAX];
+ const char *img[9] =
+ {
+ "panel_01.jpg",
+ "plant_01.jpg",
+ "rock_01.jpg",
+ "rock_02.jpg",
+ "sky_01.jpg",
+ "sky_02.jpg",
+ "sky_03.jpg",
+ "sky_04.jpg",
+ "wood_01.jpg",
+ };
+
+ win = elm_win_util_standard_add("tooltip2", "Tooltip 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ grid = elm_gengrid_add(win);
+ elm_gengrid_item_size_set(grid, 100, 100);
+ elm_gengrid_horizontal_set(grid, EINA_FALSE);
+ elm_gengrid_multi_select_set(grid, EINA_TRUE);
+ evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+
+ gic.item_style = "default";
+ gic.func.text_get = grdt_lbl_get;
+ gic.func.content_get = grdt_content_get;
+
+ n = 0;
+ for (i = 0; i < 9; i++)
+ {
+ snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(),
+ img[n]);
+ n++;
+ ti[i].mode = i;
+ ti[i].path = eina_stringshare_add(buf);
+ ti[i].item = elm_gengrid_item_append(grid, &gic, &(ti[i]), NULL,
+ NULL);
+ if (n % 2)
+ elm_gengrid_item_tooltip_text_set(ti[i].item, "Testing X");
+ else
+ elm_gengrid_item_tooltip_text_set(ti[i].item, "Testing Y");
+ if (!(i % 5))
+ elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE);
+ }
+
+ elm_box_pack_end(bx, grid);
+ evas_object_show(grid);
+
+ gl = elm_genlist_add(win);
+ evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+
+ itct.item_style = "default";
+ itct.func.text_get = gltt_text_get;
+
+ glit1 = elm_genlist_item_append(gl, &itct, (void *)1, NULL,
+ ELM_GENLIST_ITEM_TREE, NULL, NULL);
+ glit2 = elm_genlist_item_append(gl, &itct, (void *)2, NULL,
+ ELM_GENLIST_ITEM_TREE, NULL, NULL);
+ glit3 = elm_genlist_item_append(gl, &itct, (void *)3, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ elm_genlist_item_tooltip_text_set(glit1, "Testing 1");
+ elm_genlist_item_tooltip_text_set(glit2, "Testing 2");
+ elm_genlist_item_tooltip_text_set(glit3, "Testing 3");
+
+ evas_object_smart_callback_add(gl, "expand,request", gltt_exp_req, gl);
+ evas_object_smart_callback_add(gl, "contract,request", gltt_con_req,
+ gl);
+ evas_object_smart_callback_add(gl, "expanded", gltt_exp, gl);
+ evas_object_smart_callback_add(gl, "contracted", gltt_con, gl);
+
+ elm_box_pack_end(bx, gl);
+ evas_object_show(gl);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+void
+test_tooltip3(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *rect;
+
+ win = elm_win_util_standard_add("tooltip3", "Tooltip 3");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "I have layer 200, below rect has layer 100.");
+ elm_object_tooltip_text_set(bt, "Can you see me?");
+ evas_object_resize(bt, 250, 30);
+ evas_object_move(bt, 25, 135);
+ evas_object_layer_set(bt, 200);
+ evas_object_show(bt);
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(bt));
+ evas_object_resize(rect, 150, 300);
+ evas_object_move(rect, 0, 0);
+ evas_object_show(rect);
+ evas_object_layer_set(rect, 100);
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_transit.c b/src/bin/elementary/test_transit.c
new file mode 100644
index 0000000000..17b3911d39
--- /dev/null
+++ b/src/bin/elementary/test_transit.c
@@ -0,0 +1,770 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define TWEEN_NUM 7
+#define BTN_NUM (TWEEN_NUM + 1)
+#define BTN_W 50
+#define BTN_H 50
+#define WIN_H (BTN_NUM * BTN_H)
+#define WIN_W WIN_H
+#define TRANSIT_DURATION 1.0
+
+typedef struct _Custom_Effect Custom_Effect;
+
+struct _Custom_Effect
+{
+ struct _size
+ {
+ Evas_Coord w, h;
+ } from, to;
+};
+
+static void
+_transit_revert(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans = (Elm_Transit*)data;
+ elm_transit_revert(trans);
+}
+
+static void
+_transit_rev_cb_del(void *data, Elm_Transit *trans EINA_UNUSED)
+{
+ Evas_Object *rev_bt = (Evas_Object*)data;
+ evas_object_smart_callback_del(rev_bt, "clicked", _transit_revert);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+}
+
+static void
+_custom_op(Elm_Transit_Effect *effect, Elm_Transit *transit, double progress)
+{
+ if (!effect) return;
+ Evas_Coord w, h;
+ Evas_Object *obj;
+ const Eina_List *elist;
+
+ Custom_Effect *custom_effect = effect;
+ const Eina_List *objs = elm_transit_objects_get(transit);
+
+ if (progress < 0.5)
+ {
+ h = custom_effect->from.h + (custom_effect->to.h * progress * 2);
+ w = custom_effect->from.w;
+ }
+ else
+ {
+ h = custom_effect->from.h + custom_effect->to.h;
+ w = custom_effect->from.w + \
+ (custom_effect->to.w * (progress - 0.5) * 2);
+ }
+
+ EINA_LIST_FOREACH(objs, elist, obj)
+ evas_object_resize(obj, w, h);
+}
+
+static Elm_Transit_Effect *
+_custom_context_new(Evas_Coord from_w, Evas_Coord from_h, Evas_Coord to_w, Evas_Coord to_h)
+{
+ Custom_Effect *custom_effect;
+
+ custom_effect = calloc(1, sizeof(Custom_Effect));
+ if (!custom_effect) return NULL;
+
+ custom_effect->from.w = from_w;
+ custom_effect->from.h = from_h;
+ custom_effect->to.w = to_w - from_w;
+ custom_effect->to.h = to_h - from_h;
+
+ return custom_effect;
+}
+
+static void
+_custom_context_free(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
+{
+ Custom_Effect *custom_effect = effect;
+ free(custom_effect);
+}
+
+static void
+_transit_rotation_color(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans;
+
+ trans = elm_transit_add();
+ elm_transit_object_add(trans, obj);
+ elm_transit_auto_reverse_set(trans, EINA_TRUE);
+ elm_transit_repeat_times_set(trans, 2);
+
+ /* Color Effect */
+ elm_transit_effect_color_add(trans, 100, 255, 100, 255, 50, 30, 50, 50);
+
+ /* Rotation Effect */
+ elm_transit_effect_rotation_add(trans, 0.0, 135.0);
+
+ elm_transit_duration_set(trans, 5.0);
+ elm_transit_go(trans);
+}
+
+static void
+_transit_wipe(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans;
+
+ trans = elm_transit_add();
+ elm_transit_object_add(trans, obj);
+ elm_transit_auto_reverse_set(trans, EINA_TRUE);
+
+ elm_transit_effect_wipe_add(trans,
+ ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE,
+ ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT);
+
+ elm_transit_duration_set(trans, 5.0);
+ elm_transit_go(trans);
+}
+
+static void
+_transit_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
+{
+ evas_object_freeze_events_set(data, EINA_FALSE);
+}
+
+static void
+_transit_image_animation(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Eina_List *images = NULL;
+ char buf[PATH_MAX];
+ Elm_Transit *trans;
+ Evas_Object *ic = data;
+
+ snprintf(buf, sizeof(buf), "%s/images/icon_19.png", elm_app_data_dir_get());
+ images = eina_list_append(images, eina_stringshare_add(buf));
+
+ snprintf(buf, sizeof(buf), "%s/images/icon_00.png", elm_app_data_dir_get());
+ images = eina_list_append(images, eina_stringshare_add(buf));
+
+ snprintf(buf, sizeof(buf), "%s/images/icon_11.png", elm_app_data_dir_get());
+ images = eina_list_append(images, eina_stringshare_add(buf));
+
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ images = eina_list_append(images, eina_stringshare_add(buf));
+
+ trans = elm_transit_add();
+ elm_transit_del_cb_set(trans, _transit_del_cb, obj);
+ elm_transit_object_add(trans, ic);
+ elm_transit_effect_image_animation_add(trans, images);
+ elm_transit_duration_set(trans, 5.0);
+ elm_transit_go(trans);
+
+ evas_object_freeze_events_set(obj, EINA_TRUE);
+}
+
+static void
+_transit_resizing(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans;
+ Evas_Object *rev_bt = (Evas_Object*)data;
+ elm_object_disabled_set(rev_bt, EINA_FALSE);
+ trans = elm_transit_add();
+ elm_transit_object_add(trans, obj);
+ elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt);
+
+ evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans);
+ elm_transit_effect_resizing_add(trans, 100, 50, 300, 150);
+
+ elm_transit_duration_set(trans, 5.0);
+ elm_transit_go(trans);
+}
+
+static void
+_transit_flip(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans;
+ Evas_Object *obj2 = data;
+ Evas_Object *rev_bt = (Evas_Object*)evas_object_data_get(obj, "revert");
+ elm_object_disabled_set(rev_bt, EINA_FALSE);
+
+ trans = elm_transit_add();
+ elm_transit_object_add(trans, obj);
+ elm_transit_object_add(trans, obj2);
+ elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt);
+
+ evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans);
+ elm_transit_effect_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_X, EINA_TRUE);
+
+ elm_transit_duration_set(trans, 5.0);
+ elm_transit_go(trans);
+}
+
+static void
+_transit_zoom(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans;
+
+ trans = elm_transit_add();
+ Evas_Object *rev_bt = (Evas_Object*)data;
+ elm_object_disabled_set(rev_bt, EINA_FALSE);
+ elm_transit_object_add(trans, obj);
+ elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt);
+
+ evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans);
+ elm_transit_effect_zoom_add(trans, 1.0, 3.0);
+
+ elm_transit_duration_set(trans, 5.0);
+ elm_transit_go(trans);
+}
+
+static void
+_transit_blend(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans;
+ Evas_Object *obj2 = data;
+ Evas_Object *rev_bt = (Evas_Object*)evas_object_data_get(obj, "revert");
+ elm_object_disabled_set(rev_bt, EINA_FALSE);
+
+ trans = elm_transit_add();
+ elm_transit_object_add(trans, obj);
+ elm_transit_object_add(trans, obj2);
+ elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt);
+
+ evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans);
+
+ elm_transit_effect_blend_add(trans);
+
+ elm_transit_duration_set(trans, 5.0);
+ elm_transit_go(trans);
+}
+
+static void
+_transit_fade(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans;
+ Evas_Object *obj2 = data;
+ Evas_Object *rev_bt = (Evas_Object*)evas_object_data_get(obj, "revert");
+ elm_object_disabled_set(rev_bt, EINA_FALSE);
+
+ trans = elm_transit_add();
+ elm_transit_object_add(trans, obj);
+ elm_transit_object_add(trans, obj2);
+ elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt);
+
+ evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans);
+
+ elm_transit_effect_fade_add(trans);
+
+ elm_transit_duration_set(trans, 5.0);
+ elm_transit_go(trans);
+}
+
+static void
+_transit_resizable_flip(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans;
+ Evas_Object *obj2 = data;
+
+ trans = elm_transit_add();
+ elm_transit_object_add(trans, obj);
+ elm_transit_object_add(trans, obj2);
+
+ elm_transit_effect_resizable_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_Y, EINA_TRUE);
+
+ elm_transit_duration_set(trans, 5.0);
+ elm_transit_go(trans);
+}
+
+static void
+_transit_tween_del_cb(void *data, Elm_Transit *trans EINA_UNUSED)
+{
+ Evas_Object *btn = data;
+ int disabled = (int)(uintptr_t)evas_object_data_get(btn, "disabled");
+ if (disabled > 0)
+ evas_object_data_set(btn, "disabled", (void *)(uintptr_t)(--disabled));
+ if (disabled == 0) elm_object_disabled_set(btn, EINA_FALSE);
+}
+
+static void
+_transit_tween(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Transit_Tween_Mode ettm;
+ Elm_Transit *trans;
+ Evas_Coord x;
+ Evas_Object *bt_all = data;
+ int disabled;
+
+ evas_object_geometry_get(obj, &x, NULL, NULL, NULL);
+ ettm = (Elm_Transit_Tween_Mode) evas_object_data_get(obj, "tween");
+
+ trans = elm_transit_add();
+ elm_transit_tween_mode_set(trans, ettm);
+ elm_transit_effect_translation_add(trans, 0, 0,
+ ((x ? -1 : 1) * (WIN_W - BTN_W)), 0);
+ elm_transit_object_add(trans, obj);
+ elm_transit_duration_set(trans, TRANSIT_DURATION);
+ elm_transit_objects_final_state_keep_set(trans, EINA_TRUE);
+ elm_transit_del_cb_set(trans, _transit_tween_del_cb, bt_all);
+ elm_transit_go(trans);
+
+ disabled = (int)(uintptr_t)evas_object_data_get(bt_all, "disabled");
+ evas_object_data_set(bt_all, "disabled", (void *)(uintptr_t)(++disabled));
+ elm_object_disabled_set(bt_all, EINA_TRUE);
+}
+
+static void
+_transit_tween_all(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object **bt = data;
+ Elm_Transit *trans;
+ Evas_Coord x;
+ int i;
+
+ for (i = 0; i < TWEEN_NUM; i++)
+ {
+ evas_object_geometry_get(bt[i], &x, NULL, NULL, NULL);
+
+ trans = elm_transit_add();
+ elm_transit_tween_mode_set(trans, i);
+ elm_transit_effect_translation_add(trans, 0, 0,
+ ((x ? -1 : 1) * (WIN_W - BTN_W)), 0);
+ elm_transit_object_add(trans, bt[i]);
+ elm_transit_duration_set(trans, TRANSIT_DURATION);
+ elm_transit_objects_final_state_keep_set(trans, EINA_TRUE);
+ elm_transit_del_cb_set(trans, _transit_tween_del_cb, obj);
+ elm_transit_go(trans);
+ }
+
+ elm_object_disabled_set(obj, EINA_TRUE);
+}
+
+static void
+_win_delete_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object **bt = data;
+ free(bt);
+}
+
+/* Translation, Rotation, Color, Wipe, ImagemAnimation Effect */
+void
+test_transit(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bt, *ic;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("transit", "Transit");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ ic = elm_image_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/icon_11.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Image Animation");
+ elm_object_part_content_set(bt, "icon", ic);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_show(ic);
+ evas_object_smart_callback_add(bt, "clicked", _transit_image_animation, ic);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rotation + Color");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked",
+ _transit_rotation_color, NULL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Wipe Effect");
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", _transit_wipe, NULL);
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
+
+/* Resizing Effect */
+void
+test_transit_resizing(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *rev_bt;
+
+ win = elm_win_util_standard_add("transit2", "Transit Resizing");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Resizing Effect");
+ evas_object_show(bt);
+ evas_object_move(bt, 50, 100);
+ evas_object_resize(bt, 100, 50);
+
+ rev_bt = elm_button_add(win);
+ elm_object_text_set(rev_bt, "Revert");
+ evas_object_resize(rev_bt, 100, 50);
+ evas_object_move(rev_bt, 50, 300);
+ evas_object_show(rev_bt);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+
+ evas_object_smart_callback_add(bt, "clicked", _transit_resizing, rev_bt);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
+
+/* Flip Effect */
+void
+test_transit_flip(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *bt2, *rev_bt;
+
+ win = elm_win_util_standard_add("transit3", "Transit Flip");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Front Button - Flip Effect");
+ evas_object_show(bt);
+ evas_object_move(bt, 50, 50);
+ evas_object_resize(bt, 200, 200);
+
+ bt2 = elm_button_add(win);
+ elm_object_text_set(bt2, "Back Button - Flip Effect");
+ evas_object_move(bt2, 50, 50);
+ evas_object_resize(bt2, 200, 200);
+
+ rev_bt = elm_button_add(win);
+ elm_object_text_set(rev_bt, "Revert");
+ evas_object_resize(rev_bt, 100, 50);
+ evas_object_move(rev_bt, 50, 300);
+ evas_object_show(rev_bt);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+ evas_object_data_set(bt, "revert", rev_bt);
+ evas_object_data_set(bt2, "revert", rev_bt);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+
+ evas_object_smart_callback_add(bt, "clicked", _transit_flip, bt2);
+ evas_object_smart_callback_add(bt2, "clicked", _transit_flip, bt);
+}
+
+/* Zoom Effect */
+void
+test_transit_zoom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *rev_bt;
+
+ win = elm_win_util_standard_add("transit4", "Transit Zoom");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Zoom Effect");
+ evas_object_resize(bt, 100, 50);
+ evas_object_move(bt, 100, 125);
+ evas_object_show(bt);
+
+ rev_bt = elm_button_add(win);
+ elm_object_text_set(rev_bt, "Revert");
+ evas_object_resize(rev_bt, 100, 50);
+ evas_object_move(rev_bt, 100, 250);
+ evas_object_show(rev_bt);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+
+ evas_object_smart_callback_add(bt, "clicked", _transit_zoom, rev_bt);
+
+ evas_object_resize(win, 300, 300);
+ evas_object_show(win);
+}
+
+/* Blend Effect */
+void
+test_transit_blend(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *bt2, *ic, *rev_bt;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("transit5", "Transit Blend");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ic = elm_image_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_max_set(ic, 50, 50);
+
+ bt = elm_button_add(win);
+ elm_object_part_content_set(bt, "icon", ic);
+ elm_object_text_set(bt, "Before Button - Blend Effect");
+ evas_object_move(bt, 25, 125);
+ evas_object_resize(bt, 250, 50);
+ evas_object_show(bt);
+
+ ic = elm_image_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/rock_02.jpg", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_max_set(ic, 50, 50);
+
+ bt2 = elm_button_add(win);
+ elm_object_part_content_set(bt2, "icon", ic);
+ elm_object_text_set(bt2, "After Button - Blend Effect");
+ evas_object_move(bt2, 25, 125);
+ evas_object_resize(bt2, 250, 50);
+
+ rev_bt = elm_button_add(win);
+ elm_object_text_set(rev_bt, "Revert");
+ evas_object_resize(rev_bt, 100, 50);
+ evas_object_move(rev_bt, 50, 300);
+ evas_object_show(rev_bt);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+ evas_object_data_set(bt, "revert", rev_bt);
+ evas_object_data_set(bt2, "revert", rev_bt);
+
+ evas_object_resize(win, 300, 400);
+ evas_object_show(win);
+
+ evas_object_smart_callback_add(bt, "clicked", _transit_blend, bt2);
+ evas_object_smart_callback_add(bt2, "clicked", _transit_blend, bt);
+}
+
+/* Fade Effect */
+void
+test_transit_fade(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *bt2, *ic, *rev_bt;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("transit6","Transit Fade");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ ic = elm_image_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_max_set(ic, 50, 50);
+
+ bt = elm_button_add(win);
+ elm_object_part_content_set(bt, "icon", ic);
+ elm_object_text_set(bt, "Before Button - Fade Effect");
+ evas_object_move(bt, 25, 125);
+ evas_object_resize(bt, 250, 50);
+ evas_object_show(bt);
+
+ ic = elm_image_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/rock_02.jpg", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_max_set(ic, 50, 50);
+
+ bt2 = elm_button_add(win);
+ elm_object_part_content_set(bt2, "icon", ic);
+ elm_object_text_set(bt2, "After Button - Fade Effect");
+ evas_object_move(bt2, 25, 125);
+ evas_object_resize(bt2, 250, 50);
+
+ rev_bt = elm_button_add(win);
+ elm_object_text_set(rev_bt, "Revert");
+ evas_object_resize(rev_bt, 100, 50);
+ evas_object_move(rev_bt, 50, 300);
+ evas_object_show(rev_bt);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+ evas_object_data_set(bt, "revert", rev_bt);
+ evas_object_data_set(bt2, "revert", rev_bt);
+
+ evas_object_resize(win, 300, 400);
+ evas_object_show(win);
+
+ evas_object_smart_callback_add(bt, "clicked", _transit_fade, bt2);
+ evas_object_smart_callback_add(bt2, "clicked", _transit_fade, bt);
+}
+
+/* Resizable Flip Effect */
+void
+test_transit_resizable_flip(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *bt2;
+
+ win = elm_win_util_standard_add("transit7", "Transit Resizable Flip");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Front Button - Resizable Flip Effect");
+ evas_object_show(bt);
+ evas_object_move(bt, 50, 100);
+ evas_object_resize(bt, 250, 30);
+
+ bt2 = elm_button_add(win);
+ elm_object_text_set(bt2, "Back Button - Resizable Flip Effect");
+ evas_object_move(bt2, 50, 100);
+ evas_object_resize(bt2, 300, 200);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+
+ evas_object_smart_callback_add(bt, "clicked", _transit_resizable_flip, bt2);
+ evas_object_smart_callback_add(bt2, "clicked", _transit_resizable_flip, bt);
+}
+
+/* Custom Effect */
+void
+test_transit_custom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt;
+ Elm_Transit *trans;
+ Elm_Transit_Effect *effect_context;
+
+ win = elm_win_util_standard_add("transit8", "Transit Custom");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Button - Custom Effect");
+ evas_object_show(bt);
+ evas_object_move(bt, 50, 50);
+ evas_object_resize(bt, 150, 150);
+
+ /* Adding Transit */
+ trans = elm_transit_add();
+ elm_transit_auto_reverse_set(trans, EINA_TRUE);
+ elm_transit_tween_mode_set(trans, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
+ effect_context = _custom_context_new(150, 150, 50, 50);
+ elm_transit_object_add(trans, bt);
+ elm_transit_effect_add(trans,
+ _custom_op, effect_context,
+ _custom_context_free);
+ elm_transit_duration_set(trans, 5.0);
+ elm_transit_repeat_times_set(trans, -1);
+ elm_transit_go(trans);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Revert");
+ evas_object_resize(bt, 150, 50);
+ evas_object_move(bt, 50, 250);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", _transit_revert, trans);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
+
+/* Chain Transit Effect */
+void
+test_transit_chain(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bt, *bt2, *bt3, *bt4;
+ Elm_Transit *trans, *trans2, *trans3, *trans4;
+
+ win = elm_win_util_standard_add("transit9", "Transit Chain");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Chain 1");
+ evas_object_resize(bt, 100, 100);
+ evas_object_move(bt, 0, 0);
+ evas_object_show(bt);
+
+ bt2 = elm_button_add(win);
+ elm_object_text_set(bt2, "Chain 2");
+ evas_object_resize(bt2, 100, 100);
+ evas_object_move(bt2, 300, 0);
+ evas_object_show(bt2);
+
+ bt3 = elm_button_add(win);
+ elm_object_text_set(bt3, "Chain 3");
+ evas_object_resize(bt3, 100, 100);
+ evas_object_move(bt3, 300, 300);
+ evas_object_show(bt3);
+
+ bt4 = elm_button_add(win);
+ elm_object_text_set(bt4, "Chain 4");
+ evas_object_resize(bt4, 100, 100);
+ evas_object_move(bt4, 0, 300);
+ evas_object_show(bt4);
+
+ trans = elm_transit_add();
+ elm_transit_tween_mode_set(trans, ELM_TRANSIT_TWEEN_MODE_ACCELERATE);
+ elm_transit_effect_translation_add(trans, 0, 0, 300, 0);
+ elm_transit_object_add(trans, bt);
+ elm_transit_duration_set(trans, 1);
+ elm_transit_objects_final_state_keep_set(trans, EINA_TRUE);
+ elm_transit_go(trans);
+
+ trans2 = elm_transit_add();
+ elm_transit_tween_mode_set(trans2, ELM_TRANSIT_TWEEN_MODE_ACCELERATE);
+ elm_transit_effect_translation_add(trans2, 0, 0, 0, 300);
+ elm_transit_object_add(trans2, bt2);
+ elm_transit_duration_set(trans2, 1);
+ elm_transit_objects_final_state_keep_set(trans2, EINA_TRUE);
+ elm_transit_chain_transit_add(trans, trans2);
+
+ trans3 = elm_transit_add();
+ elm_transit_tween_mode_set(trans3, ELM_TRANSIT_TWEEN_MODE_ACCELERATE);
+ elm_transit_effect_translation_add(trans3, 0, 0, -300, 0);
+ elm_transit_object_add(trans3, bt3);
+ elm_transit_duration_set(trans3, 1);
+ elm_transit_objects_final_state_keep_set(trans3, EINA_TRUE);
+ elm_transit_chain_transit_add(trans2, trans3);
+
+ trans4 = elm_transit_add();
+ elm_transit_tween_mode_set(trans4, ELM_TRANSIT_TWEEN_MODE_ACCELERATE);
+ elm_transit_effect_translation_add(trans4, 0, 0, 0, -300);
+ elm_transit_object_add(trans4, bt4);
+ elm_transit_duration_set(trans4, 1);
+ elm_transit_objects_final_state_keep_set(trans4, EINA_TRUE);
+ elm_transit_chain_transit_add(trans3, trans4);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
+
+/* Transit Tween Mode */
+void
+test_transit_tween(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *label;
+ Evas_Object **bt = malloc(sizeof(Evas_Object *) * BTN_NUM);
+ int i;
+
+ char *modes[] = {"LINEAR", "SINUSOIDAL", "DECELERATE", "ACCELERATE",
+ "DIVISOR_INTERP", "BOUNCE", "SPRING"};
+
+ win = elm_win_add(NULL, "transit10", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Transit Tween");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_smart_callback_add(win, "delete,request", _win_delete_cb, bt);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_min_set(bg, WIN_W, WIN_H);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ bt[TWEEN_NUM] = elm_button_add(win);
+ elm_object_text_set(bt[TWEEN_NUM], "Go All");
+ evas_object_resize(bt[TWEEN_NUM], WIN_W, BTN_H);
+ evas_object_move(bt[TWEEN_NUM], 0, (WIN_H - BTN_H));
+ evas_object_show(bt[TWEEN_NUM]);
+ evas_object_smart_callback_add(bt[TWEEN_NUM], "clicked", _transit_tween_all,
+ bt);
+
+ for (i = 0; i < TWEEN_NUM; i++)
+ {
+ label = elm_label_add(win);
+ elm_object_text_set(label, modes[i]);
+ evas_object_resize(label, WIN_W, BTN_H);
+ evas_object_move(label, 0, (i * BTN_H));
+ evas_object_show(label);
+
+ bt[i] = elm_button_add(win);
+ evas_object_data_set(bt[i], "tween", (void *)(uintptr_t)i);
+ elm_object_text_set(bt[i], "Go");
+ evas_object_resize(bt[i], BTN_W, BTN_H);
+ evas_object_move(bt[i], 0, (i * BTN_H));
+ evas_object_show(bt[i]);
+ evas_object_smart_callback_add(bt[i], "clicked", _transit_tween,
+ bt[TWEEN_NUM]);
+ }
+
+ evas_object_resize(win, WIN_W, WIN_H);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_transit_bezier.c b/src/bin/elementary/test_transit_bezier.c
new file mode 100644
index 0000000000..d448666327
--- /dev/null
+++ b/src/bin/elementary/test_transit_bezier.c
@@ -0,0 +1,315 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define SEGMENT_MAX 200
+#define WIN_W 400
+#define BTN_SIZE 50
+#define WIN_H (400 + BTN_SIZE)
+#define CTRL_W 15
+#define CTRL_H 15
+
+typedef struct
+{
+ Evas *e;
+ Evas_Object *win;
+ Evas_Object *rev_btn;
+ Evas_Object *ctrl_pt1;
+ Evas_Object *ctrl_pt2;
+ Evas_Object *ctrl_pt1_line;
+ Evas_Object *ctrl_pt2_line;
+ Evas_Object *label;
+ Evas_Object *line[SEGMENT_MAX];
+ Eina_Bool ctrl_pt1_down;
+ Eina_Bool ctrl_pt2_down;
+} transit_data;
+
+static void
+_transit_revert(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans = (Elm_Transit*)data;
+ elm_transit_revert(trans);
+}
+
+static void
+v_get(transit_data *td, double *v1, double *v2, double *v3, double *v4)
+{
+ Evas_Coord x, w, y, h;
+
+ //update control points values
+ evas_object_geometry_get(td->ctrl_pt1, &x, &y, &w, &h);
+ *v1 = (double) (x - (w/2)) / WIN_W;
+ *v2 = 1 - (double) (y - (h/2)) / (WIN_H - BTN_SIZE);
+
+ evas_object_geometry_get(td->ctrl_pt2, &x, &y, &w, &h);
+ *v3 = (double) (x - (w/2)) / WIN_W;
+ *v4 = 1 - (double) (y - (h/2)) / (WIN_H - BTN_SIZE);
+}
+
+static void
+update_curve(transit_data *td)
+{
+ double v[4];
+ int i = 0;
+ double progress;
+ Evas_Coord prev_x = 0, prev_y = (WIN_H - BTN_SIZE - 1);
+ Evas_Coord cur_x, cur_y;
+ double tx, ty;
+ char buf[256];
+
+ v_get(td, &v[0], &v[1], &v[2], &v[3]);
+
+ for (i = 0; i < SEGMENT_MAX; i++)
+ {
+ progress = (((double) i) / (SEGMENT_MAX - 1));
+
+ tx = (pow((1 - progress), 3) * 0) +
+ (3 * progress * pow((1 - progress), 2) * v[0]) +
+ (3 * pow(progress, 2) * (1 - progress) * v[2]) +
+ (pow(progress, 3) * 1);
+ ty = (pow((1 - progress), 3) * 0) +
+ (3 * progress * pow((1 - progress), 2) * v[1]) +
+ (3 * pow(progress, 2) * (1 - progress) * v[3]) +
+ (pow(progress, 3) * 1);
+
+ cur_x = (int)(tx * WIN_W);
+ cur_y = ((WIN_H - BTN_SIZE - 1) - ((int)(ty * (WIN_H - BTN_SIZE))));
+ evas_object_line_xy_set(td->line[i], prev_x, prev_y, cur_x, cur_y);
+ evas_object_anti_alias_set(td->line[i], EINA_TRUE);
+ evas_object_color_set(td->line[i], 255, 50, 50, 255);
+ prev_x = cur_x;
+ prev_y = cur_y;
+ }
+ snprintf(buf, sizeof(buf),
+ "<align=left><b>Control Points:</b></br>"
+ "x1: %0.2f y1: %0.2f</br>"
+ "x2: %0.2f y2: %0.2f</align>",
+ v[0], v[1], v[2], v[3]);
+ elm_object_text_set(td->label, buf);
+}
+
+static void
+ctrl_pt1_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+ Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev = event_info;
+ transit_data *td = data;
+ Evas_Coord x, y, w, h;
+
+ if (!td->ctrl_pt1_down) return;
+
+ evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+
+ x = (ev->cur.canvas.x - (w/2));
+ y = (ev->cur.canvas.y - (h/2));
+ if (x < -(w/2)) x = -(w/2);
+ if (y < -(h/2)) y = -(h/2);
+ if (x > WIN_W) x = WIN_W - (w/2);
+ if (y > WIN_H) y = WIN_H - (h/2);
+ evas_object_move(obj, x, y);
+ evas_object_line_xy_set(td->ctrl_pt1_line,
+ (x + (w/2)), (y + (h/2)), 0, WIN_W);
+ update_curve(td);
+}
+
+static void
+ctrl_pt2_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+ Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev = event_info;
+ transit_data *td = data;
+ Evas_Coord x, y, w, h;
+
+ if (!td->ctrl_pt2_down) return;
+
+ evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+
+ x = (ev->cur.canvas.x - (w/2));
+ y = (ev->cur.canvas.y - (h/2));
+ if (x < -(w/2)) x = -(w/2);
+ if (y < -(h/2)) y = -(h/2);
+ if (x > WIN_W) x = WIN_W - (w/2);
+ if (y > WIN_H) y = WIN_H - (h/2);
+ evas_object_move(obj, x, y);
+ evas_object_line_xy_set(td->ctrl_pt2_line,
+ (x + (w/2)), (y + (h/2)), WIN_W, 0);
+ update_curve(td);
+}
+
+static void
+ctrl_pt1_mouse_down_cb(void *data, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ transit_data *td = data;
+ td->ctrl_pt1_down = EINA_TRUE;
+}
+
+static void
+ctrl_pt1_mouse_up_cb(void *data, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ transit_data *td = data;
+ td->ctrl_pt1_down = EINA_FALSE;
+}
+
+static void
+ctrl_pt2_mouse_down_cb(void *data, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ transit_data *td = data;
+ td->ctrl_pt2_down = EINA_TRUE;
+}
+
+static void
+ctrl_pt2_mouse_up_cb(void *data, Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ transit_data *td = data;
+ td->ctrl_pt2_down = EINA_FALSE;
+}
+
+static void
+transit_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
+{
+ transit_data *td = data;
+ evas_object_show(td->ctrl_pt1);
+ evas_object_show(td->ctrl_pt2);
+ evas_object_show(td->ctrl_pt1_line);
+ evas_object_show(td->ctrl_pt2_line);
+ evas_object_smart_callback_del(td->rev_btn, "clicked", _transit_revert);
+ elm_object_disabled_set(td->rev_btn, EINA_TRUE);
+}
+
+static void
+btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ double v[4];
+ transit_data *td = data;
+ v_get(td, &v[0], &v[1], &v[2], &v[3]);
+
+ Elm_Transit *transit = elm_transit_add();
+ elm_transit_object_add(transit, obj);
+ elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE);
+ elm_transit_tween_mode_factor_n_set(transit, 4, v);
+ elm_transit_effect_translation_add(transit, 0, 0, (WIN_W - BTN_SIZE), 0);
+ elm_transit_auto_reverse_set(transit, EINA_TRUE);
+ elm_transit_del_cb_set(transit, transit_del_cb, td);
+ elm_transit_duration_set(transit, 1);
+ elm_transit_go(transit);
+ evas_object_smart_callback_add(td->rev_btn, "clicked", _transit_revert, transit);
+ elm_object_disabled_set(td->rev_btn, EINA_FALSE);
+
+ evas_object_hide(td->ctrl_pt1);
+ evas_object_hide(td->ctrl_pt2);
+ evas_object_hide(td->ctrl_pt1_line);
+ evas_object_hide(td->ctrl_pt2_line);
+}
+
+void
+test_transit_bezier(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ static transit_data td;
+ char buf[PATH_MAX];
+ Evas_Object *bg;
+ int i;
+
+ memset(&td, 0x0, sizeof(td));
+
+ //Win
+ td.win = elm_win_add(NULL, "test", ELM_WIN_BASIC);
+ elm_win_title_set(td.win, "Transit Bezier");
+ elm_win_autodel_set(td.win, EINA_TRUE);
+
+ td.e = evas_object_evas_get(td.win);
+
+ //BG. Fix window size
+ bg = elm_bg_add(td.win);
+ evas_object_size_hint_min_set(bg, WIN_W, WIN_H);
+ elm_win_resize_object_add(td.win, bg);
+ evas_object_show(bg);
+
+ snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
+
+ //Create Lines
+ for (i = 0; i < SEGMENT_MAX; i++)
+ {
+ td.line[i] = evas_object_line_add(td.e);
+ evas_object_resize(td.line[i], WIN_W, (WIN_H - BTN_SIZE));
+ evas_object_show(td.line[i]);
+ }
+
+ //Control Point 1 Line
+ td.ctrl_pt1_line = evas_object_line_add(td.e);
+ evas_object_pass_events_set(td.ctrl_pt1_line, EINA_TRUE);
+ evas_object_resize(td.ctrl_pt1_line, WIN_W, WIN_H);
+ evas_object_anti_alias_set(td.ctrl_pt1_line, EINA_TRUE);
+ evas_object_color_set(td.ctrl_pt1_line, 0, 174, 219, 255);
+ evas_object_line_xy_set(td.ctrl_pt1_line, 0, WIN_W,
+ (100 + (CTRL_W/2)) , (300 + (CTRL_H/2)));
+ evas_object_show(td.ctrl_pt1_line);
+
+ //Control Point 1
+ td.ctrl_pt1 = evas_object_image_filled_add(td.e);
+ evas_object_image_file_set(td.ctrl_pt1, buf, NULL);
+ evas_object_resize(td.ctrl_pt1, CTRL_W, CTRL_H);
+ evas_object_move(td.ctrl_pt1, 100, 300);
+ evas_object_event_callback_add(td.ctrl_pt1, EVAS_CALLBACK_MOUSE_MOVE,
+ ctrl_pt1_mouse_move_cb, &td);
+ evas_object_event_callback_add(td.ctrl_pt1, EVAS_CALLBACK_MOUSE_DOWN,
+ ctrl_pt1_mouse_down_cb, &td);
+ evas_object_event_callback_add(td.ctrl_pt1, EVAS_CALLBACK_MOUSE_UP,
+ ctrl_pt1_mouse_up_cb, &td);
+ evas_object_show(td.ctrl_pt1);
+
+ //Control Point 2 Line
+ td.ctrl_pt2_line = evas_object_line_add(td.e);
+ evas_object_pass_events_set(td.ctrl_pt2_line, EINA_TRUE);
+ evas_object_resize(td.ctrl_pt2_line, WIN_W, WIN_H);
+ evas_object_anti_alias_set(td.ctrl_pt2_line, EINA_TRUE);
+ evas_object_color_set(td.ctrl_pt2_line, 219, 174, 0, 255);
+ evas_object_line_xy_set(td.ctrl_pt2_line, WIN_W, 0,
+ (300 + (CTRL_W/2)), (100 + (CTRL_H/2)));
+ evas_object_show(td.ctrl_pt2_line);
+
+ //Control Point 2
+ td.ctrl_pt2 = evas_object_image_filled_add(td.e);
+ evas_object_image_file_set(td.ctrl_pt2, buf, NULL);
+ evas_object_resize(td.ctrl_pt2, CTRL_W, CTRL_H);
+ evas_object_move(td.ctrl_pt2, 300, 100);
+ evas_object_event_callback_add(td.ctrl_pt2, EVAS_CALLBACK_MOUSE_MOVE,
+ ctrl_pt2_mouse_move_cb, &td);
+ evas_object_event_callback_add(td.ctrl_pt2, EVAS_CALLBACK_MOUSE_DOWN,
+ ctrl_pt2_mouse_down_cb, &td);
+ evas_object_event_callback_add(td.ctrl_pt2, EVAS_CALLBACK_MOUSE_UP,
+ ctrl_pt2_mouse_up_cb, &td);
+ evas_object_show(td.ctrl_pt2);
+
+ //Label
+ td.label = elm_label_add(td.win);
+ evas_object_resize(td.label, WIN_W, 50);
+ evas_object_pass_events_set(td.label, EINA_TRUE);
+ evas_object_show(td.label);
+
+ td.rev_btn = elm_button_add(td.win);
+ elm_object_text_set(td.rev_btn, "Revert");
+ evas_object_resize(td.rev_btn, 50, 50);
+ evas_object_move(td.rev_btn, 100, 0);
+ evas_object_show(td.rev_btn);
+ elm_object_disabled_set(td.rev_btn, EINA_TRUE);
+
+ //Button
+ Evas_Object *btn = elm_button_add(td.win);
+ elm_object_text_set(btn, "Go");
+ evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, &td);
+ evas_object_resize(btn, BTN_SIZE, BTN_SIZE);
+ evas_object_move(btn, 0, (WIN_H - BTN_SIZE));
+ evas_object_show(btn);
+
+ update_curve(&td);
+
+ evas_object_resize(td.win, WIN_W, WIN_H);
+ evas_object_show(td.win);
+}
diff --git a/src/bin/elementary/test_video.c b/src/bin/elementary/test_video.c
new file mode 100644
index 0000000000..0dfca3e7ea
--- /dev/null
+++ b/src/bin/elementary/test_video.c
@@ -0,0 +1,58 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+my_bt_open(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Evas_Object *video = data;
+ const char *file = event_info;
+
+ if (file)
+ {
+ elm_video_file_set(video, file);
+ elm_video_play(video);
+ }
+}
+
+void
+test_video(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *video, *bt, *tb, *player;
+
+ win = elm_win_add(NULL, "video", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Video");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ video = elm_video_add(win);
+ evas_object_size_hint_weight_set(video, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(video);
+
+ player = elm_player_add(win);
+ evas_object_size_hint_weight_set(player, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(player, video);
+ elm_win_resize_object_add(win, player);
+ evas_object_show(player);
+
+ tb = elm_table_add(win);
+ evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, tb);
+ evas_object_show(tb);
+
+ bt = elm_fileselector_button_add(win);
+ elm_object_text_set(bt, "Select Video");
+ evas_object_smart_callback_add(bt, "file,chosen", my_bt_open, video);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, 0.5, 0.1);
+ elm_table_pack(tb, bt, 0, 0, 1, 1);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 800, 500);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_weather.c b/src/bin/elementary/test_weather.c
new file mode 100644
index 0000000000..332770bb4e
--- /dev/null
+++ b/src/bin/elementary/test_weather.c
@@ -0,0 +1,168 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#ifdef HAVE_ELEMENTARY_EWEATHER
+# include "EWeather_Smart.h"
+#endif
+
+#ifdef HAVE_ELEMENTARY_EWEATHER
+static Evas_Object *en, *hv, *fl;
+static Evas_Object *weather[2];
+static int current = 0;
+static Eina_Module *module[2];
+
+static void
+_first_city_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (!current) return;
+ current = 0;
+ elm_flip_go(fl, ELM_FLIP_ROTATE_YZ_CENTER_AXIS);
+}
+
+static void
+_second_city_cb(void *dat EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (current) return;
+ current = 1;
+ elm_flip_go(fl, ELM_FLIP_ROTATE_XZ_CENTER_AXIS);
+}
+
+static void _apply_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ EWeather *eweather = eweather_object_eweather_get(weather[current]);
+
+ if (module[current])
+ eweather_plugin_set(eweather, module[current]);
+ eweather_code_set(eweather, elm_object_text_get(en));
+ printf("CURRENT %d, module[current] %p, eweather %p, city : %s\n",
+ current, module[current], eweather, elm_object_text_get(en));
+}
+
+static void
+_hover_select_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ EWeather *eweather = eweather_object_eweather_get(weather[0]);
+ module[0] = eweather_plugin_search(eweather, elm_object_item_text_get(event_info));
+
+ eweather = eweather_object_eweather_get(weather[1]);
+ module[1] = eweather_plugin_search(eweather, elm_object_item_text_get(event_info));
+ printf("%p %p\n", module[0], module[1]);
+}
+#endif
+
+void
+test_weather(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win;
+#ifdef HAVE_ELEMENTARY_EWEATHER
+ Evas_Object *bx, *bx0, *bt;
+ EWeather *eweather;
+ Eina_Array_Iterator it;
+ Eina_Array *array;
+ Eina_Module *m;
+ unsigned int i;
+#endif
+
+ win = elm_win_util_standard_add("weather", "Weather");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+#ifdef HAVE_ELEMENTARY_EWEATHER
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ fl = elm_flip_add(win);
+ evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, fl);
+
+ current = 0;
+
+ module[0] = NULL;
+ weather[0] = eweather_object_add(evas_object_evas_get(win));
+ evas_object_size_hint_weight_set(weather[0], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(weather[0], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_part_content_set(fl, "front", weather[0]);
+ evas_object_show(weather[0]);
+
+ module[1] = NULL;
+ weather[1] = eweather_object_add(evas_object_evas_get(win));
+ eweather = eweather_object_eweather_get(weather[1]);
+ evas_object_size_hint_weight_set(weather[1], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(weather[1], EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_part_content_set(fl, "back", weather[1]);
+ evas_object_show(weather[1]);
+
+ evas_object_show(fl);
+
+ //
+ bx0 = elm_box_add(win);
+ elm_box_horizontal_set(bx0, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, bx0);
+ evas_object_show(bx0);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "First city");
+ evas_object_show(bt);
+ elm_box_pack_end(bx0, bt);
+ evas_object_smart_callback_add(bt, "clicked", _first_city_cb, NULL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Second city");
+ evas_object_show(bt);
+ elm_box_pack_end(bx0, bt);
+ evas_object_smart_callback_add(bt, "clicked", _second_city_cb, NULL);
+ //
+
+ //
+ bx0 = elm_box_add(win);
+ elm_box_horizontal_set(bx0, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, bx0);
+ evas_object_show(bx0);
+
+ hv = elm_hoversel_add(win);
+ elm_hoversel_hover_parent_set(hv, win);
+ elm_object_text_set(hv, "data source");
+ evas_object_size_hint_weight_set(hv, 0.0, 0.0);
+ evas_object_size_hint_align_set(hv, 0.5, 0.5);
+ elm_box_pack_end(bx0, hv);
+ evas_object_show(hv);
+
+ array = eweather_plugins_list_get(eweather);
+
+ EINA_ARRAY_ITER_NEXT(array, i, m, it)
+ elm_hoversel_item_add(hv, eweather_plugin_name_get(eweather, i), NULL, ELM_ICON_NONE, _hover_select_cb, NULL);
+
+ en = elm_entry_add(win);
+ elm_entry_line_wrap_set(en, ELM_WRAP_NONE);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_object_text_set(en, "Paris");
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(en, "activated", _apply_cb, NULL);
+ elm_box_pack_end(bx0, en);
+ evas_object_show(en);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Apply");
+ evas_object_show(bt);
+ elm_box_pack_end(bx0, bt);
+ evas_object_smart_callback_add(bt, "clicked", _apply_cb, NULL);
+#else
+ Evas_Object *lbl;
+
+ lbl = elm_label_add(win);
+ evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, lbl);
+ elm_object_text_set(lbl, "libeweather is required to display the forecast.");
+ evas_object_show(lbl);
+#endif
+
+ evas_object_resize(win, 244, 388);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_web.c b/src/bin/elementary/test_web.c
new file mode 100644
index 0000000000..5cc4b85169
--- /dev/null
+++ b/src/bin/elementary/test_web.c
@@ -0,0 +1,693 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct
+{
+ Evas_Object *web;
+ Evas_Object *btn_back;
+ Evas_Object *btn_fwd;
+ Evas_Object *url_entry;
+ Evas_Object *bx;
+ Evas_Object *hoversel;
+ Eina_List *sub_wins;
+ Eina_Bool js_hooks : 1;
+} Web_Test;
+
+static void
+_btn_back_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *web = data;
+
+ elm_web_back(web);
+}
+
+static void
+_btn_fwd_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *web = data;
+
+ elm_web_forward(web);
+}
+
+static void
+_btn_reload_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *web = data;
+
+ elm_web_reload(web);
+}
+
+static void
+_url_entry_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *web = data;
+ const char *url = elm_object_text_get(obj);
+
+ elm_web_url_set(web, url);
+}
+
+static void
+_toggle_inwin_mode_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ elm_web_inwin_mode_set(data, !elm_web_inwin_mode_get(data));
+}
+
+static void
+_title_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ char buf[512];
+ snprintf(buf, sizeof(buf), "Web - %s", (const char *)event_info);
+ elm_win_title_set(data, buf);
+}
+
+static void
+_url_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Web_Test *wt = data;
+
+ elm_object_text_set(wt->url_entry, event_info);
+
+ elm_object_disabled_set(wt->btn_back, !elm_web_back_possible_get(wt->web));
+ elm_object_disabled_set(wt->btn_fwd, !elm_web_forward_possible_get(wt->web));
+}
+
+static void
+_new_win_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Web_Test *wt = data;
+ wt->sub_wins = eina_list_remove(wt->sub_wins, obj);
+}
+
+static void
+_web_win_close_request_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static Evas_Object *
+_new_window_hook(void *data, Evas_Object *obj, Eina_Bool js EINA_UNUSED, const Elm_Web_Window_Features *wf EINA_UNUSED)
+{
+ Web_Test *wt = data;
+ Evas_Object *new_win, *new_web;
+
+ new_win = elm_win_util_standard_add("elm-web-test-popup", "Elm Web Test Popup");
+ elm_win_autodel_set(new_win, EINA_TRUE);
+ evas_object_resize(new_win, 300, 300);
+ evas_object_show(new_win);
+
+ new_web = elm_web_add(new_win);
+ elm_web_useragent_set(new_web, elm_web_useragent_get(obj));
+ evas_object_size_hint_weight_set(new_web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(new_win, new_web);
+ evas_object_show(new_web);
+
+ evas_object_smart_callback_add(new_win, "delete,request", _new_win_del_cb,
+ wt);
+ evas_object_smart_callback_add(new_web, "windows,close,request",
+ _web_win_close_request_cb, new_win);
+ wt->sub_wins = eina_list_append(wt->sub_wins, new_win);
+
+ return new_web;
+}
+
+static void
+_alert_del(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ evas_object_del(obj);
+}
+
+static Evas_Object *
+_alert_hook(void *data EINA_UNUSED, Evas_Object *obj, const char *message)
+{
+ Evas_Object *popup, *label;
+
+ popup = elm_notify_add(obj);
+ elm_notify_align_set(popup, 0.5, 0.5);
+ // Using the timeout doesn't seem to go well with the second main loop
+ //elm_notify_timeout_set(popup, 2.0);
+ elm_notify_allow_events_set(popup, EINA_FALSE);
+ evas_object_show(popup);
+
+ evas_object_smart_callback_add(popup, "block,clicked", _alert_del, NULL);
+
+ label = elm_label_add(obj);
+ elm_object_text_set(label, message);
+ elm_object_content_set(popup, label);
+ evas_object_show(label);
+
+ return popup;
+}
+
+static void
+_confirm_ok_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Eina_Bool *response = data;
+ *response = EINA_TRUE;
+}
+
+static void
+_confirm_cancel_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Eina_Bool *response = data;
+ *response = EINA_FALSE;
+}
+
+static void
+_confirm_dismiss_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static Evas_Object *
+_confirm_hook(void *data EINA_UNUSED, Evas_Object *obj, const char *message, Eina_Bool *response)
+{
+ Evas_Object *popup, *box, *box2, *label, *btn_ok, *btn_cancel;
+
+ popup = elm_notify_add(obj);
+ elm_notify_align_set(popup, 0.5, 0.5);
+ elm_notify_allow_events_set(popup, EINA_FALSE);
+ evas_object_show(popup);
+
+ box = elm_box_add(obj);
+ elm_object_content_set(popup, box);
+ evas_object_show(box);
+
+ label = elm_label_add(obj);
+ elm_object_text_set(label, message);
+ elm_box_pack_end(box, label);
+ evas_object_show(label);
+
+ box2 = elm_box_add(obj);
+ elm_box_horizontal_set(box2, EINA_TRUE);
+ elm_box_pack_end(box, box2);
+ evas_object_show(box2);
+
+ btn_ok = elm_button_add(obj);
+ elm_object_text_set(btn_ok, "Ok");
+ elm_box_pack_end(box2, btn_ok);
+ evas_object_show(btn_ok);
+
+ btn_cancel = elm_button_add(obj);
+ elm_object_text_set(btn_cancel, "Cancel");
+ elm_box_pack_end(box2, btn_cancel);
+ evas_object_show(btn_cancel);
+
+ evas_object_smart_callback_add(btn_ok, "clicked", _confirm_dismiss_cb,
+ popup);
+ evas_object_smart_callback_add(btn_cancel, "clicked", _confirm_dismiss_cb,
+ popup);
+ evas_object_smart_callback_add(btn_ok, "clicked", _confirm_ok_cb, response);
+ evas_object_smart_callback_add(btn_cancel, "clicked", _confirm_cancel_cb,
+ response);
+
+ return popup;
+}
+
+static Evas_Object *
+_prompt_hook(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *message EINA_UNUSED, const char *default_value, const char **value, Eina_Bool *response)
+{
+ *response = EINA_TRUE;
+ *value = default_value ? strdup(default_value) : "No default!";
+ return NULL;
+}
+
+static Evas_Object *
+_file_selector_hook(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, Eina_Bool allow_multiple EINA_UNUSED, Eina_List *accept_types EINA_UNUSED, Eina_List **selected_files, Eina_Bool *response)
+{
+ *selected_files = eina_list_append(NULL,
+ strdup("/path/to/non_existing_file"));
+ *response = EINA_TRUE;
+ return NULL;
+}
+
+static void
+_console_message_hook(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *message, unsigned int line_number, const char *source_id)
+{
+ printf("CONSOLE: %s:%u:%s\n", source_id, line_number, message);
+}
+
+static void
+_js_popup_hooks_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Web_Test *wt = data;
+
+ wt->js_hooks = !wt->js_hooks;
+ if (wt->js_hooks)
+ {
+ elm_web_dialog_alert_hook_set(wt->web, _alert_hook, NULL);
+ elm_web_dialog_confirm_hook_set(wt->web, _confirm_hook, NULL);
+ elm_web_dialog_prompt_hook_set(wt->web, _prompt_hook, NULL);
+ elm_web_dialog_file_selector_hook_set(wt->web, _file_selector_hook,
+ NULL);
+ elm_web_console_message_hook_set(wt->web, _console_message_hook, NULL);
+ }
+ else
+ {
+ elm_web_dialog_alert_hook_set(wt->web, NULL, NULL);
+ elm_web_dialog_confirm_hook_set(wt->web, NULL, NULL);
+ elm_web_dialog_prompt_hook_set(wt->web, NULL, NULL);
+ elm_web_dialog_file_selector_hook_set(wt->web, NULL, NULL);
+ elm_web_console_message_hook_set(wt->web, NULL, NULL);
+ }
+}
+
+static void
+_zoom_out_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Web_Test *wt = data;
+ double zoom;
+
+ zoom = elm_web_zoom_get(wt->web);
+ if (zoom > 1)
+ zoom -= .5;
+ else
+ zoom /= 2;
+ if (zoom < .05)
+ zoom = .05;
+ elm_web_zoom_set(wt->web, zoom);
+}
+
+static void
+_zoom_in_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Web_Test *wt = data;
+ double zoom;
+
+ zoom = elm_web_zoom_get(wt->web);
+
+ if (zoom < 1)
+ zoom *= 2;
+ else
+ zoom += .5;
+ if (zoom > 4)
+ zoom = 4;
+ elm_web_zoom_set(wt->web, zoom);
+}
+
+static void
+_zoom_mode_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Web_Test *wt = data;
+ Elm_Object_Item *hoversel_it = event_info;
+ const char *lbl = elm_object_item_text_get(hoversel_it);
+
+ if (!strcmp(lbl, "Manual"))
+ elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_MANUAL);
+ else if (!strcmp(lbl, "Fit"))
+ elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_AUTO_FIT);
+ else
+ elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_AUTO_FILL);
+}
+
+static void
+_show_region_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Web_Test *wt = data;
+ elm_web_region_show(wt->web, 300, 300, 1, 1);
+}
+
+static void
+_bring_in_region_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Web_Test *wt = data;
+ elm_web_region_bring_in(wt->web, 50, 0, 1, 1);
+}
+
+static void
+_on_fullscreen_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Web_Test *wt = data;
+ elm_box_unpack(wt->bx, wt->hoversel);
+ evas_object_hide(wt->hoversel);
+}
+
+static void
+_on_unfullscreen_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Web_Test *wt = data;
+ elm_box_pack_start(wt->bx, wt->hoversel);
+ evas_object_show(wt->hoversel);
+}
+
+typedef struct
+{
+ const char* name;
+ const char* useragent;
+} User_Agent;
+
+static User_Agent ua[] = {
+ {"Default", NULL},
+ {"Mobile/Iphone", "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B142 Safari/8536.25"},
+ {"Mobile/Android(Chrome)", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"},
+ {"Mobile/Android", "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"},
+ {"Desktop/Firefox", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0"},
+ {"Desktop/Chrome", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"}
+};
+
+static void
+_useragent_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ Web_Test *wt = data;
+ Elm_Object_Item *hoversel_it = event_info;
+ const char *lbl = elm_object_item_text_get(hoversel_it);
+ unsigned i;
+
+ for (i = 0; i < sizeof(ua) / sizeof(ua[0]); ++i)
+ if (!strcmp(lbl, ua[i].name))
+ {
+ printf("New user agent : %s\n", ua[i].useragent ? ua[i].useragent : "Default");
+ elm_web_useragent_set(wt->web, ua[i].useragent);
+ }
+}
+
+static void
+_dialog_test_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Web_Test *wt = data;
+ const char *selected = elm_object_item_text_get(event_info);
+ const char dialog_html[] = "<!doctype html><body>"
+ "<script>"
+ "var confirm_test = function() {"
+ " if (window.confirm('confirm') == true) {"
+ " document.getElementById('r').innerHTML = 'You pressed OK';"
+ " } else {"
+ " document.getElementById('r').innerHTML = 'You pressed Cancel';"
+ " }"
+ "};"
+ "var prompt_test = function() {"
+ " document.getElementById('r').innerHTML = window.prompt('Enter your name', 'EFL');"
+ "};"
+ "</script>"
+ "Result: <div id='r'> </div>"
+ "<input type='button' value='alert' onclick=\"window.alert('alert pressed');\">"
+ "<input type='button' value='confirm' onclick=\"confirm_test();\">"
+ "<input type='button' value='prompt' onclick=\"prompt_test();\">"
+ "</body>";
+
+ printf("selected test : %s\n", selected);
+ elm_object_text_set(obj, selected);
+
+ elm_web_html_string_load(wt->web, dialog_html, NULL, NULL);
+}
+
+static void
+_select_tag_test_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Web_Test *wt = data;
+ const char *selected = elm_object_item_text_get(event_info);
+ const char select_html[] = "<!doctype html><body>"
+ "<select>"
+ "<option>eina</option>"
+ "<option>ecore</option>"
+ "<option>evas</option>"
+ "<option>edje</option>"
+ "<option>eet</option>"
+ "<option>emotion</option>"
+ "<option>elementary</option>"
+ "</select>"
+ "</body>";
+
+ printf("selected test : %s\n", selected);
+ elm_object_text_set(obj, selected);
+
+ elm_web_html_string_load(wt->web, select_html, NULL, NULL);
+}
+
+static void
+_new_window_test_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Web_Test *wt = data;
+ const char *selected = elm_object_item_text_get(event_info);
+ const char new_window_html[] = "<!doctype html><body>"
+ "<script>"
+ "var h = null;"
+ "var test = function() {"
+ " if (!h) {"
+ " h = window.open('http://www.enlightenment.org','','width=400,height=300');"
+ " document.getElementById('btn').value='close window';"
+ " } else {"
+ " h.close();"
+ " h = null;"
+ " document.getElementById('btn').value='open new window';"
+ " }"
+ "}"
+ "</script>"
+ "<input type='button' id='btn' onclick='test();' value='open new window'>"
+ "</body>";
+
+ printf("selected test : %s\n", selected);
+ elm_object_text_set(obj, selected);
+
+ elm_web_html_string_load(wt->web, new_window_html, NULL, NULL);
+}
+
+static void
+_fullscreen_test_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Web_Test *wt = data;
+ const char *selected = elm_object_item_text_get(event_info);
+ const char fullscreen_html[] = "<!doctype html><body>"
+ "<script>"
+ "var launch = function(obj) {"
+ " var f = document.webkitFullscreenElement;"
+ " if (f) document.webkitExitFullscreen();"
+ " if (f != obj) obj.webkitRequestFullscreen();"
+ "}\n"
+ "var test_full = function() { launch(document.documentElement); }\n"
+ "var test_small = function() { launch(document.getElementById('box')); }\n"
+ "</script>"
+ "<input type='button' onclick='test_full();' value='request fullscreen'>"
+ "<div id='box' style='width:100px;height:100px;background-color:blue;' onclick='test_small();'>small box</div>"
+ "<input type='button' onclick='test_small();' value='request fullscreen of box'>"
+ "</body>";
+
+ printf("selected test : %s\n", selected);
+ elm_object_text_set(obj, selected);
+
+ elm_web_html_string_load(wt->web, fullscreen_html, NULL, NULL);
+}
+
+static void
+_main_web_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Web_Test *wt = data;
+ Evas_Object *sub_win;
+
+ EINA_LIST_FREE(wt->sub_wins, sub_win)
+ evas_object_del(sub_win);
+
+ free(wt);
+}
+
+void
+test_web(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx2, *bt, *web, *url;
+ Web_Test *wt;
+ unsigned i;
+
+ elm_need_web();
+
+ wt = calloc(1, sizeof(*wt));
+ win = elm_win_util_standard_add("web", "Web");
+
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ web = elm_web_add(win);
+ evas_object_size_hint_weight_set(web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(web, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, web);
+ evas_object_show(web);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "<");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(bt, "clicked", _btn_back_cb, web);
+ wt->btn_back = bt;
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "R");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(bt, "clicked", _btn_reload_cb, web);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, ">");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(bt, "clicked", _btn_fwd_cb, web);
+ wt->btn_fwd = bt;
+
+ url = elm_entry_add(win);
+ elm_entry_single_line_set(url, EINA_TRUE);
+ elm_entry_scrollable_set(url, EINA_TRUE);
+ evas_object_size_hint_weight_set(url, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(url, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, url);
+ evas_object_show(url);
+
+ evas_object_smart_callback_add(url, "activated", _url_entry_changed_cb, web);
+ wt->url_entry = url;
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Inwin Mode");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(bt, "clicked", _toggle_inwin_mode_cb, web);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Custom Hooks");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(bt, "clicked", _js_popup_hooks_set, wt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "-");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(bt, "clicked", _zoom_out_cb, wt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "+");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(bt, "clicked", _zoom_in_cb, wt);
+
+ bt = elm_hoversel_add(win);
+ elm_object_text_set(bt, "Zoom Mode");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_hoversel_item_add(bt, "Manual", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt);
+ elm_hoversel_item_add(bt, "Fit", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt);
+ elm_hoversel_item_add(bt, "Fill", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Show 300, 300");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(bt, "clicked", _show_region_cb, wt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Bring in 50, 0");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(bt, "clicked", _bring_in_region_cb, wt);
+
+ bt = elm_hoversel_add(win);
+ elm_object_text_set(bt, "User agent");
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ for (i = 0; i < sizeof(ua) / sizeof(ua[0]); ++i)
+ elm_hoversel_item_add(bt, ua[i].name, NULL, ELM_ICON_NONE, _useragent_cb, wt);
+
+ evas_object_smart_callback_add(web, "title,changed", _title_changed_cb, win);
+ evas_object_smart_callback_add(web, "url,changed", _url_changed_cb, wt);
+
+ evas_object_event_callback_add(web, EVAS_CALLBACK_DEL, _main_web_del_cb, wt);
+
+ wt->web = web;
+
+ elm_web_url_set(web, "http://www.enlightenment.org");
+
+ elm_web_window_create_hook_set(web, _new_window_hook, wt);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
+
+void
+test_web_ui(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *web, *hoversel;
+ Web_Test *wt;
+
+ elm_need_web();
+
+ wt = calloc(1, sizeof(*wt));
+ win = elm_win_util_standard_add("web", "Web");
+
+ evas_object_smart_callback_add(win, "fullscreen", _on_fullscreen_cb, wt);
+ evas_object_smart_callback_add(win, "unfullscreen", _on_unfullscreen_cb, wt);
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ hoversel = elm_hoversel_add(bx);
+ elm_hoversel_hover_parent_set(hoversel, win);
+ elm_object_text_set(hoversel, "Test cases");
+
+ elm_hoversel_item_add(hoversel, "alert/confirm/prompt", NULL, ELM_ICON_NONE,
+ _dialog_test_cb, wt);
+ elm_hoversel_item_add(hoversel, "<select> tag", NULL, ELM_ICON_NONE,
+ _select_tag_test_cb, wt);
+ elm_hoversel_item_add(hoversel, "new window", NULL, ELM_ICON_NONE,
+ _new_window_test_cb, wt);
+ elm_hoversel_item_add(hoversel, "fullscreen", NULL, ELM_ICON_NONE,
+ _fullscreen_test_cb, wt);
+ elm_box_pack_end(bx, hoversel);
+ evas_object_show(hoversel);
+
+ web = elm_web_add(win);
+ evas_object_size_hint_weight_set(web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(web, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, web);
+ evas_object_show(web);
+
+ elm_web_window_create_hook_set(web, _new_window_hook, wt);
+
+ evas_object_event_callback_add(web, EVAS_CALLBACK_DEL, _main_web_del_cb, wt);
+ wt->web = web;
+ wt->bx = bx;
+ wt->hoversel = hoversel;
+
+
+ elm_web_html_string_load(wt->web,
+ "<!doctype html><body>Hello, WebKit/Efl</body>",
+ NULL, NULL);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_win_dialog.c b/src/bin/elementary/test_win_dialog.c
new file mode 100644
index 0000000000..aa155b188e
--- /dev/null
+++ b/src/bin/elementary/test_win_dialog.c
@@ -0,0 +1,48 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+
+
+void
+_bt_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *dia, *lb;
+ Evas_Object *parent = data;
+
+ dia = elm_win_util_dialog_add(parent, "window-dia", "A Dialog Window");
+ elm_win_autodel_set(dia, EINA_TRUE);
+
+ lb = elm_label_add(dia);
+ elm_object_text_set(lb, "This is a Dialog Window");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(dia, lb);
+ evas_object_show(lb);
+
+ evas_object_resize(dia, 200, 150);
+ evas_object_show(dia);
+}
+
+void
+test_win_dialog(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *box, *bt;
+
+ win = elm_win_util_standard_add("window-dia", "A Standard Window");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ box = elm_box_add(win);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, box);
+ evas_object_show(box);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Create a new dialog");
+ evas_object_smart_callback_add(bt, "clicked", _bt_clicked_cb, win);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_win_inline.c b/src/bin/elementary/test_win_inline.c
new file mode 100644
index 0000000000..b9e08ef739
--- /dev/null
+++ b/src/bin/elementary/test_win_inline.c
@@ -0,0 +1,254 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+fill(Evas_Object *win, Eina_Bool do_bg)
+{
+ Evas_Object *bg, *sc, *bx, *ic, *bb, *av, *en;
+ char buf[PATH_MAX];
+
+ if (do_bg)
+ {
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+ }
+
+ sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, sc);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(en, "This is a single line");
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(en, "Entry 2");
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 3");
+ elm_object_part_text_set(bb, "info", "10:32 4/11/2008");
+ elm_object_part_content_set(bb, "icon", ic);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ av = elm_entry_add(win);
+ elm_entry_anchor_hover_style_set(av, "popout");
+ elm_entry_anchor_hover_parent_set(av, win);
+ elm_object_text_set(av,
+ "Hi there. This is the most recent message in the "
+ "list of messages. It has one <a href=tel:+614321234>+61 432 1234</a> "
+ "(phone number) to click on.");
+ elm_object_content_set(bb, av);
+ evas_object_show(av);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 2");
+ elm_object_part_text_set(bb, "info", "7:16 27/10/2008");
+ elm_object_part_content_set(bb, "icon", ic);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ av = elm_entry_add(win);
+ elm_entry_anchor_hover_style_set(av, "popout");
+ elm_entry_anchor_hover_parent_set(av, win);
+ elm_object_text_set(av,
+ "Hey what are you doing? This is the second last message "
+ "Hi there. This is the most recent message in the "
+ "list. It's a longer one so it can wrap more and "
+ "contains a <a href=contact:john>John</a> contact "
+ "link in it to test popups on links. The idea is that "
+ "all SMS's are scanned for things that look like phone "
+ "numbers or names that are in your contacts list, and "
+ "if they are, they become clickable links that pop up "
+ "a menus of obvious actions to perform on this piece "
+ "of information. This of course can be later explicitly "
+ "done by links maybe running local apps or even being "
+ "web URL's too that launch the web browser and point it "
+ "to that URL. <item relsize=16x16 vsize=full href=emoticon/omg></item>");
+ elm_object_content_set(bb, av);
+ evas_object_show(av);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 1");
+ elm_object_part_text_set(bb, "info", "20:47 18/6/2008");
+ elm_object_part_content_set(bb, "icon", ic);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ av = elm_entry_add(win);
+ elm_entry_anchor_hover_style_set(av, "popout");
+ elm_entry_anchor_hover_parent_set(av, win);
+ elm_object_text_set(av, "This is a short message. <item relsize=16x16 vsize=full href=emoticon/haha></item>");
+ elm_object_content_set(bb, av);
+ evas_object_show(av);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ elm_object_content_set(sc, bx);
+ evas_object_show(bx);
+
+ evas_object_show(sc);
+}
+
+static void
+cb_mouse_down(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = event_info;
+
+ if (ev->button == 1) elm_object_focus_set(obj, EINA_TRUE);
+}
+
+static void
+cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev = event_info;
+ Evas_Object *orig = data;
+ Evas_Coord x, y;
+ Evas_Map *p;
+ int i, w, h;
+
+ if (!ev->buttons) return;
+ evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+ evas_object_move(obj,
+ x + (ev->cur.canvas.x - ev->prev.output.x),
+ y + (ev->cur.canvas.y - ev->prev.output.y));
+ evas_object_image_size_get(orig, &w, &h);
+ p = evas_map_new(4);
+ evas_object_map_enable_set(orig, EINA_TRUE);
+ evas_object_raise(orig);
+ for (i = 0; i < 4; i++)
+ {
+ Evas_Object *hand;
+ char key[32];
+
+ snprintf(key, sizeof(key), "h-%i\n", i);
+ hand = evas_object_data_get(orig, key);
+ evas_object_raise(hand);
+ evas_object_geometry_get(hand, &x, &y, NULL, NULL);
+ x += 15;
+ y += 15;
+ evas_map_point_coord_set(p, i, x, y, 0);
+ if (i == 0) evas_map_point_image_uv_set(p, i, 0, 0);
+ else if (i == 1) evas_map_point_image_uv_set(p, i, w, 0);
+ else if (i == 2) evas_map_point_image_uv_set(p, i, w, h);
+ else if (i == 3) evas_map_point_image_uv_set(p, i, 0, h);
+ }
+ evas_object_map_set(orig, p);
+ evas_map_free(p);
+}
+
+static void
+create_handles(Evas_Object *obj)
+{
+ int i;
+ Evas_Coord x, y, w, h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ for (i = 0; i < 4; i++)
+ {
+ Evas_Object *hand;
+ char buf[PATH_MAX];
+ char key[32];
+
+ hand = evas_object_image_filled_add(evas_object_evas_get(obj));
+ evas_object_resize(hand, 31, 31);
+ snprintf(buf, sizeof(buf), "%s/images/pt.png", elm_app_data_dir_get());
+ evas_object_image_file_set(hand, buf, NULL);
+ if (i == 0) evas_object_move(hand, x - 15, y - 15);
+ else if (i == 1) evas_object_move(hand, x + w - 15, y - 15);
+ else if (i == 2) evas_object_move(hand, x + w - 15, y + h - 15);
+ else if (i == 3) evas_object_move(hand, x - 15, y + h - 15);
+ evas_object_event_callback_add(hand, EVAS_CALLBACK_MOUSE_MOVE, cb_mouse_move, obj);
+ evas_object_show(hand);
+ snprintf(key, sizeof(key), "h-%i\n", i);
+ evas_object_data_set(obj, key, hand);
+ }
+}
+
+void
+test_win_inline(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *win2, *win3;
+ char buf[PATH_MAX];
+
+ win = elm_win_add(NULL, "window-inline", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Window Inline");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ win2 = elm_win_add(win, "inlined", ELM_WIN_INLINED_IMAGE);
+ evas_object_event_callback_add(elm_win_inlined_image_object_get(win2), EVAS_CALLBACK_MOUSE_DOWN, cb_mouse_down, NULL);
+ fill(win2, EINA_TRUE);
+
+ evas_object_move(win2, 20, 60);
+ evas_object_resize(win2, 300, 200);
+ // image object for win2 is unlinked to its pos/size - so manual control
+ // this allows also for using map and other things with it.
+ evas_object_move(elm_win_inlined_image_object_get(win2), 20, 40);
+ evas_object_resize(elm_win_inlined_image_object_get(win2), 200, 320);
+ evas_object_show(win2);
+
+ win3 = elm_win_add(win, "inlined", ELM_WIN_INLINED_IMAGE);
+ evas_object_event_callback_add(elm_win_inlined_image_object_get(win3), EVAS_CALLBACK_MOUSE_DOWN, cb_mouse_down, NULL);
+ elm_win_alpha_set(win3, EINA_TRUE);
+ fill(win3, EINA_FALSE);
+
+ evas_object_resize(win3, 300, 200);
+ evas_object_move(elm_win_inlined_image_object_get(win3), 80, 180);
+ evas_object_resize(elm_win_inlined_image_object_get(win3), 300, 200);
+ evas_object_show(win3);
+
+ create_handles(elm_win_inlined_image_object_get(win3));
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_win_keygrab.c b/src/bin/elementary/test_win_keygrab.c
new file mode 100644
index 0000000000..9032e9fbb1
--- /dev/null
+++ b/src/bin/elementary/test_win_keygrab.c
@@ -0,0 +1,243 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+
+struct _api_data
+{
+ Evas_Object *win;
+ Elm_Win_Keygrab_Mode mode; /* Mode of keygr */
+ char keyname[PATH_MAX]; /* Keyname */
+};
+
+typedef struct _api_data api_data;
+
+static void
+_rdg_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ int mode = -1;
+ Elm_Win_Keygrab_Mode keygrab_mode = ELM_WIN_KEYGRAB_UNKNOWN;
+ api_data *api = data;
+
+ mode = elm_radio_value_get(obj);
+ printf("radio group value : %d\n", mode);
+
+ if (mode == 1)
+ {
+ keygrab_mode = ELM_WIN_KEYGRAB_SHARED;
+ printf("keygrab mode = ELM_WIN_KEYGRAB_SHARED\n");
+ }
+ else if (mode == 2)
+ {
+ keygrab_mode = ELM_WIN_KEYGRAB_TOPMOST;
+ printf("keygrab mode = ELM_WIN_KEYGRAB_TOPMOST\n");
+ }
+ else if (mode == 3)
+ {
+ keygrab_mode = ELM_WIN_KEYGRAB_EXCLUSIVE;
+ printf("keygrab mode = ELM_WIN_KEYGRAB_EXCLUSIVE\n");
+ }
+ else if (mode == 4)
+ {
+ keygrab_mode = ELM_WIN_KEYGRAB_OVERRIDE_EXCLUSIVE;
+ printf("keygrab mode = ELM_WIN_KEYGRAB_OVERRIDE_EXCLUSIVE\n");
+ }
+ else
+ {
+ keygrab_mode = ELM_WIN_KEYGRAB_UNKNOWN;
+ printf("keygrab mode = ELM_WIN_KEYGRAB_UNKNOWN\n");
+ }
+ api->mode = keygrab_mode;
+}
+
+static void
+_entry_changed_cb(void *data , Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ api_data *api = data;
+ const char *str = elm_entry_entry_get(obj);
+ if (!str) return;
+ strncpy(api->keyname, str, PATH_MAX - 1);
+ printf("entry: %s\n",str);
+}
+
+static void
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (data)
+ free(data);
+}
+
+static void
+_set_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Eina_Bool ret = EINA_FALSE;
+ api_data *api = data;
+
+ ret = elm_win_keygrab_set(api->win, api->keyname, 0, 0, 0, api->mode);
+ printf("Keyname:\"%s\" mode:\"%d\" keygrab set. ret=%d\n", api->keyname, api->mode, ret);
+}
+
+static void
+_unset_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Eina_Bool ret = EINA_FALSE;
+ api_data *api = data;
+
+ ret = elm_win_keygrab_unset(api->win, api->keyname, 0, 0);
+ printf("Keyname:\"%s\" mode:\"%d\" keygrab unset. ret=%d.\n", api->keyname, api->mode, ret);
+}
+
+static void
+_group_1_create(Evas_Object *bx, api_data *api)
+{
+ Evas_Object *bx2, *fr, *lb, *en;
+
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Keygrab Keyname");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx2 = elm_box_add(fr);
+ elm_object_content_set(fr, bx2);
+ evas_object_show(bx2);
+
+ lb = elm_label_add(bx2);
+ elm_object_text_set(lb, " Keyname :");
+ evas_object_size_hint_weight_set(lb, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, lb);
+ evas_object_show(lb);
+
+ en = elm_entry_add(bx2);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(en, "changed,user", _entry_changed_cb, api);
+ elm_box_pack_end(bx2, en);
+ evas_object_show(en);
+ elm_object_focus_set(en, EINA_TRUE);
+
+
+}
+
+static void
+_group_2_create(Evas_Object *bx, api_data *api)
+{
+ Evas_Object *bx2, *fr, *rd, *rd1, *rd2, *rd3;
+
+ fr = elm_frame_add(bx);
+ elm_object_text_set(fr, "Keygrab Mode");
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fr);
+ evas_object_show(fr);
+
+ bx2 = elm_box_add(fr);
+ elm_object_content_set(fr, bx2);
+ elm_box_align_set(bx2, 0.0, 0.0);
+ evas_object_show(bx2);
+
+ // Shared
+ rd = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd, 1);
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(rd, "Keygrab Shared Mode");
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, api);
+
+ // Topmost
+ rd1 = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd1, 2);
+ evas_object_size_hint_weight_set(rd1, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd1, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(rd1, "Keygrab Topmost Mode");
+ elm_radio_group_add(rd1, rd);
+ elm_box_pack_end(bx2, rd1);
+ evas_object_show(rd1);
+ evas_object_smart_callback_add(rd1, "changed", _rdg_changed_cb, api);
+
+ // Exclusive
+ rd2 = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd2, 3);
+ evas_object_size_hint_weight_set(rd2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd2, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(rd2, "Keygrab Exclusive Mode");
+ elm_radio_group_add(rd2, rd);
+ elm_box_pack_end(bx2, rd2);
+ evas_object_show(rd2);
+ evas_object_smart_callback_add(rd2, "changed", _rdg_changed_cb, api);
+
+ //Override Exclusive
+ rd3 = elm_radio_add(bx2);
+ elm_radio_state_value_set(rd3, 4);
+ evas_object_size_hint_weight_set(rd3, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(rd3, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(rd3, "Keygrab Override Exclusive Mode");
+ elm_radio_group_add(rd3, rd);
+ elm_box_pack_end(bx2, rd3);
+ evas_object_show(rd3);
+ evas_object_smart_callback_add(rd3, "changed", _rdg_changed_cb, api);
+}
+
+static void
+_group_3_create(Evas_Object *bx, api_data *api)
+{
+ Evas_Object *bt;
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Keygrab Set");
+ elm_box_pack_end(bx, bt);
+
+ evas_object_smart_callback_add(bt, "clicked", _set_bt_clicked, api);
+ evas_object_show(bt);
+
+
+ bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Keygrab Unset");
+ elm_box_pack_end(bx, bt);
+ evas_object_smart_callback_add(bt, "clicked", _unset_bt_clicked, api);
+ evas_object_show(bt);
+}
+
+void
+test_win_keygrab(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *bx1, *bx2;
+
+ api_data *api = calloc(1, sizeof(api_data));
+
+ win = elm_win_util_standard_add("keygrab", "Keygrab");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bx1 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, bx1);
+ elm_box_horizontal_set(bx1, EINA_TRUE);
+ evas_object_show(bx1);
+
+ bx2 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, bx2);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_show(bx2);
+
+ _group_1_create(bx1, api);
+ _group_2_create(bx1, api);
+ _group_3_create(bx2, api);
+
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_win_plug.c b/src/bin/elementary/test_win_plug.c
new file mode 100644
index 0000000000..3e4226d47b
--- /dev/null
+++ b/src/bin/elementary/test_win_plug.c
@@ -0,0 +1,211 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define MAX_TRY 40
+
+static int try_num = 0;
+
+static void
+_timer_del(void *data EINA_UNUSED,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Ecore_Timer *timer = evas_object_data_del(obj, "test-timer");
+ if (!timer) return;
+ ecore_timer_del(timer);
+}
+
+static Eina_Bool
+cb_plug_connect(void *data)
+{
+ Evas_Object *obj = data;
+ Ecore_Timer *timer;
+
+ if (!obj) return ECORE_CALLBACK_CANCEL;
+
+ try_num++;
+ if (try_num > MAX_TRY) return ECORE_CALLBACK_CANCEL;
+
+ timer= evas_object_data_get(obj, "test-timer");
+ if (!timer) return ECORE_CALLBACK_CANCEL;
+
+ if (elm_plug_connect(obj, "ello", 0, EINA_FALSE))
+ {
+ printf("plug connect to server[ello]\n");
+ evas_object_data_del(obj, "test-timer");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ ecore_timer_interval_set(timer, 1);
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void
+cb_plug_disconnected(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Ecore_Timer *timer = evas_object_data_get(obj, "test-timer");
+ if (timer)
+ {
+ ecore_timer_del(timer);
+ evas_object_data_del(obj, "test-timer");
+ }
+
+ timer = ecore_timer_add(1, cb_plug_connect, obj);
+ evas_object_data_set(obj, "test-timer", timer);
+}
+
+static void
+cb_plug_resized(void *data EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Coord_Size *size = event_info;
+ printf("server image resized to %dx%d\n", size->w, size->h);
+}
+
+static void
+cb_mouse_down(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = event_info;
+
+ if (ev->button == 1) elm_object_focus_set(obj, EINA_TRUE);
+}
+
+static void
+cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev = event_info;
+ Evas_Object *orig = data;
+ Evas_Coord x, y;
+ Evas_Map *p;
+ int i, w, h;
+
+ if (!ev->buttons) return;
+ evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+ evas_object_move(obj,
+ x + (ev->cur.canvas.x - ev->prev.output.x),
+ y + (ev->cur.canvas.y - ev->prev.output.y));
+ evas_object_image_size_get(orig, &w, &h);
+ p = evas_map_new(4);
+ evas_object_map_enable_set(orig, EINA_TRUE);
+ evas_object_raise(orig);
+ for (i = 0; i < 4; i++)
+ {
+ Evas_Object *hand;
+ char key[32];
+
+ snprintf(key, sizeof(key), "h-%i\n", i);
+ hand = evas_object_data_get(orig, key);
+ evas_object_raise(hand);
+ evas_object_geometry_get(hand, &x, &y, NULL, NULL);
+ x += 15;
+ y += 15;
+ evas_map_point_coord_set(p, i, x, y, 0);
+ if (i == 0) evas_map_point_image_uv_set(p, i, 0, 0);
+ else if (i == 1) evas_map_point_image_uv_set(p, i, w, 0);
+ else if (i == 2) evas_map_point_image_uv_set(p, i, w, h);
+ else if (i == 3) evas_map_point_image_uv_set(p, i, 0, h);
+ }
+ evas_object_map_set(orig, p);
+ evas_map_free(p);
+}
+
+static void
+create_handles(Evas_Object *obj)
+{
+ int i;
+ Evas_Coord x, y, w, h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ for (i = 0; i < 4; i++)
+ {
+ Evas_Object *hand;
+ char buf[PATH_MAX];
+ char key[32];
+
+ hand = evas_object_image_filled_add(evas_object_evas_get(obj));
+ evas_object_resize(hand, 31, 31);
+ snprintf(buf, sizeof(buf), "%s/images/pt.png", elm_app_data_dir_get());
+ evas_object_image_file_set(hand, buf, NULL);
+ if (i == 0) evas_object_move(hand, x - 15, y - 15);
+ else if (i == 1) evas_object_move(hand, x + w - 15, y - 15);
+ else if (i == 2) evas_object_move(hand, x + w - 15, y + h - 15);
+ else if (i == 3) evas_object_move(hand, x - 15, y + h - 15);
+ evas_object_event_callback_add(hand, EVAS_CALLBACK_MOUSE_MOVE, cb_mouse_move, obj);
+ evas_object_show(hand);
+ snprintf(key, sizeof(key), "h-%i\n", i);
+ evas_object_data_set(obj, key, hand);
+ }
+}
+
+static Eina_Bool
+_notify_end(void *data EINA_UNUSED, const Eo_Event *event)
+{
+ eo_del(event->obj);
+ return EINA_FALSE;
+}
+
+static inline void
+_notify_error(Evas_Object *parent, const char *msg)
+{
+ Evas_Object *notif, *txt;
+
+ printf("%s\n", msg);
+
+ notif = elm_notify_add(parent);
+ evas_object_size_hint_weight_set(notif, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_notify_align_set(notif, 0.5, 1.0);
+ elm_notify_timeout_set(notif, 3.0);
+ eo_event_callback_add(notif, ELM_NOTIFY_EVENT_DISMISSED, _notify_end, NULL);
+
+ txt = elm_label_add(notif);
+ elm_object_text_set(txt, msg);
+ elm_object_content_set(notif, txt);
+
+ evas_object_show(txt);
+ evas_object_show(notif);
+}
+
+void
+test_win_plug(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *plug;
+ char buf[PATH_MAX];
+
+ win = elm_win_add(NULL, "window-plug", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Window Plug");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ plug = elm_plug_add(win);
+ evas_object_event_callback_add(elm_plug_image_object_get(plug), EVAS_CALLBACK_MOUSE_DOWN, cb_mouse_down, NULL);
+ evas_object_event_callback_add(plug, EVAS_CALLBACK_DEL, _timer_del, NULL);
+ if (!elm_plug_connect(plug, "ello", 0, EINA_FALSE))
+ {
+ _notify_error(data, "Unable to connect to the Window Socket!");
+ return;
+ }
+
+ evas_object_smart_callback_add(plug, "image,deleted", cb_plug_disconnected, NULL);
+ evas_object_smart_callback_add(plug, "image,resized", cb_plug_resized, NULL);
+
+ evas_object_resize(plug, 380, 500);
+ evas_object_move(plug, 10, 10);
+ evas_object_show(plug);
+
+ create_handles(elm_plug_image_object_get(plug));
+
+ evas_object_resize(win, 400, 600);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_win_socket.c b/src/bin/elementary/test_win_socket.c
new file mode 100644
index 0000000000..664f097bde
--- /dev/null
+++ b/src/bin/elementary/test_win_socket.c
@@ -0,0 +1,202 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+static void
+_win_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *socket_win = data;
+ evas_object_del(socket_win);
+}
+
+static void
+fill(Evas_Object *win, Eina_Bool do_bg)
+{
+ Evas_Object *bg, *sc, *bx, *ic, *bb, *av, *en;
+ char buf[PATH_MAX];
+
+ if (do_bg)
+ {
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+ }
+
+ sc = elm_scroller_add(win);
+ evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, sc);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(en, "This is a single line");
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ en = elm_entry_add(win);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5);
+ elm_object_text_set(en, "Entry 2");
+ elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_show(en);
+ elm_box_pack_end(bx, en);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 3");
+ elm_object_part_text_set(bb, "info", "10:32 4/11/2008");
+ elm_object_part_content_set(bb, "icon", ic);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ av = elm_entry_add(win);
+ elm_entry_anchor_hover_style_set(av, "popout");
+ elm_entry_anchor_hover_parent_set(av, win);
+ elm_object_text_set(av,
+ "Hi there. This is the most recent message in the "
+ "list of messages. It has one <a href=tel:+614321234>+61 432 1234</a> "
+ "(phone number) to click on.");
+ elm_object_content_set(bb, av);
+ evas_object_show(av);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 2");
+ elm_object_part_text_set(bb, "info", "7:16 27/10/2008");
+ elm_object_part_content_set(bb, "icon", ic);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ av = elm_entry_add(win);
+ elm_entry_anchor_hover_style_set(av, "popout");
+ elm_entry_anchor_hover_parent_set(av, win);
+ elm_object_text_set(av,
+ "Hey what are you doing? This is the second last message "
+ "Hi there. This is the most recent message in the "
+ "list. It's a longer one so it can wrap more and "
+ "contains a <a href=contact:john>John</a> contact "
+ "link in it to test popups on links. The idea is that "
+ "all SMS's are scanned for things that look like phone "
+ "numbers or names that are in your contacts list, and "
+ "if they are, they become clickable links that pop up "
+ "a menus of obvious actions to perform on this piece "
+ "of information. This of course can be later explicitly "
+ "done by links maybe running local apps or even being "
+ "web URL's too that launch the web browser and point it "
+ "to that URL. <item relsize=16x16 vsize=full href=emoticon/omg></item>");
+ elm_object_content_set(bb, av);
+ evas_object_show(av);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
+ elm_image_file_set(ic, buf, NULL);
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_object_text_set(bb, "Message 1");
+ elm_object_part_text_set(bb, "info", "20:47 18/6/2008");
+ elm_object_part_content_set(bb, "icon", ic);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ av = elm_entry_add(win);
+ elm_entry_anchor_hover_style_set(av, "popout");
+ elm_entry_anchor_hover_parent_set(av, win);
+ elm_object_text_set(av, "This is a short message. <item relsize=16x16 vsize=full href=emoticon/haha></item>");
+ elm_object_content_set(bb, av);
+ evas_object_show(av);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
+
+ elm_object_content_set(sc, bx);
+ evas_object_show(bx);
+
+ evas_object_show(sc);
+}
+
+void
+test_win_socket(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bx, *lb;
+ Evas_Object *win_socket;
+
+ /* for socket info window */
+ win = elm_win_util_standard_add("win-socket", "Win Socket");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "<b>This is a small label</b>"
+ );
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb,
+ "If you run more than one Window Plug Program<br/>"
+ "you can see each plug programs shared same<br/>"
+ "canvas<br/>"
+ );
+ evas_object_size_hint_weight_set(lb, 0.0, 0.0);
+ evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ evas_object_resize(win, 320, 300);
+
+ evas_object_show(bx);
+ evas_object_show(win);
+ elm_win_resize_object_add(win, bx);
+
+ /* for socket window */
+ win_socket = elm_win_add(NULL, "Window Socket", ELM_WIN_SOCKET_IMAGE);
+
+ if (!elm_win_socket_listen(win_socket, "ello", 0, EINA_FALSE))
+ {
+ printf("Fail to elm win socket listen \n");
+ evas_object_del(win_socket);
+ evas_object_del(win);
+ return;
+ }
+ elm_win_title_set(win_socket, "Window Socket");
+ elm_win_autodel_set(win_socket, EINA_TRUE);
+
+ fill(win_socket, EINA_TRUE);
+
+ evas_object_resize(win_socket, 400, 600);
+ evas_object_show(win_socket);
+
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _win_del,
+ win_socket);
+}
diff --git a/src/bin/elementary/test_win_state.c b/src/bin/elementary/test_win_state.c
new file mode 100644
index 0000000000..c4b07f42c7
--- /dev/null
+++ b/src/bin/elementary/test_win_state.c
@@ -0,0 +1,630 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct _Testitem
+{
+ Elm_Object_Item *item;
+ int mode, onoff;
+} Testitem;
+
+static int rotate_with_resize = 0;
+static Eina_Bool fullscreen = EINA_FALSE;
+
+static void
+my_bt_38_alpha_on(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *bg = evas_object_data_get(win, "bg");
+ evas_object_hide(bg);
+ elm_win_alpha_set(win, EINA_TRUE);
+}
+
+static void
+my_bt_38_alpha_off(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Evas_Object *bg = evas_object_data_get(win, "bg");
+ evas_object_show(bg);
+ elm_win_alpha_set(win, EINA_FALSE);
+}
+
+static Eina_Bool
+_activate_timer_cb(void *data)
+{
+ printf("Activate window\n");
+ elm_win_activate(data);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_deiconify_timer_cb(void *data)
+{
+ printf("Deiconify window\n");
+ elm_win_iconified_set(data, EINA_FALSE);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_unwith(void *data)
+{
+ printf("show\n");
+ evas_object_show(data);
+ elm_win_activate(data);
+ return EINA_FALSE;
+}
+
+static void
+my_bt_38_withdraw(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ printf("withdraw, current %i\n", elm_win_withdrawn_get(win));
+ elm_win_withdrawn_set(win, EINA_TRUE);
+ ecore_timer_add(10.0, _unwith, win);
+}
+
+static void
+my_bt_38_massive(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ evas_object_resize(win, 4000, 2400);
+}
+
+static void
+my_ck_38_resize(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ rotate_with_resize = elm_check_state_get(obj);
+}
+
+static void
+my_bt_38_rot_0(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ if (rotate_with_resize)
+ elm_win_rotation_with_resize_set(win, 0);
+ else
+ elm_win_rotation_set(win, 0);
+}
+
+static void
+my_bt_38_rot_90(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ if (rotate_with_resize)
+ elm_win_rotation_with_resize_set(win, 90);
+ else
+ elm_win_rotation_set(win, 90);
+}
+
+static void
+my_bt_38_rot_180(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ if (rotate_with_resize)
+ elm_win_rotation_with_resize_set(win, 180);
+ else
+ elm_win_rotation_set(win, 180);
+}
+
+static void
+my_bt_38_rot_270(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ if (rotate_with_resize)
+ elm_win_rotation_with_resize_set(win, 270);
+ else
+ elm_win_rotation_set(win, 270);
+}
+
+static void
+my_ck_38_fullscreen(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ fullscreen = elm_check_state_get(obj);
+ elm_win_fullscreen_set(win, fullscreen);
+}
+
+static void
+my_ck_38_borderless(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ Eina_Bool borderless = elm_check_state_get(obj);
+ elm_win_borderless_set(win, borderless);
+}
+
+static void
+my_win_move(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Coord x, y;
+ elm_win_screen_position_get(obj, &x, &y);
+ printf("MOVE - win geom: %4i %4i\n", x, y);
+}
+
+static void
+_win_resize(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Coord w, h;
+ evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+ printf("RESIZE - win geom: %4ix%4i\n", w, h);
+}
+
+static void
+_win_foc_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("FOC IN\n");
+}
+
+static void
+_win_foc_out(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("FOC OUT\n");
+}
+
+static void
+_close_win(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static void
+_move_20_20(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_move(data, 20, 20);
+}
+
+static void
+_move_0_0(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_move(data, 0, 0);
+}
+
+static void
+_bt_win_lower(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Lower window\n");
+ elm_win_lower(data);
+}
+
+static void
+_bt_win_iconify_and_activate(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Iconify window. (current status: %i)\n", elm_win_iconified_get(data));
+ elm_win_iconified_set(data, EINA_TRUE);
+
+ printf("This window will be activated in 5 seconds.\n");
+ ecore_timer_add(5.0, _activate_timer_cb, data);
+}
+
+static void
+_bt_win_iconify_and_deiconify(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Iconify window. (current status: %i)\n", elm_win_iconified_get(data));
+ elm_win_iconified_set(data, EINA_TRUE);
+
+ printf("This window will be deiconified in 5 seconds.\n");
+ ecore_timer_add(5.0, _deiconify_timer_cb, data);
+}
+
+static void
+_bt_win_center_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Center window.\n");
+ elm_win_center(data, EINA_TRUE, EINA_TRUE);
+}
+
+static void
+_win_state_print_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("WIN: %s\n", (char *)data);
+}
+
+static void
+_win_state_focus_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("WIN FOCUS: %s\n", (char *)data);
+}
+
+static void
+_win_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("win: show\n");
+}
+
+static void
+_win_hide(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ printf("win: hide\n");
+}
+
+void
+test_win_state(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *sl, *bx, *bx2, *bt, *ck;
+
+ win = elm_win_add(NULL, "window-states", ELM_WIN_BASIC);
+ elm_win_title_set(win, "Window States");
+ evas_object_smart_callback_add(win, "moved", my_win_move, NULL);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _win_resize, NULL);
+ evas_event_callback_add(evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_FOCUS_IN, _win_foc_in, NULL);
+ evas_event_callback_add(evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_FOCUS_OUT, _win_foc_out, NULL);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_SHOW, _win_show, NULL);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_HIDE, _win_hide, NULL);
+ evas_object_smart_callback_add(win, "withdrawn", _win_state_print_cb, "withdrawn");
+ evas_object_smart_callback_add(win, "iconified", _win_state_print_cb, "iconified");
+ evas_object_smart_callback_add(win, "normal", _win_state_print_cb, "normal");
+ evas_object_smart_callback_add(win, "stick", _win_state_print_cb, "stick");
+ evas_object_smart_callback_add(win, "unstick", _win_state_print_cb, "unstick");
+ evas_object_smart_callback_add(win, "fullscreen", _win_state_print_cb, "fullscreen");
+ evas_object_smart_callback_add(win, "unfullscreen", _win_state_print_cb, "unfullscreen");
+ evas_object_smart_callback_add(win, "maximized", _win_state_print_cb, "maximized");
+ evas_object_smart_callback_add(win, "unmaximized", _win_state_print_cb, "unmaximized");
+ evas_object_smart_callback_add(win, "ioerr", _win_state_print_cb, "ioerr");
+ evas_object_smart_callback_add(win, "indicator,prop,changed", _win_state_print_cb, "indicator,prop,changed");
+ evas_object_smart_callback_add(win, "rotation,changed", _win_state_print_cb, "rotation,changed");
+ evas_object_smart_callback_add(win, "profile,changed", _win_state_print_cb, "profile,changed");
+ evas_object_smart_callback_add(win, "focused", _win_state_focus_cb, "focused");
+ evas_object_smart_callback_add(win, "unfocused", _win_state_focus_cb, "unfocused");
+ evas_object_smart_callback_add(win, "focus,out", _win_state_focus_cb, "focus,out");
+ evas_object_smart_callback_add(win, "focus,in", _win_state_focus_cb, "focus,in");
+ evas_object_smart_callback_add(win, "delete,request", _win_state_print_cb, "delete,request");
+ evas_object_smart_callback_add(win, "wm,rotation,changed", _win_state_print_cb, "wm,rotation,changed");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+ evas_object_data_set(win, "bg", bg);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Alpha On");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_on, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Alpha Off");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_off, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Withdraw");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_withdraw, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Massive");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_massive, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Move 20 20");
+ evas_object_smart_callback_add(bt, "clicked", _move_20_20, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Lower");
+ evas_object_smart_callback_add(bt, "clicked", _bt_win_lower, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Iconify and Activate");
+ evas_object_smart_callback_add(bt, "clicked",
+ _bt_win_iconify_and_activate, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(bx2);
+ elm_object_text_set(bt, "Iconify and Deiconify");
+ evas_object_smart_callback_add(bt, "clicked",
+ _bt_win_iconify_and_deiconify, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Center");
+ evas_object_smart_callback_add(bt, "clicked",
+ _bt_win_center_cb, win);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "Test");
+ elm_slider_span_size_set(sl, 100);
+ evas_object_size_hint_align_set(sl, 0.5, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_slider_indicator_format_set(sl, "%3.0f");
+ elm_slider_min_max_set(sl, 50, 150);
+ elm_slider_value_set(sl, 50);
+ elm_slider_inverted_set(sl, EINA_TRUE);
+ elm_box_pack_end(bx2, sl);
+ evas_object_show(sl);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "resize");
+ elm_check_state_set(ck, rotate_with_resize);
+ evas_object_smart_callback_add(ck, "changed", my_ck_38_resize, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.02, 0.99);
+ evas_object_show(ck);
+ elm_box_pack_end(bx, ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "fullscreen");
+ elm_check_state_set(ck, fullscreen);
+ evas_object_smart_callback_add(ck, "changed", my_ck_38_fullscreen, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.02, 0.99);
+ evas_object_show(ck);
+ elm_box_pack_end(bx, ck);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "borderless");
+ elm_check_state_set(ck, fullscreen);
+ evas_object_smart_callback_add(ck, "changed", my_ck_38_borderless, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.02, 0.99);
+ evas_object_show(ck);
+ elm_box_pack_end(bx, ck);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rot 0");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_0, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rot 90");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_90, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rot 180");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_180, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rot 270");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_270, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Move 0 0");
+ evas_object_smart_callback_add(bt, "clicked", _move_0_0, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 280, 400);
+ evas_object_show(win);
+}
+
+void
+test_win_state2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win, *bg, *sl, *bx, *bx2, *bt, *ck;
+ char buf[PATH_MAX];
+
+ win = elm_win_add(NULL, "window-states2", ELM_WIN_BASIC);
+ elm_win_override_set(win, EINA_TRUE);
+ evas_object_smart_callback_add(win, "moved", my_win_move, NULL);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _win_resize, NULL);
+ elm_win_title_set(win, "Window States 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ bg = elm_bg_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
+ elm_bg_file_set(bg, buf, NULL);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+ evas_object_data_set(win, "bg", bg);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+ evas_object_show(bx);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Alpha On");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_on, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Alpha Off");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_off, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, 0.0, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Close");
+ evas_object_smart_callback_add(bt, "clicked", _close_win, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Move 20 20");
+ evas_object_smart_callback_add(bt, "clicked", _move_20_20, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ sl = elm_slider_add(win);
+ elm_object_text_set(sl, "Override Redirect");
+ elm_slider_span_size_set(sl, 100);
+ evas_object_size_hint_align_set(sl, 0.5, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_slider_indicator_format_set(sl, "%3.0f");
+ elm_slider_min_max_set(sl, 50, 150);
+ elm_slider_value_set(sl, 50);
+ elm_slider_inverted_set(sl, EINA_TRUE);
+ elm_box_pack_end(bx2, sl);
+ evas_object_show(sl);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ ck = elm_check_add(win);
+ elm_object_text_set(ck, "resize");
+ elm_check_state_set(ck, rotate_with_resize);
+ evas_object_smart_callback_add(ck, "changed", my_ck_38_resize, win);
+ evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ck, 0.02, 0.99);
+ evas_object_show(ck);
+ elm_box_pack_end(bx, ck);
+
+ bx2 = elm_box_add(win);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_homogeneous_set(bx2, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rot 0");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_0, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rot 90");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_90, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rot 180");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_180, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Rot 270");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_270, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Move 0 0");
+ evas_object_smart_callback_add(bt, "clicked", _move_0_0, win);
+ evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx2, bt);
+ evas_object_show(bt);
+
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ evas_object_resize(win, 320, 480);
+ evas_object_show(win);
+}
diff --git a/src/bin/elementary/test_win_wm_rotation.c b/src/bin/elementary/test_win_wm_rotation.c
new file mode 100644
index 0000000000..1a37961310
--- /dev/null
+++ b/src/bin/elementary/test_win_wm_rotation.c
@@ -0,0 +1,214 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+typedef struct _App_Data App_Data;
+
+struct _App_Data
+{
+ Eina_Bool wm_rot_supported;
+ Eina_List *chs;
+ int available_rots[4];
+ Evas_Object *lb;
+ Evas_Object *rdg;
+};
+
+static void
+_bt_available_rots_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ App_Data *ad = evas_object_data_get(win, "ad");
+ Evas_Object *o;
+ Eina_List *l;
+ const char *str;
+ unsigned int i = 0;
+
+ if (!ad->wm_rot_supported) return;
+
+ EINA_LIST_FOREACH(ad->chs, l, o)
+ {
+ if (!elm_check_state_get(o)) continue;
+ str = elm_object_text_get(o);
+ if (!str) continue;
+ ad->available_rots[i] = atoi(str);
+ i++;
+ }
+
+ elm_win_wm_rotation_available_rotations_set
+ (win, ad->available_rots, i);
+}
+
+static void
+_bt_preferred_rot_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win = (Evas_Object *)(data);
+ App_Data *ad = evas_object_data_get(win, "ad");
+
+ if (!ad->wm_rot_supported) return;
+
+ Evas_Object *rd = elm_radio_selected_object_get(ad->rdg);
+ if (rd)
+ {
+ const char *str = elm_object_text_get(rd);
+ int rot = 0;
+
+ if (!strcmp(str, "Unset"))
+ rot = -1;
+ else
+ rot = atoi(str);
+
+ elm_win_wm_rotation_preferred_rotation_set(win, rot);
+ }
+}
+
+static void
+_win_wm_rotation_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ Evas_Object *win = data;
+ App_Data *ad = evas_object_data_get(win, "ad");
+ int rot = elm_win_rotation_get(win);
+ char buf[32];
+
+ if (!ad->wm_rot_supported) return;
+
+ eina_convert_itoa(rot, buf);
+ elm_object_text_set(ad->lb, eina_stringshare_add(buf));
+}
+
+static void
+_win_del_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ App_Data *ad = evas_object_data_get(obj, "ad");
+ Evas_Object *o;
+
+ if (ad->wm_rot_supported)
+ {
+ EINA_LIST_FREE(ad->chs, o)
+ evas_object_data_del(o, "rotation");
+ }
+
+ free(ad);
+}
+
+void
+test_win_wm_rotation(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ App_Data *ad;
+ Evas_Object *win, *bx, *bx2, *lb, *ch, *bt, *en, *rd, *rdg = NULL;
+ int i;
+ char buf[32];
+
+ if (!(ad = calloc(1, sizeof(App_Data)))) return;
+
+ win = elm_win_util_standard_add("wmrotation", "WMRotation");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_data_set(win, "ad", ad);
+
+ bx = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bx);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "<b>Window manager rotation test</b>");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+
+ ad->wm_rot_supported = elm_win_wm_rotation_supported_get(win);
+ if (ad->wm_rot_supported)
+ {
+ int rots[] = { 0, 90, 270 };
+ elm_win_wm_rotation_available_rotations_set(win, rots, (sizeof(rots) / sizeof(int)));
+ elm_win_wm_rotation_preferred_rotation_set(win, 90);
+
+ bx2 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0);
+ elm_box_align_set(bx2, 0.0, 0.5);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ for (i = 0; i < 4; i++)
+ {
+ ch = elm_check_add(win);
+ eina_convert_itoa((i * 90), buf);
+ elm_object_text_set(ch, eina_stringshare_add(buf));
+ evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx2, ch);
+ evas_object_show(ch);
+
+ if (i != 2) elm_check_state_set(ch, EINA_TRUE);
+
+ ad->chs = eina_list_append(ad->chs, ch);
+ }
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Available rotations");
+ evas_object_smart_callback_add(bt, "clicked", _bt_available_rots_set, win);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ bx2 = elm_box_add(win);
+ evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0);
+ elm_box_align_set(bx2, 0.0, 0.5);
+ elm_box_horizontal_set(bx2, EINA_TRUE);
+ elm_box_pack_end(bx, bx2);
+ evas_object_show(bx2);
+
+ for (i = 0; i < 5; i++)
+ {
+ rd = elm_radio_add(win);
+ if (!rdg) rdg = rd;
+ elm_radio_state_value_set(rd, i);
+ elm_radio_group_add(rd, rdg);
+
+ if (i == 0)
+ elm_object_text_set(rd, "Unset");
+ else
+ {
+ eina_convert_itoa(((i - 1) * 90), buf);
+ elm_object_text_set(rd, eina_stringshare_add(buf));
+ }
+
+ evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx2, rd);
+ evas_object_show(rd);
+ }
+
+ elm_radio_value_set(rdg, 2);
+ ad->rdg = rdg;
+
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Preferred rotation");
+ evas_object_smart_callback_add(bt, "clicked", _bt_preferred_rot_set, win);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
+ evas_object_smart_callback_add(win, "wm,rotation,changed", _win_wm_rotation_changed_cb, win);
+ }
+ else
+ printf("Window manager doesn't support rotation\n");
+
+ en = elm_entry_add(win);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, en);
+ evas_object_show(en);
+
+ lb = elm_label_add(win);
+ elm_object_text_set(lb, "N/A");
+ evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, lb);
+ evas_object_show(lb);
+ ad->lb = lb;
+
+ evas_object_smart_callback_add(win, "delete,request", _win_del_cb, NULL);
+
+ evas_object_resize(win, 480, 400);
+ evas_object_show(bx);
+ evas_object_show(win);
+}