Initial commit for enventor 55/161355/1 tizen_studio
authorJaehyun Cho <jae_hyun.cho@samsung.com>
Thu, 23 Nov 2017 04:27:19 +0000 (13:27 +0900)
committerJaehyun Cho <jae_hyun.cho@samsung.com>
Thu, 23 Nov 2017 04:27:19 +0000 (13:27 +0900)
Change-Id: Id6fdc023868f5eff6a045b0f11c9f067d7b03e48

665 files changed:
ABOUT-NLS [new file with mode: 0644]
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile_Eolian_Cxx_Helper.am [new file with mode: 0644]
Makefile_Eolian_Helper.am [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
autogen.sh [new file with mode: 0755]
configure.ac [new file with mode: 0644]
data/Makefile.am [new file with mode: 0644]
data/autocomp/2.3-autocomp.src [new file with mode: 0644]
data/autocomp/2.3.1-autocomp.src [new file with mode: 0644]
data/autocomp/2.3.2-autocomp.src [new file with mode: 0644]
data/autocomp/2.4-autocomp.src [new file with mode: 0644]
data/autocomp/3.0-autocomp.src [new file with mode: 0644]
data/autocomp/Makefile.am [new file with mode: 0644]
data/autocomp/autocomp.src [new file with mode: 0644]
data/color/Makefile.am [new file with mode: 0644]
data/color/edc.src [new file with mode: 0644]
data/color/syntax_template.dat [new file with mode: 0644]
data/color/syntax_template_old.dat [new file with mode: 0644]
data/desktop/Makefile.am [new file with mode: 0644]
data/desktop/enventor.desktop [new file with mode: 0644]
data/help/COMMAND [new file with mode: 0644]
data/help/DEVEL [new file with mode: 0644]
data/help/HISTORY [new file with mode: 0644]
data/help/INTRO [new file with mode: 0644]
data/help/Makefile.am [new file with mode: 0644]
data/help/SHORTCUT [new file with mode: 0644]
data/icon/Makefile.am [new file with mode: 0644]
data/icon/enventor.png [new file with mode: 0755]
data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_ICON_ARROW.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_ICON_BADGE.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_ICON_CLIP.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_ICON_DOCK.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_ICON_LOCK.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_IMAGE.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_MONTH_STROKE.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-01.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-02.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-03.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-04.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-05.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-06.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-07.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-08.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-09.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-10.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-11.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_TRIAB-12.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_WATCHFACE.png [new file with mode: 0644]
data/images/EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png [new file with mode: 0644]
data/images/Makefile.am [new file with mode: 0644]
data/images/enventor.ico [new file with mode: 0644]
data/images/enventor_logo.png [new file with mode: 0644]
data/reference/Makefile.am [new file with mode: 0644]
data/reference/reference.src [new file with mode: 0644]
data/sounds/EDC_EDITOR_EMBEDDED_TAP.wav [new file with mode: 0644]
data/sounds/Makefile.am [new file with mode: 0644]
data/templates/2.3-templates/Basic.edc [new file with mode: 0644]
data/templates/2.3-templates/Clip.edc [new file with mode: 0644]
data/templates/2.3-templates/CustomButton.edc [new file with mode: 0644]
data/templates/2.3-templates/Empty.edc [new file with mode: 0644]
data/templates/2.3-templates/Group.edc [new file with mode: 0644]
data/templates/2.3-templates/Image.edc [new file with mode: 0644]
data/templates/2.3-templates/Listitem.edc [new file with mode: 0644]
data/templates/2.3-templates/Makefile.am [new file with mode: 0644]
data/templates/2.3-templates/MobileLayout.edc [new file with mode: 0644]
data/templates/2.3-templates/MouseEvent.edc [new file with mode: 0644]
data/templates/2.3-templates/Proxy.edc [new file with mode: 0644]
data/templates/2.3-templates/Rect.edc [new file with mode: 0644]
data/templates/2.3-templates/Spacer.edc [new file with mode: 0644]
data/templates/2.3-templates/Text.edc [new file with mode: 0644]
data/templates/2.3-templates/Textblock.edc [new file with mode: 0644]
data/templates/2.3-templates/Transition.edc [new file with mode: 0644]
data/templates/2.3-templates/Tween.edc [new file with mode: 0644]
data/templates/2.3-templates/Watchface.edc [new file with mode: 0644]
data/templates/2.3-templates/Watchface2.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Basic.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Clip.edc [new file with mode: 0644]
data/templates/2.3.1-templates/CustomButton.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Empty.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Group.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Image.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Listitem.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Makefile.am [new file with mode: 0644]
data/templates/2.3.1-templates/MobileLayout.edc [new file with mode: 0644]
data/templates/2.3.1-templates/MouseEvent.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Proxy.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Rect.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Spacer.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Text.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Textblock.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Transition.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Tween.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Watchface.edc [new file with mode: 0644]
data/templates/2.3.1-templates/Watchface2.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Basic.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Clip.edc [new file with mode: 0644]
data/templates/2.3.2-templates/CustomButton.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Empty.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Group.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Image.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Listitem.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Makefile.am [new file with mode: 0644]
data/templates/2.3.2-templates/MobileLayout.edc [new file with mode: 0644]
data/templates/2.3.2-templates/MouseEvent.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Proxy.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Rect.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Spacer.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Text.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Textblock.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Transition.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Tween.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Watchface.edc [new file with mode: 0644]
data/templates/2.3.2-templates/Watchface2.edc [new file with mode: 0644]
data/templates/2.4-templates/Basic.edc [new file with mode: 0644]
data/templates/2.4-templates/Clip.edc [new file with mode: 0644]
data/templates/2.4-templates/CustomButton.edc [new file with mode: 0644]
data/templates/2.4-templates/Empty.edc [new file with mode: 0644]
data/templates/2.4-templates/Group.edc [new file with mode: 0644]
data/templates/2.4-templates/Image.edc [new file with mode: 0644]
data/templates/2.4-templates/Listitem.edc [new file with mode: 0644]
data/templates/2.4-templates/Makefile.am [new file with mode: 0644]
data/templates/2.4-templates/Map.edc [new file with mode: 0644]
data/templates/2.4-templates/MobileLayout.edc [new file with mode: 0644]
data/templates/2.4-templates/MouseEvent.edc [new file with mode: 0644]
data/templates/2.4-templates/Proxy.edc [new file with mode: 0644]
data/templates/2.4-templates/Rect.edc [new file with mode: 0644]
data/templates/2.4-templates/Spacer.edc [new file with mode: 0644]
data/templates/2.4-templates/Text.edc [new file with mode: 0644]
data/templates/2.4-templates/Textblock.edc [new file with mode: 0644]
data/templates/2.4-templates/Transition.edc [new file with mode: 0644]
data/templates/2.4-templates/Tween.edc [new file with mode: 0644]
data/templates/2.4-templates/Watchface.edc [new file with mode: 0644]
data/templates/2.4-templates/Watchface2.edc [new file with mode: 0644]
data/templates/3.0-templates/Basic.edc [new file with mode: 0644]
data/templates/3.0-templates/Clip.edc [new file with mode: 0644]
data/templates/3.0-templates/CustomButton.edc [new file with mode: 0644]
data/templates/3.0-templates/Empty.edc [new file with mode: 0644]
data/templates/3.0-templates/Group.edc [new file with mode: 0644]
data/templates/3.0-templates/Image.edc [new file with mode: 0644]
data/templates/3.0-templates/Listitem.edc [new file with mode: 0644]
data/templates/3.0-templates/Makefile.am [new file with mode: 0644]
data/templates/3.0-templates/Map.edc [new file with mode: 0644]
data/templates/3.0-templates/MobileLayout.edc [new file with mode: 0644]
data/templates/3.0-templates/MouseEvent.edc [new file with mode: 0644]
data/templates/3.0-templates/Proxy.edc [new file with mode: 0644]
data/templates/3.0-templates/Rect.edc [new file with mode: 0644]
data/templates/3.0-templates/Spacer.edc [new file with mode: 0644]
data/templates/3.0-templates/Text.edc [new file with mode: 0644]
data/templates/3.0-templates/Textblock.edc [new file with mode: 0644]
data/templates/3.0-templates/Transition.edc [new file with mode: 0644]
data/templates/3.0-templates/Tween.edc [new file with mode: 0644]
data/templates/3.0-templates/Watchface.edc [new file with mode: 0644]
data/templates/3.0-templates/Watchface2.edc [new file with mode: 0644]
data/templates/Basic.edc [new file with mode: 0644]
data/templates/Clip.edc [new file with mode: 0644]
data/templates/CustomButton.edc [new file with mode: 0644]
data/templates/Empty.edc [new file with mode: 0644]
data/templates/Group.edc [new file with mode: 0644]
data/templates/Image.edc [new file with mode: 0644]
data/templates/Listitem.edc [new file with mode: 0644]
data/templates/Makefile.am [new file with mode: 0644]
data/templates/Map.edc [new file with mode: 0644]
data/templates/MobileLayout.edc [new file with mode: 0644]
data/templates/MouseEvent.edc [new file with mode: 0644]
data/templates/Proxy.edc [new file with mode: 0644]
data/templates/Rect.edc [new file with mode: 0644]
data/templates/Spacer.edc [new file with mode: 0644]
data/templates/Text.edc [new file with mode: 0644]
data/templates/Textblock.edc [new file with mode: 0644]
data/templates/Transition.edc [new file with mode: 0644]
data/templates/Tween.edc [new file with mode: 0644]
data/templates/Watchface.edc [new file with mode: 0644]
data/templates/Watchface2.edc [new file with mode: 0644]
data/themes/Makefile.am [new file with mode: 0644]
data/themes/default/Makefile.am [new file with mode: 0644]
data/themes/default/content.edc [new file with mode: 0644]
data/themes/default/enventor.edc [new file with mode: 0644]
data/themes/default/fonts/BreezeSans-Bold.ttf [new file with mode: 0644]
data/themes/default/fonts/BreezeSans.ttf [new file with mode: 0644]
data/themes/default/fonts/Makefile.am [new file with mode: 0644]
data/themes/default/images.edc [new file with mode: 0644]
data/themes/default/images/Makefile.am [new file with mode: 0644]
data/themes/default/images/about.png [new file with mode: 0644]
data/themes/default/images/about_clicked.png [new file with mode: 0644]
data/themes/default/images/about_hover.png [new file with mode: 0644]
data/themes/default/images/bevel_curved_vert_out.png [new file with mode: 0644]
data/themes/default/images/bevel_in.png [new file with mode: 0644]
data/themes/default/images/bevel_out.png [new file with mode: 0644]
data/themes/default/images/bg_glow_in.png [new file with mode: 0644]
data/themes/default/images/bt_base1.png [new file with mode: 0644]
data/themes/default/images/bt_base2.png [new file with mode: 0644]
data/themes/default/images/bt_dis_base.png [new file with mode: 0644]
data/themes/default/images/bt_dis_hilight.png [new file with mode: 0644]
data/themes/default/images/bt_glow.png [new file with mode: 0644]
data/themes/default/images/bt_hilight.png [new file with mode: 0644]
data/themes/default/images/bt_shine.png [new file with mode: 0644]
data/themes/default/images/candidates_list_arrow_down.png [new file with mode: 0644]
data/themes/default/images/candidates_list_arrow_left.png [new file with mode: 0644]
data/themes/default/images/candidates_list_arrow_right.png [new file with mode: 0644]
data/themes/default/images/candidates_list_arrow_up.png [new file with mode: 0644]
data/themes/default/images/candidates_list_bg.png [new file with mode: 0644]
data/themes/default/images/check.png [new file with mode: 0644]
data/themes/default/images/console.png [new file with mode: 0644]
data/themes/default/images/console_clicked.png [new file with mode: 0644]
data/themes/default/images/console_hover.png [new file with mode: 0644]
data/themes/default/images/cursor_arrow.png [new file with mode: 0644]
data/themes/default/images/disabler.png [new file with mode: 0644]
data/themes/default/images/downlight_glow_left.png [new file with mode: 0644]
data/themes/default/images/downlight_glow_right.png [new file with mode: 0644]
data/themes/default/images/dummy.png [new file with mode: 0644]
data/themes/default/images/dummy_clicked.png [new file with mode: 0644]
data/themes/default/images/dummy_hover.png [new file with mode: 0644]
data/themes/default/images/edc_navigator.png [new file with mode: 0644]
data/themes/default/images/edc_navigator_clicked.png [new file with mode: 0644]
data/themes/default/images/edc_navigator_hover.png [new file with mode: 0644]
data/themes/default/images/edceditor_icon.png [new file with mode: 0644]
data/themes/default/images/expand.png [new file with mode: 0644]
data/themes/default/images/expand_clicked.png [new file with mode: 0644]
data/themes/default/images/expand_hover.png [new file with mode: 0644]
data/themes/default/images/file_browser.png [new file with mode: 0644]
data/themes/default/images/file_browser_clicked.png [new file with mode: 0644]
data/themes/default/images/file_browser_hover.png [new file with mode: 0644]
data/themes/default/images/filetab.png [new file with mode: 0644]
data/themes/default/images/find.png [new file with mode: 0644]
data/themes/default/images/find_clicked.png [new file with mode: 0644]
data/themes/default/images/find_hover.png [new file with mode: 0644]
data/themes/default/images/full_logo.png [new file with mode: 0644]
data/themes/default/images/glow_small.png [new file with mode: 0644]
data/themes/default/images/goto.png [new file with mode: 0644]
data/themes/default/images/goto_clicked.png [new file with mode: 0644]
data/themes/default/images/goto_hover.png [new file with mode: 0644]
data/themes/default/images/help_bg.png [new file with mode: 0644]
data/themes/default/images/highlight.png [new file with mode: 0644]
data/themes/default/images/highlight_clicked.png [new file with mode: 0644]
data/themes/default/images/highlight_hover.png [new file with mode: 0644]
data/themes/default/images/holes_tiny_glow_horiz.png [new file with mode: 0644]
data/themes/default/images/holes_tiny_glow_vert.png [new file with mode: 0644]
data/themes/default/images/holes_tiny_horiz.png [new file with mode: 0644]
data/themes/default/images/holes_tiny_vert.png [new file with mode: 0644]
data/themes/default/images/horizontal_separated_bar_small_glow.png [new file with mode: 0644]
data/themes/default/images/icon_close.png [new file with mode: 0644]
data/themes/default/images/icon_close_tab.png [new file with mode: 0644]
data/themes/default/images/icon_file.png [new file with mode: 0644]
data/themes/default/images/icon_file2.png [new file with mode: 0644]
data/themes/default/images/icon_file_selected.png [new file with mode: 0644]
data/themes/default/images/icon_folder.png [new file with mode: 0644]
data/themes/default/images/icon_folder_selected.png [new file with mode: 0644]
data/themes/default/images/info_rightbottom.png [new file with mode: 0644]
data/themes/default/images/info_topleft.png [new file with mode: 0644]
data/themes/default/images/info_window.png [new file with mode: 0644]
data/themes/default/images/inset_shadow.png [new file with mode: 0644]
data/themes/default/images/invert.png [new file with mode: 0644]
data/themes/default/images/invert_clicked.png [new file with mode: 0644]
data/themes/default/images/invert_hover.png [new file with mode: 0644]
data/themes/default/images/lines.png [new file with mode: 0644]
data/themes/default/images/lines_clicked.png [new file with mode: 0644]
data/themes/default/images/lines_hover.png [new file with mode: 0644]
data/themes/default/images/list_h_item_hovered_bg.png [new file with mode: 0644]
data/themes/default/images/list_h_item_normal_bg.png [new file with mode: 0644]
data/themes/default/images/list_h_item_selected_bg.png [new file with mode: 0644]
data/themes/default/images/live_bg_glow_in.png [new file with mode: 0644]
data/themes/default/images/live_bg_glow_in_24.png [new file with mode: 0644]
data/themes/default/images/live_image.png [new file with mode: 0644]
data/themes/default/images/live_image_clicked.png [new file with mode: 0644]
data/themes/default/images/live_image_hover.png [new file with mode: 0644]
data/themes/default/images/live_rectangle.png [new file with mode: 0644]
data/themes/default/images/live_rectangle_clicked.png [new file with mode: 0644]
data/themes/default/images/live_rectangle_hover.png [new file with mode: 0644]
data/themes/default/images/live_spacer.png [new file with mode: 0644]
data/themes/default/images/live_spacer_icon.png [new file with mode: 0644]
data/themes/default/images/live_spacer_icon_clicked.png [new file with mode: 0644]
data/themes/default/images/live_spacer_icon_hover.png [new file with mode: 0644]
data/themes/default/images/live_swallow.png [new file with mode: 0644]
data/themes/default/images/live_swallow_clicked.png [new file with mode: 0644]
data/themes/default/images/live_swallow_hover.png [new file with mode: 0644]
data/themes/default/images/live_text.png [new file with mode: 0644]
data/themes/default/images/live_text_clicked.png [new file with mode: 0644]
data/themes/default/images/live_text_hover.png [new file with mode: 0644]
data/themes/default/images/live_textblock.png [new file with mode: 0644]
data/themes/default/images/live_textblock_clicked.png [new file with mode: 0644]
data/themes/default/images/live_textblock_hover.png [new file with mode: 0644]
data/themes/default/images/menu.png [new file with mode: 0644]
data/themes/default/images/mirror.png [new file with mode: 0644]
data/themes/default/images/mirror_clicked.png [new file with mode: 0644]
data/themes/default/images/mirror_hover.png [new file with mode: 0644]
data/themes/default/images/navi_group.png [new file with mode: 0644]
data/themes/default/images/navi_group_selected.png [new file with mode: 0644]
data/themes/default/images/navi_image.png [new file with mode: 0644]
data/themes/default/images/navi_image_selected.png [new file with mode: 0644]
data/themes/default/images/navi_play.png [new file with mode: 0644]
data/themes/default/images/navi_program.png [new file with mode: 0644]
data/themes/default/images/navi_program_selected.png [new file with mode: 0644]
data/themes/default/images/navi_rect.png [new file with mode: 0644]
data/themes/default/images/navi_rect_selected.png [new file with mode: 0644]
data/themes/default/images/navi_spacer.png [new file with mode: 0644]
data/themes/default/images/navi_spacer_selected.png [new file with mode: 0644]
data/themes/default/images/navi_state.png [new file with mode: 0644]
data/themes/default/images/navi_state_selected.png [new file with mode: 0644]
data/themes/default/images/navi_stop.png [new file with mode: 0644]
data/themes/default/images/navi_swallow.png [new file with mode: 0644]
data/themes/default/images/navi_swallow_selected.png [new file with mode: 0644]
data/themes/default/images/navi_text.png [new file with mode: 0644]
data/themes/default/images/navi_text_selected.png [new file with mode: 0644]
data/themes/default/images/navi_textblock.png [new file with mode: 0644]
data/themes/default/images/navi_textblock_selected.png [new file with mode: 0644]
data/themes/default/images/navi_unknown.png [new file with mode: 0644]
data/themes/default/images/navi_unknown_selected.png [new file with mode: 0644]
data/themes/default/images/part_highlight.png [new file with mode: 0644]
data/themes/default/images/popup_shadow.png [new file with mode: 0644]
data/themes/default/images/preview_bg.png [new file with mode: 0644]
data/themes/default/images/preview_image.png [new file with mode: 0644]
data/themes/default/images/preview_swallow.png [new file with mode: 0644]
data/themes/default/images/redo.png [new file with mode: 0644]
data/themes/default/images/redo_clicked.png [new file with mode: 0644]
data/themes/default/images/redo_hover.png [new file with mode: 0644]
data/themes/default/images/refresh.png [new file with mode: 0644]
data/themes/default/images/refresh_clicked.png [new file with mode: 0644]
data/themes/default/images/refresh_hover.png [new file with mode: 0644]
data/themes/default/images/runner_glow_horiz.png [new file with mode: 0644]
data/themes/default/images/runner_glow_vert.png [new file with mode: 0644]
data/themes/default/images/runner_horiz.png [new file with mode: 0644]
data/themes/default/images/runner_vert.png [new file with mode: 0644]
data/themes/default/images/save.png [new file with mode: 0644]
data/themes/default/images/save_clicked.png [new file with mode: 0644]
data/themes/default/images/save_hover.png [new file with mode: 0644]
data/themes/default/images/setting.png [new file with mode: 0644]
data/themes/default/images/setting_clicked.png [new file with mode: 0644]
data/themes/default/images/setting_hover.png [new file with mode: 0644]
data/themes/default/images/setting_icon.png [new file with mode: 0644]
data/themes/default/images/setting_icon_data.png [new file with mode: 0644]
data/themes/default/images/setting_icon_font.png [new file with mode: 0644]
data/themes/default/images/setting_icon_img.png [new file with mode: 0644]
data/themes/default/images/setting_icon_sound.png [new file with mode: 0644]
data/themes/default/images/shadow_rounded_vert.png [new file with mode: 0644]
data/themes/default/images/shadow_square_tiny.png [new file with mode: 0644]
data/themes/default/images/sizebox_icon.png [new file with mode: 0644]
data/themes/default/images/slider_down.png [new file with mode: 0644]
data/themes/default/images/slider_minus.png [new file with mode: 0644]
data/themes/default/images/slider_minus_hover.png [new file with mode: 0644]
data/themes/default/images/slider_minus_push.png [new file with mode: 0644]
data/themes/default/images/slider_plus.png [new file with mode: 0644]
data/themes/default/images/slider_plus_hover.png [new file with mode: 0644]
data/themes/default/images/slider_plus_push.png [new file with mode: 0644]
data/themes/default/images/slider_up.png [new file with mode: 0644]
data/themes/default/images/status.png [new file with mode: 0644]
data/themes/default/images/status_bg.png [new file with mode: 0644]
data/themes/default/images/status_clicked.png [new file with mode: 0644]
data/themes/default/images/status_hover.png [new file with mode: 0644]
data/themes/default/images/swallow.png [new file with mode: 0644]
data/themes/default/images/sym_down_glow_normal.png [new file with mode: 0644]
data/themes/default/images/sym_down_light_normal.png [new file with mode: 0644]
data/themes/default/images/sym_left_glow_normal.png [new file with mode: 0644]
data/themes/default/images/sym_left_light_normal.png [new file with mode: 0644]
data/themes/default/images/sym_right_glow_normal.png [new file with mode: 0644]
data/themes/default/images/sym_right_light_normal.png [new file with mode: 0644]
data/themes/default/images/sym_up_glow_normal.png [new file with mode: 0644]
data/themes/default/images/sym_up_light_normal.png [new file with mode: 0644]
data/themes/default/images/template.png [new file with mode: 0644]
data/themes/default/images/template_clicked.png [new file with mode: 0644]
data/themes/default/images/template_hover.png [new file with mode: 0644]
data/themes/default/images/text_color_01.png [new file with mode: 0644]
data/themes/default/images/text_color_02.png [new file with mode: 0644]
data/themes/default/images/text_color_03.png [new file with mode: 0644]
data/themes/default/images/tool_percent_nor.png [new file with mode: 0644]
data/themes/default/images/tool_zoom_in_mv.png [new file with mode: 0644]
data/themes/default/images/tool_zoom_in_nor.png [new file with mode: 0644]
data/themes/default/images/tool_zoom_out_mv.png [new file with mode: 0644]
data/themes/default/images/tool_zoom_out_nor.png [new file with mode: 0644]
data/themes/default/images/undo.png [new file with mode: 0644]
data/themes/default/images/undo_clicked.png [new file with mode: 0644]
data/themes/default/images/undo_hover.png [new file with mode: 0644]
data/themes/default/images/vgrad_med_lighter.png [new file with mode: 0644]
data/themes/default/images/warning_icon.png [new file with mode: 0644]
data/themes/default/images/white_bar_vert_glow.png [new file with mode: 0644]
data/themes/default/images/window_none_title_bg.png [new file with mode: 0644]
data/themes/default/images/window_scale_controller.png [new file with mode: 0644]
data/themes/default/images/window_scale_controller_bottom.png [new file with mode: 0644]
data/themes/default/images/window_scale_controller_bottom_hover.png [new file with mode: 0644]
data/themes/default/images/window_scale_controller_bottom_push.png [new file with mode: 0644]
data/themes/default/images/window_scale_controller_hover.png [new file with mode: 0644]
data/themes/default/images/window_scale_controller_push.png [new file with mode: 0644]
data/themes/default/images/window_scale_controller_top.png [new file with mode: 0644]
data/themes/default/images/window_scale_controller_top_hover.png [new file with mode: 0644]
data/themes/default/images/window_scale_controller_top_push.png [new file with mode: 0644]
data/themes/default/images/window_title_bg.png [new file with mode: 0644]
data/themes/default/images/wireframes.png [new file with mode: 0644]
data/themes/default/images/wireframes_icon.png [new file with mode: 0644]
data/themes/default/images/wireframes_icon_clicked.png [new file with mode: 0644]
data/themes/default/images/wireframes_icon_hover.png [new file with mode: 0644]
data/themes/default/layout_common.edc [new file with mode: 0644]
data/themes/default/layout_setting.edc [new file with mode: 0644]
data/themes/default/live_edit.edc [new file with mode: 0644]
data/themes/default/sounds/Makefile.am [new file with mode: 0644]
data/themes/default/sounds/kbd-tap.wav [new file with mode: 0644]
data/themes/default/sounds/kbd-tap2.wav [new file with mode: 0644]
data/themes/default/sounds/kbd-tap3.wav [new file with mode: 0644]
data/themes/default/sounds/kbd-tap4.wav [new file with mode: 0644]
data/themes/default/sounds/kbd-tap5.wav [new file with mode: 0644]
data/themes/default/theme_ext.edc [new file with mode: 0644]
data/themes/elm/Makefile.am [new file with mode: 0644]
data/themes/elm/button.edc [new file with mode: 0644]
data/themes/elm/check.edc [new file with mode: 0644]
data/themes/elm/colorsel.edc [new file with mode: 0644]
data/themes/elm/entry.edc [new file with mode: 0644]
data/themes/elm/enventor.edc [new file with mode: 0644]
data/themes/elm/focus.edc [new file with mode: 0644]
data/themes/elm/fonts/BreezeSans-Bold.ttf [new file with mode: 0644]
data/themes/elm/fonts/BreezeSans.ttf [new file with mode: 0644]
data/themes/elm/fonts/Makefile.am [new file with mode: 0644]
data/themes/elm/genlist.edc [new file with mode: 0644]
data/themes/elm/hover.edc [new file with mode: 0644]
data/themes/elm/images/Makefile.am [new file with mode: 0644]
data/themes/elm/images/bevel_dark_in.png [new file with mode: 0644]
data/themes/elm/images/bevel_in.png [new file with mode: 0644]
data/themes/elm/images/bg_glow_in.png [new file with mode: 0644]
data/themes/elm/images/btn_help_widget.png [new file with mode: 0644]
data/themes/elm/images/btn_help_widget_hover.png [new file with mode: 0644]
data/themes/elm/images/btn_help_widget_push.png [new file with mode: 0644]
data/themes/elm/images/btn_tab_left.png [new file with mode: 0644]
data/themes/elm/images/btn_tab_left_hover.png [new file with mode: 0644]
data/themes/elm/images/btn_tab_left_push.png [new file with mode: 0644]
data/themes/elm/images/btn_tab_right.png [new file with mode: 0644]
data/themes/elm/images/btn_tab_right_hover.png [new file with mode: 0644]
data/themes/elm/images/btn_tab_right_push.png [new file with mode: 0644]
data/themes/elm/images/btn_widget.png [new file with mode: 0644]
data/themes/elm/images/btn_widget_disable.png [new file with mode: 0644]
data/themes/elm/images/btn_widget_hover.png [new file with mode: 0644]
data/themes/elm/images/btn_widget_push.png [new file with mode: 0644]
data/themes/elm/images/candidates_list_bg.png [new file with mode: 0644]
data/themes/elm/images/canvas_pattern.png [new file with mode: 0644]
data/themes/elm/images/check_nor.png [new file with mode: 0644]
data/themes/elm/images/check_sel.png [new file with mode: 0644]
data/themes/elm/images/col_sel_end_bottom.png [new file with mode: 0644]
data/themes/elm/images/col_sel_end_top.png [new file with mode: 0644]
data/themes/elm/images/color_btn_widget.png [new file with mode: 0644]
data/themes/elm/images/color_btn_widget_disable.png [new file with mode: 0644]
data/themes/elm/images/color_btn_widget_hover.png [new file with mode: 0644]
data/themes/elm/images/color_btn_widget_push.png [new file with mode: 0644]
data/themes/elm/images/color_picker_alpha.png [new file with mode: 0644]
data/themes/elm/images/color_picker_brightness.png [new file with mode: 0644]
data/themes/elm/images/color_picker_color.png [new file with mode: 0644]
data/themes/elm/images/color_picker_opacity.png [new file with mode: 0644]
data/themes/elm/images/colorbar_btn_l_mv.png [new file with mode: 0644]
data/themes/elm/images/colorbar_btn_l_nor.png [new file with mode: 0644]
data/themes/elm/images/colorbar_btn_l_sel.png [new file with mode: 0644]
data/themes/elm/images/colorbar_btn_r_mv.png [new file with mode: 0644]
data/themes/elm/images/colorbar_btn_r_nor.png [new file with mode: 0644]
data/themes/elm/images/colorbar_btn_r_sel.png [new file with mode: 0644]
data/themes/elm/images/dot_pattern.png [new file with mode: 0644]
data/themes/elm/images/dropdown_arrow.png [new file with mode: 0644]
data/themes/elm/images/inset_shadow.png [new file with mode: 0644]
data/themes/elm/images/ring_shadow.png [new file with mode: 0644]
data/themes/elm/images/ring_white_blue_glow.png [new file with mode: 0644]
data/themes/elm/images/ring_white_middle.png [new file with mode: 0644]
data/themes/elm/images/scroll.png [new file with mode: 0644]
data/themes/elm/images/scroll_bg.png [new file with mode: 0644]
data/themes/elm/images/scroll_bg_h.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_down.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_down_disable.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_down_hover.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_down_push.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_left.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_left_disable.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_left_hover.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_left_push.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_right.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_right_disable.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_right_hover.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_right_push.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_up.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_up_disable.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_up_hover.png [new file with mode: 0644]
data/themes/elm/images/scroll_btn_up_push.png [new file with mode: 0644]
data/themes/elm/images/scroll_h.png [new file with mode: 0644]
data/themes/elm/images/scroll_h_hover.png [new file with mode: 0644]
data/themes/elm/images/scroll_h_push.png [new file with mode: 0644]
data/themes/elm/images/scroll_handle.png [new file with mode: 0644]
data/themes/elm/images/scroll_handle_h.png [new file with mode: 0644]
data/themes/elm/images/scroll_hover.png [new file with mode: 0644]
data/themes/elm/images/scroll_push.png [new file with mode: 0644]
data/themes/elm/images/slider_gauge.png [new file with mode: 0644]
data/themes/elm/images/slider_gauge_handle.png [new file with mode: 0644]
data/themes/elm/images/slider_gauge_handle_pop.png [new file with mode: 0644]
data/themes/elm/images/slider_gauge_over.png [new file with mode: 0644]
data/themes/elm/images/slider_gauge_over_pop.png [new file with mode: 0644]
data/themes/elm/images/slider_gauge_pop.png [new file with mode: 0644]
data/themes/elm/images/sym_left_dark_normal.png [new file with mode: 0644]
data/themes/elm/images/sym_left_glow_normal.png [new file with mode: 0644]
data/themes/elm/images/sym_left_light_normal.png [new file with mode: 0644]
data/themes/elm/images/sym_right_dark_normal.png [new file with mode: 0644]
data/themes/elm/images/sym_right_glow_normal.png [new file with mode: 0644]
data/themes/elm/images/sym_right_light_normal.png [new file with mode: 0644]
data/themes/elm/images/text_input_box.png [new file with mode: 0644]
data/themes/elm/images/text_input_box_hover.png [new file with mode: 0644]
data/themes/elm/images/text_input_box_push.png [new file with mode: 0644]
data/themes/elm/images/text_input_box_selected.png [new file with mode: 0644]
data/themes/elm/images/toggle_off.png [new file with mode: 0644]
data/themes/elm/images/toggle_on.png [new file with mode: 0644]
data/themes/elm/images/tooltip-base.png [new file with mode: 0644]
data/themes/elm/images/tooltip-corner-bottom-left-tip.png [new file with mode: 0644]
data/themes/elm/images/tooltip-corner-bottom-right-tip.png [new file with mode: 0644]
data/themes/elm/images/tooltip-corner-top-left-tip.png [new file with mode: 0644]
data/themes/elm/images/tooltip-corner-top-right-tip.png [new file with mode: 0644]
data/themes/elm/images/tooltip-edge-bottom-tip.png [new file with mode: 0644]
data/themes/elm/images/tooltip-edge-left-tip.png [new file with mode: 0644]
data/themes/elm/images/tooltip-edge-right-tip.png [new file with mode: 0644]
data/themes/elm/images/tooltip-edge-top-tip.png [new file with mode: 0644]
data/themes/elm/images/vert_bar_inset.png [new file with mode: 0644]
data/themes/elm/images/view_arrow_down_nor.png [new file with mode: 0644]
data/themes/elm/images/view_arrow_down_sel.png [new file with mode: 0644]
data/themes/elm/images/view_arrow_right_nor.png [new file with mode: 0644]
data/themes/elm/images/view_arrow_right_sel.png [new file with mode: 0644]
data/themes/elm/images/white_bar_vert_glow.png [new file with mode: 0644]
data/themes/elm/images/window_scale_controller_h.png [new file with mode: 0644]
data/themes/elm/images/window_scale_controller_h_hover.png [new file with mode: 0644]
data/themes/elm/images/window_scale_controller_h_push.png [new file with mode: 0644]
data/themes/elm/images/window_scale_controller_left.png [new file with mode: 0644]
data/themes/elm/images/window_scale_controller_left_hover.png [new file with mode: 0644]
data/themes/elm/images/window_scale_controller_left_push.png [new file with mode: 0644]
data/themes/elm/images/window_scale_controller_right.png [new file with mode: 0644]
data/themes/elm/images/window_scale_controller_right_hover.png [new file with mode: 0644]
data/themes/elm/images/window_scale_controller_right_push.png [new file with mode: 0644]
data/themes/elm/label.edc [new file with mode: 0644]
data/themes/elm/list.edc [new file with mode: 0644]
data/themes/elm/menu.edc [new file with mode: 0644]
data/themes/elm/panes.edc [new file with mode: 0644]
data/themes/elm/scroller.edc [new file with mode: 0644]
data/themes/elm/separator.edc [new file with mode: 0644]
data/themes/elm/slider.edc [new file with mode: 0644]
data/themes/elm/spinner.edc [new file with mode: 0644]
data/themes/elm/tooltip.edc [new file with mode: 0644]
m4/efl_attribute.m4 [new file with mode: 0644]
m4/efl_beta.m4 [new file with mode: 0644]
m4/efl_binary.m4 [new file with mode: 0644]
m4/efl_eo.m4 [new file with mode: 0644]
m4/elm_quicklaunch.m4 [new file with mode: 0644]
macos-64_pkg/bin/enventor [new file with mode: 0755]
macos-64_pkg/macos-64_pkg.tar.gz [new file with mode: 0644]
package/build.linux [new file with mode: 0755]
package/build.macos [new file with mode: 0755]
package/build.windows [new file with mode: 0755]
package/changelog [new file with mode: 0644]
package/enventor.install.linux [new file with mode: 0755]
package/enventor.install.macos [new file with mode: 0755]
package/enventor.install.windows [new file with mode: 0755]
package/enventor.remove.linux [new file with mode: 0755]
package/enventor.remove.macos [new file with mode: 0755]
package/enventor.remove.windows [new file with mode: 0755]
package/pkginfo.manifest [new file with mode: 0644]
pc/enventor.pc.in [new file with mode: 0644]
po/LINGUAS [new file with mode: 0644]
po/Makefile.in.in [new file with mode: 0644]
po/Makevars [new file with mode: 0644]
po/Makevars.template [new file with mode: 0644]
po/POTFILES [new file with mode: 0644]
po/POTFILES.in [new file with mode: 0644]
po/Rules-quot [new file with mode: 0644]
po/boldquot.sed [new file with mode: 0644]
po/en.gmo [new file with mode: 0644]
po/en.po [new file with mode: 0644]
po/en@boldquot.header [new file with mode: 0644]
po/en@quot.header [new file with mode: 0644]
po/enventor.pot [new file with mode: 0644]
po/insert-header.sin [new file with mode: 0644]
po/quot.sed [new file with mode: 0644]
po/remove-potcdate.sin [new file with mode: 0644]
po/ru.gmo [new file with mode: 0644]
po/ru.po [new file with mode: 0644]
po/stamp-po [new file with mode: 0644]
src/Makefile.am [new file with mode: 0644]
src/bin/Makefile.am [new file with mode: 0644]
src/bin/base_gui.c [new file with mode: 0644]
src/bin/build_setting.c [new file with mode: 0644]
src/bin/config_data.c [new file with mode: 0644]
src/bin/console.c [new file with mode: 0644]
src/bin/edc_navigator.c [new file with mode: 0644]
src/bin/file_browser.c [new file with mode: 0644]
src/bin/file_mgr.c [new file with mode: 0644]
src/bin/file_tab.c [new file with mode: 0644]
src/bin/goto.c [new file with mode: 0644]
src/bin/help.c [new file with mode: 0644]
src/bin/live_edit.c [new file with mode: 0644]
src/bin/main.c [new file with mode: 0644]
src/bin/menu.c [new file with mode: 0644]
src/bin/newfile.c [new file with mode: 0644]
src/bin/panes.c [new file with mode: 0644]
src/bin/preference_setting.c [new file with mode: 0644]
src/bin/search.c [new file with mode: 0644]
src/bin/setting.c [new file with mode: 0644]
src/bin/statusbar.c [new file with mode: 0644]
src/bin/text_setting.c [new file with mode: 0644]
src/bin/tools.c [new file with mode: 0644]
src/bin/utils.c [new file with mode: 0644]
src/include/Makefile.am [new file with mode: 0644]
src/include/base_gui.h [new file with mode: 0644]
src/include/build_setting.h [new file with mode: 0644]
src/include/common.h [new file with mode: 0644]
src/include/config_data.h [new file with mode: 0644]
src/include/console.h [new file with mode: 0644]
src/include/edc_navigator.h [new file with mode: 0644]
src/include/file_browser.h [new file with mode: 0644]
src/include/file_mgr.h [new file with mode: 0644]
src/include/file_tab.h [new file with mode: 0644]
src/include/goto.h [new file with mode: 0644]
src/include/help.h [new file with mode: 0644]
src/include/live_edit.h [new file with mode: 0644]
src/include/menu.h [new file with mode: 0644]
src/include/newfile.h [new file with mode: 0644]
src/include/panes.h [new file with mode: 0644]
src/include/preference_setting.h [new file with mode: 0644]
src/include/search.h [new file with mode: 0644]
src/include/setting.h [new file with mode: 0644]
src/include/statusbar.h [new file with mode: 0644]
src/include/text_setting.h [new file with mode: 0644]
src/include/tools.h [new file with mode: 0644]
src/include/utils.h [new file with mode: 0644]
src/lib/Enventor.h.in [new file with mode: 0644]
src/lib/Enventor_Eo.h [new file with mode: 0644]
src/lib/Enventor_Legacy.h [new file with mode: 0644]
src/lib/Makefile.am [new file with mode: 0644]
src/lib/auto_comp.c [new file with mode: 0644]
src/lib/build.c [new file with mode: 0644]
src/lib/ctxpopup.c [new file with mode: 0644]
src/lib/dummy_obj.c [new file with mode: 0644]
src/lib/edc_editor.c [new file with mode: 0644]
src/lib/edc_parser.c [new file with mode: 0644]
src/lib/edj_mgr.c [new file with mode: 0644]
src/lib/edj_viewer.c [new file with mode: 0644]
src/lib/enventor_main.c [new file with mode: 0644]
src/lib/enventor_object.eo [new file with mode: 0644]
src/lib/enventor_private.h [new file with mode: 0644]
src/lib/enventor_smart.c [new file with mode: 0644]
src/lib/redoundo.c [new file with mode: 0644]
src/lib/reference.c [new file with mode: 0644]
src/lib/syntax_color.c [new file with mode: 0644]
src/lib/syntax_helper.c [new file with mode: 0644]
src/lib/syntax_indent.c [new file with mode: 0644]
src/lib/template.c [new file with mode: 0644]
src/lib/template_code.h [new file with mode: 0644]
src/lib/template_code_2.3.h [new file with mode: 0644]
src/lib/util.c [new file with mode: 0644]
src/lib/wireframes_obj.c [new file with mode: 0644]
windows-32_pkg/windows-32_pkg.tar.gz [new file with mode: 0644]
windows-64_pkg/windows-64_pkg.tar.gz [new file with mode: 0644]

diff --git a/ABOUT-NLS b/ABOUT-NLS
new file mode 100644 (file)
index 0000000..b1de1b6
--- /dev/null
+++ b/ABOUT-NLS
@@ -0,0 +1,1282 @@
+1 Notes on the Free Translation Project
+***************************************
+
+Free software is going international!  The Free Translation Project is
+a way to get maintainers of free software, translators, and users all
+together, so that free software will gradually become able to speak many
+languages.  A few packages already provide translations for their
+messages.
+
+   If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site.  But you do _not_
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+   Installers will find here some useful hints.  These notes also
+explain how users should proceed for getting the programs to use the
+available translations.  They tell how people wanting to contribute and
+work on translations can contact the appropriate team.
+
+1.1 INSTALL Matters
+===================
+
+Some packages are "localizable" when properly installed; the programs
+they contain can be made to speak your own native language.  Most such
+packages use GNU `gettext'.  Other packages have their own ways to
+internationalization, predating GNU `gettext'.
+
+   By default, this package will be installed to allow translation of
+messages.  It will automatically detect whether the system already
+provides the GNU `gettext' functions.  Installers may use special
+options at configuration time for changing the default behaviour.  The
+command:
+
+     ./configure --disable-nls
+
+will _totally_ disable translation of messages.
+
+   When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl' library
+and will decide to use it.  If not, you may have to to use the
+`--with-libintl-prefix' option to tell `configure' where to look for it.
+
+   Internationalized packages usually have many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language.  Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package.  However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+1.2 Using This Package
+======================
+
+As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+`LL_CC' combination.  If you happen to have the `LC_ALL' or some other
+`LC_xxx' environment variables set, you should unset them before
+setting `LANG', otherwise the setting of `LANG' will not have the
+desired effect.  Here `LL' is an ISO 639 two-letter language code, and
+`CC' is an ISO 3166 two-letter country code.  For example, let's
+suppose that you speak German and live in Germany.  At the shell
+prompt, merely execute `setenv LANG de_DE' (in `csh'),
+`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+This can be done from your `.login' or `.profile' file, once and for
+all.
+
+   You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries.  For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil.  The
+country code serves to distinguish the dialects.
+
+   The locale naming convention of `LL_CC', with `LL' denoting the
+language and `CC' denoting the country, is the one use on systems based
+on GNU libc.  On other systems, some variations of this scheme are
+used, such as `LL' or `LL_CC.ENCODING'.  You can get the list of
+locales supported by your system for your language by running the
+command `locale -a | grep '^LL''.
+
+   Not all programs have translations for all languages.  By default, an
+English message is shown in place of a nonexistent translation.  If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'.  GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+for the purpose of message handling, but you still need to have `LANG'
+set to the primary language; this is required by other parts of the
+system libraries.  For example, some Swedish users who would rather
+read translations in German than English for when Swedish is not
+available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+
+   Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from `no' to `nb' recently (in 2003).  During the
+transition period, while some message catalogs for this language are
+installed under `nb' and some older ones under `no', it's recommended
+for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
+older translations are used.
+
+   In the `LANGUAGE' environment variable, but not in the `LANG'
+environment variable, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect.  For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+1.3 Translating Teams
+=====================
+
+For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list.  The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+`http://translationproject.org/', in the "Teams" area.
+
+   If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+`-request' appended.  For example, speakers of Swedish can send a
+message to `sv-request@li.org', having this message body:
+
+     subscribe
+
+   Keep in mind that team members are expected to participate
+_actively_ in translations, or at solving translational difficulties,
+rather than merely lurking around.  If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `coordinator@translationproject.org' to
+reach the coordinator for all translator teams.
+
+   The English team is special.  It works at improving and uniformizing
+the terminology in use.  Proven linguistic skills are praised more than
+programming skills, here.
+
+1.4 Available Packages
+======================
+
+Languages are not equally supported in all packages.  The following
+matrix shows the current state of internationalization, as of June
+2010.  The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+     Ready PO files       af am an ar as ast az be be@latin bg bn_IN bs ca
+                        +--------------------------------------------------+
+     a2ps               |                       []                      [] |
+     aegis              |                                                  |
+     ant-phone          |                                                  |
+     anubis             |                                                  |
+     aspell             |                []                             [] |
+     bash               |                                                  |
+     bfd                |                                                  |
+     bibshelf           |                []                                |
+     binutils           |                                                  |
+     bison              |                                                  |
+     bison-runtime      |                []                                |
+     bluez-pin          | []             []                                |
+     bombono-dvd        |                                                  |
+     buzztard           |                                                  |
+     cflow              |                                                  |
+     clisp              |                                                  |
+     coreutils          |                                   []          [] |
+     cpio               |                                                  |
+     cppi               |                                                  |
+     cpplib             |                                               [] |
+     cryptsetup         |                                                  |
+     dfarc              |                                                  |
+     dialog             |                             []                [] |
+     dico               |                                                  |
+     diffutils          |                                               [] |
+     dink               |                                                  |
+     doodle             |                                                  |
+     e2fsprogs          |                                               [] |
+     enscript           |                                               [] |
+     exif               |                                                  |
+     fetchmail          |                                               [] |
+     findutils          |                                   []             |
+     flex               |                                               [] |
+     freedink           |                                                  |
+     gas                |                                                  |
+     gawk               |                []                             [] |
+     gcal               |                                               [] |
+     gcc                |                                                  |
+     gettext-examples   | []             []                 []          [] |
+     gettext-runtime    |                                   []          [] |
+     gettext-tools      |                                   []          [] |
+     gip                |                                   []             |
+     gjay               |                                                  |
+     gliv               |                                   []             |
+     glunarclock        |                []                 []             |
+     gnubiff            |                                                  |
+     gnucash            |                                               [] |
+     gnuedu             |                                                  |
+     gnulib             |                                                  |
+     gnunet             |                                                  |
+     gnunet-gtk         |                                                  |
+     gnutls             |                                                  |
+     gold               |                                                  |
+     gpe-aerial         |                                                  |
+     gpe-beam           |                                                  |
+     gpe-bluetooth      |                                                  |
+     gpe-calendar       |                                                  |
+     gpe-clock          |                []                                |
+     gpe-conf           |                                                  |
+     gpe-contacts       |                                                  |
+     gpe-edit           |                                                  |
+     gpe-filemanager    |                                                  |
+     gpe-go             |                                                  |
+     gpe-login          |                                                  |
+     gpe-ownerinfo      |                []                                |
+     gpe-package        |                                                  |
+     gpe-sketchbook     |                                                  |
+     gpe-su             |                []                                |
+     gpe-taskmanager    |                []                                |
+     gpe-timesheet      |                []                                |
+     gpe-today          |                []                                |
+     gpe-todo           |                                                  |
+     gphoto2            |                                                  |
+     gprof              |                                   []             |
+     gpsdrive           |                                                  |
+     gramadoir          |                                                  |
+     grep               |                                                  |
+     grub               |                []                             [] |
+     gsasl              |                                                  |
+     gss                |                                                  |
+     gst-plugins-bad    |                                   []             |
+     gst-plugins-base   |                                   []             |
+     gst-plugins-good   |                                   []             |
+     gst-plugins-ugly   |                                   []             |
+     gstreamer          | []                                []          [] |
+     gtick              |                                                  |
+     gtkam              |                       []                         |
+     gtkorphan          |                                   []             |
+     gtkspell           | []             []     []                         |
+     gutenprint         |                                                  |
+     hello              |                                   []             |
+     help2man           |                                                  |
+     hylafax            |                                                  |
+     idutils            |                                                  |
+     indent             |                                   []          [] |
+     iso_15924          |                                                  |
+     iso_3166           | []          []        []          []  []   [] [] |
+     iso_3166_2         |                                                  |
+     iso_4217           |                                                  |
+     iso_639            |             [] []     []              []         |
+     iso_639_3          |                                                  |
+     jwhois             |                                                  |
+     kbd                |                                                  |
+     keytouch           |                                               [] |
+     keytouch-editor    |                                                  |
+     keytouch-keyboa... |                                               [] |
+     klavaro            |          []                                      |
+     latrine            |                                                  |
+     ld                 |                                   []             |
+     leafpad            |                                   []          [] |
+     libc               |                                   []          [] |
+     libexif            |                       ()                         |
+     libextractor       |                                                  |
+     libgnutls          |                                                  |
+     libgpewidget       |                                                  |
+     libgpg-error       |                                                  |
+     libgphoto2         |                                                  |
+     libgphoto2_port    |                                                  |
+     libgsasl           |                                                  |
+     libiconv           |                                   []             |
+     libidn             |                                                  |
+     lifelines          |                                                  |
+     liferea            |                             []                [] |
+     lilypond           |                                                  |
+     linkdr             |          []                                      |
+     lordsawar          |                                                  |
+     lprng              |                                                  |
+     lynx               |                                               [] |
+     m4                 |                                                  |
+     mailfromd          |                                                  |
+     mailutils          |                                                  |
+     make               |                                                  |
+     man-db             |                                                  |
+     man-db-manpages    |                                                  |
+     minicom            |                                                  |
+     mkisofs            |                                                  |
+     myserver           |                                                  |
+     nano               |                                   []          [] |
+     opcodes            |                                                  |
+     parted             |                                                  |
+     pies               |                                                  |
+     popt               |                                                  |
+     psmisc             |                                                  |
+     pspp               |                                               [] |
+     pwdutils           |                                                  |
+     radius             |                                               [] |
+     recode             |                       []                      [] |
+     rosegarden         |                                                  |
+     rpm                |                                                  |
+     rush               |                                                  |
+     sarg               |                                                  |
+     screem             |                                                  |
+     scrollkeeper       |                    [] []                      [] |
+     sed                |                []                             [] |
+     sharutils          |                                   []          [] |
+     shishi             |                                                  |
+     skencil            |                                                  |
+     solfege            |                                                  |
+     solfege-manual     |                                                  |
+     soundtracker       |                                                  |
+     sp                 |                                                  |
+     sysstat            |                                                  |
+     tar                |                                   []             |
+     texinfo            |                                                  |
+     tin                |                                                  |
+     unicode-han-tra... |                                                  |
+     unicode-transla... |                                                  |
+     util-linux-ng      |                                               [] |
+     vice               |                                                  |
+     vmm                |                                                  |
+     vorbis-tools       |                                                  |
+     wastesedge         |                                                  |
+     wdiff              |                                                  |
+     wget               |                       []                      [] |
+     wyslij-po          |                                                  |
+     xchat              |                []     []          []          [] |
+     xdg-user-dirs      | []    []    [] []     []    []    []  []      [] |
+     xkeyboard-config   |                                   []          [] |
+                        +--------------------------------------------------+
+                          af am an ar as ast az be be@latin bg bn_IN bs ca
+                           6  0  1  2  3 19   1 10     3    28   3    1 38
+
+                          crh cs da  de  el en en_GB en_ZA eo es et eu fa
+                        +-------------------------------------------------+
+     a2ps               |     [] []  []  []     []            [] []       |
+     aegis              |        []  []                       []          |
+     ant-phone          |        []  ()                                   |
+     anubis             |        []  []                                   |
+     aspell             |     [] []  []         []            []          |
+     bash               |     []                           [] []          |
+     bfd                |                                     []          |
+     bibshelf           |        []  []                       []          |
+     binutils           |                                     []          |
+     bison              |            []  []                               |
+     bison-runtime      |        []  []  []                      []       |
+     bluez-pin          |     [] []  []  []                [] []          |
+     bombono-dvd        |        []                                       |
+     buzztard           |     [] []  []                                   |
+     cflow              |        []  []                                   |
+     clisp              |        []  []     []                []          |
+     coreutils          |     [] []  []                          []       |
+     cpio               |                                                 |
+     cppi               |                                                 |
+     cpplib             |        []  []                       []          |
+     cryptsetup         |            []                                   |
+     dfarc              |        []  []                       []          |
+     dialog             |        []  []                    [] []    []    |
+     dico               |                                                 |
+     diffutils          |     [] []  []  []                [] []          |
+     dink               |        []  []                       []          |
+     doodle             |            []                                   |
+     e2fsprogs          |     []     []                       []          |
+     enscript           |        []  []         []                        |
+     exif               |     () []  []                                   |
+     fetchmail          |     [] []  ()  []     []            []          |
+     findutils          |     [] []  []                                   |
+     flex               |            []                       []          |
+     freedink           |        []  []                       []          |
+     gas                |                                     []          |
+     gawk               |        []  []                       []          |
+     gcal               |                                     []          |
+     gcc                |            []                       []          |
+     gettext-examples   |            []  []                [] []          |
+     gettext-runtime    |        []  []                    [] []          |
+     gettext-tools      |            []                       []    []    |
+     gip                |        []  []                       []    []    |
+     gjay               |            []                                   |
+     gliv               |     [] []  []                                   |
+     glunarclock        |        []  []                                   |
+     gnubiff            |            ()                                   |
+     gnucash            |     []     ()  ()     ()            ()          |
+     gnuedu             |        []                           []          |
+     gnulib             |            []                       []          |
+     gnunet             |                                                 |
+     gnunet-gtk         |        []                                       |
+     gnutls             |     []     []                                   |
+     gold               |                                     []          |
+     gpe-aerial         |     [] []  []                       []          |
+     gpe-beam           |     [] []  []                       []          |
+     gpe-bluetooth      |        []  []                                   |
+     gpe-calendar       |        []                                       |
+     gpe-clock          |     [] []  []                       []          |
+     gpe-conf           |     [] []  []                                   |
+     gpe-contacts       |        []  []                       []          |
+     gpe-edit           |        []  []                                   |
+     gpe-filemanager    |        []  []                       []          |
+     gpe-go             |     [] []  []                       []          |
+     gpe-login          |        []  []                                   |
+     gpe-ownerinfo      |     [] []  []                       []          |
+     gpe-package        |        []  []                       []          |
+     gpe-sketchbook     |     [] []  []                       []          |
+     gpe-su             |     [] []  []                       []          |
+     gpe-taskmanager    |     [] []  []                       []          |
+     gpe-timesheet      |     [] []  []                       []          |
+     gpe-today          |     [] []  []                       []          |
+     gpe-todo           |        []  []                       []          |
+     gphoto2            |     [] []  ()         []            []    []    |
+     gprof              |        []  []                       []          |
+     gpsdrive           |        []                           [] []       |
+     gramadoir          |        []  []                    []             |
+     grep               |     []                                          |
+     grub               |        []  []                                   |
+     gsasl              |            []                                   |
+     gss                |                                                 |
+     gst-plugins-bad    |     [] []  []                       []    []    |
+     gst-plugins-base   |     [] []  []                       []    []    |
+     gst-plugins-good   |     [] []  []  []                   []    []    |
+     gst-plugins-ugly   |     [] []  []  []                   []    []    |
+     gstreamer          |     [] []  []                       []    []    |
+     gtick              |        []  ()                    []             |
+     gtkam              |     [] []  ()                    [] []          |
+     gtkorphan          |     [] []  []                    []             |
+     gtkspell           |     [] []  []  []                [] []    []    |
+     gutenprint         |        []  []         []                        |
+     hello              |        []  []                    [] []          |
+     help2man           |            []                                   |
+     hylafax            |            []                       []          |
+     idutils            |        []  []                                   |
+     indent             |     [] []  []                    [] [] [] []    |
+     iso_15924          |        []      ()                [] []          |
+     iso_3166           | []  [] []  []  ()                [] [] [] ()    |
+     iso_3166_2         |                ()                               |
+     iso_4217           |     [] []  []  ()                   [] []       |
+     iso_639            | []  [] []  []  ()                [] []          |
+     iso_639_3          | []                                              |
+     jwhois             |                                     []          |
+     kbd                |     [] []  []  []                   []          |
+     keytouch           |        []  []                                   |
+     keytouch-editor    |        []  []                                   |
+     keytouch-keyboa... |        []                                       |
+     klavaro            |     [] []  []                    []             |
+     latrine            |        []  ()                                   |
+     ld                 |        []                           []          |
+     leafpad            |     [] []  []  []                   []    []    |
+     libc               |     [] []  []                       []          |
+     libexif            |        []  []         ()                        |
+     libextractor       |                                                 |
+     libgnutls          |     []                                          |
+     libgpewidget       |        []  []                                   |
+     libgpg-error       |     []     []                                   |
+     libgphoto2         |        []  ()                                   |
+     libgphoto2_port    |        []  ()                             []    |
+     libgsasl           |                                                 |
+     libiconv           |     [] []  []                    []    []       |
+     libidn             |     []     []                    []             |
+     lifelines          |        []  ()                                   |
+     liferea            |     []     []  []                   []    []    |
+     lilypond           |     []     []                       []          |
+     linkdr             |        []  []                       []          |
+     lordsawar          |        []                                       |
+     lprng              |                                                 |
+     lynx               |     [] []  []                          []       |
+     m4                 |     [] []  []  []                               |
+     mailfromd          |                                                 |
+     mailutils          |                                     []          |
+     make               |        []  []                       []          |
+     man-db             |                                                 |
+     man-db-manpages    |                                                 |
+     minicom            |     [] []  []                       []          |
+     mkisofs            |                                                 |
+     myserver           |                                                 |
+     nano               |            []                       []    []    |
+     opcodes            |            []                       []          |
+     parted             |     []     []                                   |
+     pies               |                                                 |
+     popt               |     [] []  []                    [] []          |
+     psmisc             |     []     []                             []    |
+     pspp               |                                     []          |
+     pwdutils           |        []                                       |
+     radius             |                                     []          |
+     recode             |     [] []  []  []                [] []          |
+     rosegarden         |     ()     ()                       ()          |
+     rpm                |        []  []                       []          |
+     rush               |                                                 |
+     sarg               |                                                 |
+     screem             |                                                 |
+     scrollkeeper       |     [] []  []         []            []          |
+     sed                |     []     []  []                [] [] []       |
+     sharutils          |        []  []                       [] []       |
+     shishi             |                                                 |
+     skencil            |        []  ()                       []          |
+     solfege            |            []                    []    []       |
+     solfege-manual     |                                  []    []       |
+     soundtracker       |        []  []                       []          |
+     sp                 |            []                                   |
+     sysstat            |        []  []                             []    |
+     tar                |     []     []                          [] []    |
+     texinfo            |            []                    [] []          |
+     tin                |            []                          []       |
+     unicode-han-tra... |                                                 |
+     unicode-transla... |                                                 |
+     util-linux-ng      |     [] []  []                       []          |
+     vice               |        ()  ()                                   |
+     vmm                |            []                                   |
+     vorbis-tools       |     []                           []             |
+     wastesedge         |        []                                       |
+     wdiff              |            []                       []          |
+     wget               |     []     []                          []       |
+     wyslij-po          |                                                 |
+     xchat              |     []     []  []                   [] []       |
+     xdg-user-dirs      | []  [] []  []  []                [] [] [] []    |
+     xkeyboard-config   | []  [] []  []                    [] []          |
+                        +-------------------------------------------------+
+                          crh cs da  de  el en en_GB en_ZA eo es et eu fa
+                           5  64 105 117 18  1   8     0   28 89 18 19  0
+
+                          fi  fr  ga gl gu he hi hr hu hy id  is it ja ka kn
+                        +----------------------------------------------------+
+     a2ps               | []  []                          []        []       |
+     aegis              |     []                                 []          |
+     ant-phone          |     []                                 []          |
+     anubis             | []  []                          []     []          |
+     aspell             |     []  []                      []     []          |
+     bash               | []  []                          []        []       |
+     bfd                | []  []                          []                 |
+     bibshelf           | []  []  []                      []     []          |
+     binutils           | []  []                          []                 |
+     bison              | []  []  []                      []                 |
+     bison-runtime      | []  []  []                      []     [] []       |
+     bluez-pin          | []  []  []                [] [] []  []    []       |
+     bombono-dvd        | []                                                 |
+     buzztard           |                                 []                 |
+     cflow              | []      []                      []                 |
+     clisp              |     []                                             |
+     coreutils          |     []  []                []    []     []          |
+     cpio               | []  []  []                      []                 |
+     cppi               | []  []                                             |
+     cpplib             | []  []                          []                 |
+     cryptsetup         |     []                          []     []          |
+     dfarc              | []  []                                 []          |
+     dialog             |     []  [] []                   []  [] [] []       |
+     dico               |                                                    |
+     diffutils          | []  []  [] []    []       []    []     [] []       |
+     dink               |     []                                             |
+     doodle             |         []                             []          |
+     e2fsprogs          |     []                          []                 |
+     enscript           |     []  []             []       []                 |
+     exif               | []  []                          []  [] [] []       |
+     fetchmail          |     []                          []     [] []       |
+     findutils          | []  []  []                []    []     []          |
+     flex               | []  []  []                                         |
+     freedink           | []  []                          []                 |
+     gas                |     []                          []                 |
+     gawk               |     []  []       []             []     () []       |
+     gcal               |     []                                             |
+     gcc                |                                 []                 |
+     gettext-examples   | []  []  []                []    []     [] []       |
+     gettext-runtime    | []  []  []                      []     [] []       |
+     gettext-tools      |     []                          []     [] []       |
+     gip                | []  []  [] []                   []        []       |
+     gjay               | []                                                 |
+     gliv               | []  ()                                             |
+     glunarclock        | []      []                []    []                 |
+     gnubiff            |     ()                          []     ()          |
+     gnucash            | ()  ()           ()       ()           () []       |
+     gnuedu             |     []                                 []          |
+     gnulib             | []  []  []                []           [] []       |
+     gnunet             |                                                    |
+     gnunet-gtk         |     []                                             |
+     gnutls             |     []                                 []          |
+     gold               | []                              []                 |
+     gpe-aerial         | []  []                          []                 |
+     gpe-beam           | []  []                          []        []       |
+     gpe-bluetooth      | []                              []     [] []       |
+     gpe-calendar       | []                                        []       |
+     gpe-clock          | []  []                    []    []        []       |
+     gpe-conf           | []  []                          []        []       |
+     gpe-contacts       | []  []                          []        []       |
+     gpe-edit           | []                              []        []       |
+     gpe-filemanager    | []                        []    []        []       |
+     gpe-go             | []  []                    []    []        []       |
+     gpe-login          | []                              []        []       |
+     gpe-ownerinfo      | []  []                    []    []        []       |
+     gpe-package        | []                              []        []       |
+     gpe-sketchbook     | []  []                          []        []       |
+     gpe-su             | []  []     []             []    []        []       |
+     gpe-taskmanager    | []  []                    []    []        []       |
+     gpe-timesheet      | []  []  []                      []        []       |
+     gpe-today          | []  []  [] []             []    []        []       |
+     gpe-todo           | []                              []        []       |
+     gphoto2            | []  []                    []    []     [] []       |
+     gprof              | []  []  []                      []                 |
+     gpsdrive           |            []                   []     []          |
+     gramadoir          |     []  []                      []                 |
+     grep               | []                                     []          |
+     grub               | []                        []    []     []          |
+     gsasl              | []  []  []                      []     []          |
+     gss                | []  []  []                      []     []          |
+     gst-plugins-bad    | []  []                    []    []     [] []       |
+     gst-plugins-base   | []  []                    []    []     [] []       |
+     gst-plugins-good   | []  []                    []    []     [] []       |
+     gst-plugins-ugly   | []  []                    []    []     [] []       |
+     gstreamer          | []  []                    []    []     []          |
+     gtick              | []  []  []                      []     []          |
+     gtkam              |     []                    []    []     [] []       |
+     gtkorphan          |     []                          []     []          |
+     gtkspell           | []  []  [] []             [] [] []     [] []       |
+     gutenprint         | []  []                    []           []          |
+     hello              | []      []                      []                 |
+     help2man           | []  []                                             |
+     hylafax            |                                 []                 |
+     idutils            | []  []  []                []    []     []          |
+     indent             | []  []  [] []             []    []     [] []       |
+     iso_15924          | []  ()                          []     []          |
+     iso_3166           | []  ()  [] [] [] [] [] [] []    []     [] []       |
+     iso_3166_2         |     ()                    []    []     []          |
+     iso_4217           | []  ()                    []    []     [] []       |
+     iso_639            | []  ()  []    []          []    []     [] []    [] |
+     iso_639_3          |     ()                                 []       [] |
+     jwhois             | []  []                    []    []     []          |
+     kbd                |     []                          []                 |
+     keytouch           | []  []  []                []    []     []          |
+     keytouch-editor    | []      []                []    []     []          |
+     keytouch-keyboa... | []      []                []    []     []          |
+     klavaro            |            []             []                       |
+     latrine            | []                              []     []          |
+     ld                 | []  []  []                      []                 |
+     leafpad            | []  []  []       []       []    []     [] ()       |
+     libc               | []  []     []                   []        []       |
+     libexif            |                                        []          |
+     libextractor       |                                                    |
+     libgnutls          |     []                                 []          |
+     libgpewidget       | []      []                      []        []       |
+     libgpg-error       |     []                                 []          |
+     libgphoto2         |     []                                 [] []       |
+     libgphoto2_port    |     []                                 [] []       |
+     libgsasl           | []  []  []                      []     []          |
+     libiconv           | []  []  []                      []     [] []       |
+     libidn             | []  []                          []     []          |
+     lifelines          |     ()                                             |
+     liferea            |     []                    []           [] []       |
+     lilypond           | []  []                                             |
+     linkdr             | []               []    [] []           []          |
+     lordsawar          |                                                    |
+     lprng              |                                 []                 |
+     lynx               |     []                    []    []     [] []       |
+     m4                 | []  []  [] []                   []        []       |
+     mailfromd          |                                                    |
+     mailutils          |     []                          []                 |
+     make               | []  []  [] []    []    []       []     [] []       |
+     man-db             |                                 []     []          |
+     man-db-manpages    |                                 []                 |
+     minicom            | []  []                    []    []        []       |
+     mkisofs            | []  []                          []     []          |
+     myserver           |                                                    |
+     nano               | []  []  [] []             []           []          |
+     opcodes            | []  []  []                      []                 |
+     parted             |     []                          []     [] []       |
+     pies               |                                                    |
+     popt               | []  []  [] []             []    []  [] [] []       |
+     psmisc             | []  []                          []                 |
+     pspp               |                                                    |
+     pwdutils           |     []                          []                 |
+     radius             |     []                          []                 |
+     recode             | []  []  [] []    []       []    []     []          |
+     rosegarden         | ()  ()                          ()     () ()       |
+     rpm                |                                 []        []       |
+     rush               |                                                    |
+     sarg               |     []                                             |
+     screem             |                                        [] []       |
+     scrollkeeper       | []                        []    []     []          |
+     sed                | []  []  [] []             []    []     [] []       |
+     sharutils          | []  []  []                []    []     [] []       |
+     shishi             |     []                                             |
+     skencil            |     []                                             |
+     solfege            | []  []     []                          []          |
+     solfege-manual     |     []     []                                      |
+     soundtracker       |     []                                 []          |
+     sp                 |     []                                    ()       |
+     sysstat            | []  []                          []     [] []       |
+     tar                | []  []  []                []    []     [] []       |
+     texinfo            |     []                          []     [] []       |
+     tin                |     []                                             |
+     unicode-han-tra... |                                                    |
+     unicode-transla... |     []  []                                         |
+     util-linux-ng      | []  []                    []    []     [] []       |
+     vice               |     ()                    ()           ()          |
+     vmm                |     []                                             |
+     vorbis-tools       |                                 []                 |
+     wastesedge         |     ()                                 ()          |
+     wdiff              | []                                                 |
+     wget               | []  []  []             [] []    []     [] []       |
+     wyslij-po          | []  []                          []                 |
+     xchat              | []  []        []    []    []    []     [] []    [] |
+     xdg-user-dirs      | []  []  [] [] [] [] []    []    []  [] [] []    [] |
+     xkeyboard-config   | []  []                    []    []     []          |
+                        +----------------------------------------------------+
+                          fi  fr  ga gl gu he hi hr hu hy id  is it ja ka kn
+                          105 121 53 20  4  8  3  5 53  2 120  5 84 67  0  4
+
+                          ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne
+                        +-----------------------------------------------+
+     a2ps               |                               []              |
+     aegis              |                                               |
+     ant-phone          |                                               |
+     anubis             |                               []    []        |
+     aspell             |                         []                    |
+     bash               |                                               |
+     bfd                |                                               |
+     bibshelf           |                []             []              |
+     binutils           |                                               |
+     bison              |                               []              |
+     bison-runtime      |       []    [] []             []    []        |
+     bluez-pin          |    [] []    [] []             []              |
+     bombono-dvd        |                                               |
+     buzztard           |                                               |
+     cflow              |                                               |
+     clisp              |                                               |
+     coreutils          |          []                                   |
+     cpio               |                                               |
+     cppi               |                                               |
+     cpplib             |                                               |
+     cryptsetup         |                                               |
+     dfarc              |                   []                          |
+     dialog             |    []       [] []             []    []        |
+     dico               |                                               |
+     diffutils          |                []             []              |
+     dink               |                                               |
+     doodle             |                                               |
+     e2fsprogs          |                                               |
+     enscript           |                                               |
+     exif               |                []                             |
+     fetchmail          |                                               |
+     findutils          |                                               |
+     flex               |                                               |
+     freedink           |                                     []        |
+     gas                |                                               |
+     gawk               |                                               |
+     gcal               |                                               |
+     gcc                |                                               |
+     gettext-examples   |       []       []             [] []           |
+     gettext-runtime    | []                                            |
+     gettext-tools      | []                                            |
+     gip                |                []             []              |
+     gjay               |                                               |
+     gliv               |                                               |
+     glunarclock        |                []                             |
+     gnubiff            |                                               |
+     gnucash            | ()          ()                      ()     () |
+     gnuedu             |                                               |
+     gnulib             |                                               |
+     gnunet             |                                               |
+     gnunet-gtk         |                                               |
+     gnutls             |                               []              |
+     gold               |                                               |
+     gpe-aerial         |                []                             |
+     gpe-beam           |                []                             |
+     gpe-bluetooth      |                []                []           |
+     gpe-calendar       |                []                             |
+     gpe-clock          | []    []       []             [] []           |
+     gpe-conf           | []             []                             |
+     gpe-contacts       | []             []                             |
+     gpe-edit           |                []                             |
+     gpe-filemanager    | []             []                             |
+     gpe-go             | []             []                []           |
+     gpe-login          |                []                             |
+     gpe-ownerinfo      |                []             []              |
+     gpe-package        | []             []                             |
+     gpe-sketchbook     | []             []                             |
+     gpe-su             | []    []       []             [] [] []        |
+     gpe-taskmanager    | [] [] []       []             [] []           |
+     gpe-timesheet      |                []             []              |
+     gpe-today          |       []       []             [] []           |
+     gpe-todo           |                []                   []        |
+     gphoto2            |                                               |
+     gprof              |                               []              |
+     gpsdrive           |                                               |
+     gramadoir          |                                               |
+     grep               |                                               |
+     grub               |                                               |
+     gsasl              |                                               |
+     gss                |                                               |
+     gst-plugins-bad    |             [] []                [] []        |
+     gst-plugins-base   |             [] []                             |
+     gst-plugins-good   |                []                []           |
+     gst-plugins-ugly   |             [] []             [] [] []        |
+     gstreamer          |                                               |
+     gtick              |                                               |
+     gtkam              |                                     []        |
+     gtkorphan          |                []                      []     |
+     gtkspell           |       []    [] []       []    []    [] []     |
+     gutenprint         |                                               |
+     hello              | []             []             []              |
+     help2man           |                                               |
+     hylafax            |                                               |
+     idutils            |                                               |
+     indent             |                                               |
+     iso_15924          |             [] []                             |
+     iso_3166           | [] []       () [] [] []    []       []        |
+     iso_3166_2         |                                               |
+     iso_4217           |             []                      []        |
+     iso_639            |                      []    []                 |
+     iso_639_3          |                            []                 |
+     jwhois             |                []                             |
+     kbd                |                                               |
+     keytouch           |                []                             |
+     keytouch-editor    |                []                             |
+     keytouch-keyboa... |                []                             |
+     klavaro            |                                     []        |
+     latrine            |                []                             |
+     ld                 |                                               |
+     leafpad            | []          [] []                             |
+     libc               | []                                            |
+     libexif            |                                               |
+     libextractor       |                                               |
+     libgnutls          |                               []              |
+     libgpewidget       |                []             []              |
+     libgpg-error       |                                               |
+     libgphoto2         |                                               |
+     libgphoto2_port    |                                               |
+     libgsasl           |                                               |
+     libiconv           |                                               |
+     libidn             |                                               |
+     lifelines          |                                               |
+     liferea            |                                               |
+     lilypond           |                                               |
+     linkdr             |                                               |
+     lordsawar          |                                               |
+     lprng              |                                               |
+     lynx               |                                               |
+     m4                 |                                               |
+     mailfromd          |                                               |
+     mailutils          |                                               |
+     make               | []                                            |
+     man-db             |                                               |
+     man-db-manpages    |                                               |
+     minicom            |                                     []        |
+     mkisofs            |                                               |
+     myserver           |                                               |
+     nano               |                               []    []        |
+     opcodes            |                                               |
+     parted             |                                               |
+     pies               |                                               |
+     popt               | []             []                   []        |
+     psmisc             |                                               |
+     pspp               |                                               |
+     pwdutils           |                                               |
+     radius             |                                               |
+     recode             |                                               |
+     rosegarden         |                                               |
+     rpm                |                                               |
+     rush               |                                               |
+     sarg               |                                               |
+     screem             |                                               |
+     scrollkeeper       |                                     []     [] |
+     sed                |                                               |
+     sharutils          |                                               |
+     shishi             |                                               |
+     skencil            |                                               |
+     solfege            |                                     []        |
+     solfege-manual     |                                               |
+     soundtracker       |                                               |
+     sp                 |                                               |
+     sysstat            |                []                             |
+     tar                |       []                                      |
+     texinfo            |                                     []        |
+     tin                |                                               |
+     unicode-han-tra... |                                               |
+     unicode-transla... |                                               |
+     util-linux-ng      |                                               |
+     vice               |                                               |
+     vmm                |                                               |
+     vorbis-tools       |                                               |
+     wastesedge         |                                               |
+     wdiff              |                                               |
+     wget               |             []                                |
+     wyslij-po          |                                               |
+     xchat              | []             [] []                          |
+     xdg-user-dirs      | [] []       [] [] []       []       [] []     |
+     xkeyboard-config   | []    []    []                                |
+                        +-----------------------------------------------+
+                          ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne
+                          20  5 10  1 13 48  4  2  2  4 24 10 20  3   1
+
+                          nl  nn or pa pl  ps pt pt_BR ro ru rw sk sl sq sr
+                        +---------------------------------------------------+
+     a2ps               | []           []     []  []   [] []       []    [] |
+     aegis              | []                      []      []                |
+     ant-phone          |                         []   []                   |
+     anubis             | []           []                 []                |
+     aspell             | []                           [] []    [] []       |
+     bash               | []                                    []          |
+     bfd                |                                 []                |
+     bibshelf           | []  []                                            |
+     binutils           |                                 []    []          |
+     bison              | []           []                 []                |
+     bison-runtime      | []           []     []  []   [] []       []       |
+     bluez-pin          | []           []         []   [] []    [] []    [] |
+     bombono-dvd        |     []                          ()                |
+     buzztard           | []  []                                            |
+     cflow              |              []                                   |
+     clisp              | []                              []                |
+     coreutils          | []           []     []  []      []       []       |
+     cpio               | []           []                 []                |
+     cppi               |              []                                   |
+     cpplib             | []                                                |
+     cryptsetup         | []                                                |
+     dfarc              |              []                                   |
+     dialog             | []           []         []      []                |
+     dico               |              []                                   |
+     diffutils          | []           []         []   [] []             [] |
+     dink               | ()                                                |
+     doodle             | []                                          []    |
+     e2fsprogs          | []           []                                   |
+     enscript           | []                      []   [] []       []       |
+     exif               | []           []              [] ()    []          |
+     fetchmail          | []           []                 []          []    |
+     findutils          | []           []     []          []       []       |
+     flex               | []           []         []   [] []                |
+     freedink           | []           []                                   |
+     gas                |                                                   |
+     gawk               | []           []         []   []                   |
+     gcal               |                                                   |
+     gcc                |                                                [] |
+     gettext-examples   | []           []     []       [] []    [] []    [] |
+     gettext-runtime    | []  []       []     []       [] []    [] []    [] |
+     gettext-tools      |              []              [] []    [] []    [] |
+     gip                | []           []                 []    []       [] |
+     gjay               |                                                   |
+     gliv               | []           []         []   [] []    []          |
+     glunarclock        | []                      []   []       []       [] |
+     gnubiff            | []                           ()                   |
+     gnucash            | []           ()         ()      ()                |
+     gnuedu             | []                                                |
+     gnulib             | []           []                 []       []       |
+     gnunet             |                                                   |
+     gnunet-gtk         |                                                   |
+     gnutls             | []           []                                   |
+     gold               |                                                   |
+     gpe-aerial         | []                  []  []   [] []       []    [] |
+     gpe-beam           | []                  []  []   [] []       []    [] |
+     gpe-bluetooth      | []                      []                        |
+     gpe-calendar       |                         []      []       []    [] |
+     gpe-clock          | []                  []  []   [] []    [] []    [] |
+     gpe-conf           | []                  []  []   [] []    [] []       |
+     gpe-contacts       |                         []   [] []       []    [] |
+     gpe-edit           | []           []                          []       |
+     gpe-filemanager    | []                              []       []       |
+     gpe-go             | []           []         []   [] []    [] []    [] |
+     gpe-login          | []                      []                        |
+     gpe-ownerinfo      | []                  []  []   [] []    [] []    [] |
+     gpe-package        | []                                       []       |
+     gpe-sketchbook     | []                  []  []   [] []       []    [] |
+     gpe-su             | []                  []  []   [] []    [] []    [] |
+     gpe-taskmanager    | []                  []  []   [] []    [] []    [] |
+     gpe-timesheet      | []                  []  []   [] []    [] []    [] |
+     gpe-today          | []                  []  []   [] []    [] []    [] |
+     gpe-todo           | []                      []      []       []    [] |
+     gphoto2            | []        [] []         []   [] []    []       [] |
+     gprof              | []                      []   []                   |
+     gpsdrive           | []                              []                |
+     gramadoir          | []                                    []          |
+     grep               | []           []                 []    []          |
+     grub               | []           []                 []                |
+     gsasl              | []           []                       []       [] |
+     gss                |              []              []       []          |
+     gst-plugins-bad    | []           []         []      []    []    []    |
+     gst-plugins-base   | []           []         []      []    []          |
+     gst-plugins-good   | []           []         []      []    []          |
+     gst-plugins-ugly   | []           []         []      []    [] []       |
+     gstreamer          | []           []         []      []    []          |
+     gtick              | []                              []    []          |
+     gtkam              | []        [] []         []      []    []          |
+     gtkorphan          | []                                                |
+     gtkspell           | []           []     []  []   [] []    [] [] [] [] |
+     gutenprint         | []                              []                |
+     hello              | []           []                       [] []       |
+     help2man           |              []                 []                |
+     hylafax            | []                                                |
+     idutils            | []           []         []   [] []                |
+     indent             | []           []         []   [] []    []       [] |
+     iso_15924          | []           []                 []       []       |
+     iso_3166           | []  [] [] [] []     ()  []   [] [] [] [] [] [] [] |
+     iso_3166_2         | []           []                          []       |
+     iso_4217           | []  []       []     []          [] []    []    [] |
+     iso_639            | []     [] [] []                 [] [] [] []    [] |
+     iso_639_3          |        [] []                                      |
+     jwhois             | []           []         []   []                   |
+     kbd                | []           []              []                   |
+     keytouch           | []           []                       []          |
+     keytouch-editor    | []           []                       []          |
+     keytouch-keyboa... | []           []                       []          |
+     klavaro            | []                      []                        |
+     latrine            |              []                 []                |
+     ld                 |                                                   |
+     leafpad            | []  []       []     []  []      []    [] []    [] |
+     libc               | []           []                 []    []          |
+     libexif            | []           []         ()            []          |
+     libextractor       |                                                   |
+     libgnutls          | []           []                                   |
+     libgpewidget       | []           []                          []       |
+     libgpg-error       |              []              []                   |
+     libgphoto2         | []           []                                   |
+     libgphoto2_port    | []           []         []      []    []          |
+     libgsasl           | []           []              []       []       [] |
+     libiconv           | []           []                       [] []    [] |
+     libidn             | []           []                                   |
+     lifelines          | []           []                                   |
+     liferea            | []           []     []  []   [] ()    ()    []    |
+     lilypond           | []                                                |
+     linkdr             | []                  []          []                |
+     lordsawar          |                                                   |
+     lprng              |              []                                   |
+     lynx               | []                      []      []                |
+     m4                 | []           []         []   [] []                |
+     mailfromd          |              []                                   |
+     mailutils          |              []                                   |
+     make               | []           []         []      []                |
+     man-db             | []           []                 []                |
+     man-db-manpages    | []           []                 []                |
+     minicom            |              []         []   [] []                |
+     mkisofs            | []           []                 []                |
+     myserver           |                                                   |
+     nano               | []           []         []      []                |
+     opcodes            | []                           []                   |
+     parted             | []           []                 []    []          |
+     pies               |              []                                   |
+     popt               | []           []     []          []                |
+     psmisc             | []           []                 []                |
+     pspp               | []                      []                        |
+     pwdutils           |              []                                   |
+     radius             | []           []                 []                |
+     recode             | []           []     []  []   [] []    [] []       |
+     rosegarden         |              ()                 ()                |
+     rpm                | []           []     []                            |
+     rush               | []           []                                   |
+     sarg               |                                                   |
+     screem             |                                                   |
+     scrollkeeper       | []  []       []              [] []    []    [] [] |
+     sed                | []           []     []  []   [] []    [] []    [] |
+     sharutils          | []           []                 []             [] |
+     shishi             |              []                                   |
+     skencil            |                     []  []                        |
+     solfege            | []           []         []      []                |
+     solfege-manual     | []           []         []                        |
+     soundtracker       |                                       []          |
+     sp                 |                                                   |
+     sysstat            | []           []         []      []                |
+     tar                | []           []                 []       []       |
+     texinfo            | []           []              [] []                |
+     tin                |                                 []                |
+     unicode-han-tra... |                                                   |
+     unicode-transla... |                                                   |
+     util-linux-ng      | []           []         []      []       []       |
+     vice               | []                                                |
+     vmm                | []                                                |
+     vorbis-tools       | []           []                                   |
+     wastesedge         | []                                                |
+     wdiff              | []           []                                   |
+     wget               | []           []     []  []      []    [] []       |
+     wyslij-po          | []  []       []                                   |
+     xchat              | []        [] []     []          []    [] [] [] [] |
+     xdg-user-dirs      | []  [] [] [] []  [] []  []   [] []    [] [] [] [] |
+     xkeyboard-config   | []           []                 []                |
+                        +---------------------------------------------------+
+                          nl  nn or pa pl  ps pt pt_BR ro ru rw sk sl sq sr
+                          135 10  4  7 105  1 29  62   47 91  3 54 46  9 37
+
+                          sv  sw ta te tg th tr uk vi  wa zh_CN zh_HK zh_TW
+                        +---------------------------------------------------+
+     a2ps               | []              [] [] [] []                       | 27
+     aegis              |                          []                       |  9
+     ant-phone          | []                 []    []      []               |  9
+     anubis             | []                 [] [] []                       | 15
+     aspell             |                       [] []  []                   | 20
+     bash               | []                    [] []                       | 12
+     bfd                |                          []                       |  6
+     bibshelf           | []                       []      []               | 16
+     binutils           |                       [] []                       |  8
+     bison              | []                       []                       | 12
+     bison-runtime      | []              []    [] []      []          []   | 29
+     bluez-pin          | []              [] [] [] []  []  []          []   | 37
+     bombono-dvd        |                          []                       |  4
+     buzztard           |                          []                       |  7
+     cflow              |                       [] []      []               |  9
+     clisp              |                                                   | 10
+     coreutils          | []                    [] []      []               | 22
+     cpio               | []                 [] [] []      []          []   | 13
+     cppi               |                       [] []                       |  5
+     cpplib             | []                 [] [] []      []          []   | 14
+     cryptsetup         | []                       []                       |  7
+     dfarc              |                          []                       |  9
+     dialog             | []  []          []       []  []  []          []   | 30
+     dico               |                       []                          |  2
+     diffutils          | []                 [] [] []      []          []   | 30
+     dink               |                                                   |  4
+     doodle             | []                       []                       |  7
+     e2fsprogs          | []                 []    []                       | 11
+     enscript           | []                 [] [] []                       | 17
+     exif               | []                       []      []               | 16
+     fetchmail          |                    []    []      []               | 17
+     findutils          | []                 [] [] []      []               | 20
+     flex               | []                 []    []                  []   | 15
+     freedink           |                          []                       | 10
+     gas                |                    []                             |  4
+     gawk               | []                 []    []      []               | 18
+     gcal               | []                 []                             |  5
+     gcc                | []                 []            []               |  7
+     gettext-examples   | []                 [] [] []      []    []    []   | 34
+     gettext-runtime    | []                 [] [] []      []    []    []   | 29
+     gettext-tools      | []                 [] [] []      []          []   | 22
+     gip                | []                       []      []          []   | 22
+     gjay               |                          []                       |  3
+     gliv               | []                 []    []                       | 14
+     glunarclock        | []                       []  []  []          []   | 19
+     gnubiff            | []                       []                       |  4
+     gnucash            |                    () [] ()      []          ()   | 10
+     gnuedu             |                          []                  []   |  7
+     gnulib             | []                    [] []      []               | 16
+     gnunet             |                          []                       |  1
+     gnunet-gtk         | []                 []    []                       |  5
+     gnutls             | []                       []      []               | 10
+     gold               |                          []                       |  4
+     gpe-aerial         | []                       []      []               | 18
+     gpe-beam           | []                       []      []               | 19
+     gpe-bluetooth      | []                       []      []               | 13
+     gpe-calendar       | []                       []  []  []               | 12
+     gpe-clock          | []                 []    []  []  []               | 28
+     gpe-conf           | []                       []  []  []               | 20
+     gpe-contacts       | []                       []      []               | 17
+     gpe-edit           | []                       []      []               | 12
+     gpe-filemanager    | []                       []  []  []               | 16
+     gpe-go             | []                 []    []  []  []               | 25
+     gpe-login          | []                       []      []               | 11
+     gpe-ownerinfo      | []                 []    []      []          []   | 25
+     gpe-package        | []                       []      []               | 13
+     gpe-sketchbook     | []                       []      []               | 20
+     gpe-su             | []                 []    []  []  []               | 30
+     gpe-taskmanager    | []                 []    []  []  []               | 29
+     gpe-timesheet      | []                 []    []      []          []   | 25
+     gpe-today          | []                 []    []  []  []          []   | 30
+     gpe-todo           | []                       []  []  []               | 17
+     gphoto2            | []                    [] []      []          []   | 24
+     gprof              | []                 []    []                       | 15
+     gpsdrive           | []                       []      []               | 11
+     gramadoir          | []                       []      []               | 11
+     grep               |                 []       []      []               | 10
+     grub               | []                       []      []               | 14
+     gsasl              | []                       []      []          []   | 14
+     gss                | []                       []      []               | 11
+     gst-plugins-bad    | []                 []    []      []               | 26
+     gst-plugins-base   | []                 [] [] []      []               | 24
+     gst-plugins-good   | []                 []    []      []               | 24
+     gst-plugins-ugly   | []                 [] [] []      []               | 29
+     gstreamer          | []                    [] []      []               | 22
+     gtick              |                       [] []      []               | 13
+     gtkam              | []                       []      []               | 20
+     gtkorphan          | []                       []      []               | 14
+     gtkspell           | []              [] [] [] []  []  []    []    []   | 45
+     gutenprint         | []                                                | 10
+     hello              | []              [] []    []      []          []   | 21
+     help2man           | []                       []                       |  7
+     hylafax            |                          []                       |  5
+     idutils            | []                 []    []      []               | 17
+     indent             | []                 [] [] []      []          []   | 30
+     iso_15924          |                 ()    [] ()      []          []   | 16
+     iso_3166           | []        []    () [] [] ()  []  []    []    ()   | 53
+     iso_3166_2         |                 ()    [] ()      []               |  9
+     iso_4217           | []              () [] [] ()      []    []         | 26
+     iso_639            | []     [] []    ()    [] ()  []  []    []    []   | 38
+     iso_639_3          |        []                ()                       |  8
+     jwhois             | []                 []    []      []          []   | 16
+     kbd                | []                 [] [] []      []               | 15
+     keytouch           | []                       []      []               | 16
+     keytouch-editor    | []                       []      []               | 14
+     keytouch-keyboa... | []                       []      []               | 14
+     klavaro            |                          []                       | 11
+     latrine            |                    []    []      []               | 10
+     ld                 | []                 []    []                  []   | 11
+     leafpad            | []                 [] [] []      []          []   | 33
+     libc               | []                 []    []      []          []   | 21
+     libexif            |                          []      ()               |  7
+     libextractor       |                          []                       |  1
+     libgnutls          | []                       []      []               |  9
+     libgpewidget       | []                       []      []               | 14
+     libgpg-error       | []                       []      []               |  9
+     libgphoto2         |                       [] []                       |  8
+     libgphoto2_port    | []                    [] []                  []   | 14
+     libgsasl           | []                       []      []               | 13
+     libiconv           | []                       []  []  []               | 21
+     libidn             | ()                       []      []               | 11
+     lifelines          | []                                                |  4
+     liferea            | []                 []            []               | 21
+     lilypond           |                          []                       |  7
+     linkdr             | []                 []    []      []          []   | 17
+     lordsawar          |                                                   |  1
+     lprng              |                          []                       |  3
+     lynx               | []                 [] [] []                       | 17
+     m4                 | []                       []      []          []   | 19
+     mailfromd          |                       [] []                       |  3
+     mailutils          |                          []                       |  5
+     make               | []                 []    []      []               | 21
+     man-db             | []                       []      []               |  8
+     man-db-manpages    |                                                   |  4
+     minicom            | []                       []                       | 16
+     mkisofs            |                          []      []               |  9
+     myserver           |                                                   |  0
+     nano               | []                       []      []          []   | 21
+     opcodes            | []                 []    []                       | 11
+     parted             | []                 [] [] []                  []   | 15
+     pies               |                       [] []                       |  3
+     popt               | []              [] []    []      []          []   | 27
+     psmisc             | []                       []                       | 11
+     pspp               |                                                   |  4
+     pwdutils           | []                       []                       |  6
+     radius             |                       [] []                       |  9
+     recode             | []                 []    []      []               | 28
+     rosegarden         | ()                                                |  0
+     rpm                | []                       []                  []   | 11
+     rush               |                       [] []                       |  4
+     sarg               |                                                   |  1
+     screem             |                          []                       |  3
+     scrollkeeper       | []                 [] [] []                  []   | 27
+     sed                | []                 []    []      []          []   | 30
+     sharutils          | []                 []    []      []          []   | 22
+     shishi             |                          []                       |  3
+     skencil            | []                       []                       |  7
+     solfege            | []                 []    []      []               | 16
+     solfege-manual     |                    []                             |  8
+     soundtracker       | []                 []    []                       |  9
+     sp                 |                    []                             |  3
+     sysstat            |                          []      []               | 15
+     tar                | []                 [] [] []      []          []   | 23
+     texinfo            | []                 [] [] []      []               | 17
+     tin                |                                                   |  4
+     unicode-han-tra... |                                                   |  0
+     unicode-transla... |                                                   |  2
+     util-linux-ng      | []                 [] [] []                       | 20
+     vice               | ()                 ()                             |  1
+     vmm                |                          []                       |  4
+     vorbis-tools       |                          []                       |  6
+     wastesedge         |                                                   |  2
+     wdiff              | []                       []                       |  7
+     wget               | []                 []    []      []          []   | 26
+     wyslij-po          |                       [] []                       |  8
+     xchat              | []              []    [] []      []          []   | 36
+     xdg-user-dirs      | []     [] []    [] [] [] []      []    []    []   | 63
+     xkeyboard-config   | []                    [] []                       | 22
+                        +---------------------------------------------------+
+       85 teams           sv  sw ta te tg th tr uk vi  wa zh_CN zh_HK zh_TW
+      178 domains         119  1  3  3  0 10 65 51 155 17  98     7    41    2618
+
+   Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect.  This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+   For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer.  There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+   If June 2010 seems to be old, you may fetch a more recent copy of
+this `ABOUT-NLS' file on most GNU archive sites.  The most up-to-date
+matrix with full percentage details can be found at
+`http://translationproject.org/extra/matrix.html'.
+
+1.5 Using `gettext' in new packages
+===================================
+
+If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package.  Of course you have to respect the GNU Library General Public
+License which covers the use of the GNU `gettext' library.  This means
+in particular that even non-free programs can use `libintl' as a shared
+library, whereas only free software can use `libintl' as a static
+library or use modified versions of `libintl'.
+
+   Once the sources are changed appropriately and the setup can handle
+the use of `gettext' the only thing missing are the translations.  The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project.  Therefore the information given above
+applies also for every other Free Software Project.  Contact
+`coordinator@translationproject.org' to make the `.pot' files available
+to the translation teams.
+
diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..eb4fcee
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,30 @@
+Hermet Park <hermet@hermet.pe.kr>
+Cedric Bail <cedric.bail@free.fr>
+Raoul Hecky <raoul.hecky@gmail.com>
+Daniel Juyung Seo <seojuyung2@gmail.com>
+Ryuan Choi <ryuan.choi@gmail.com>
+Jihoon Kim <jihoon48.kim@samsung.com>
+The Rasterman (Carsten Haitzler) <raster@rasterman.com>
+Kateryna Fesyna <k.fesyna@samsung.com>
+Jaehyun Cho <jae_hyun_cho@naver.com>
+Mykyta Biliavskyi <m.biliavskyi@samsung.com>
+Alex-P. Natsios <drakevr@linuxteam.teilar.gr>
+Kabeer Khan <kabeer.khan@samsung.com>
+Leonid Dyudnik <l.dydnik@samsung.com>
+Igor Murzov <garik@efl.so>
+Lee Gwang-O <maeryo@live.co.kr>
+Michelle Legrand <michelle.legrand@openwide.fr>
+Yunho Jung <yunho7.jung@samsung.com>
+Mincheol Seo <mcmin.seo@samsung.com>
+Michelle Legrand <legrand.michelle@outlook.com>
+Jerome Pinot <ngc891@gmail.com>
+Jean-Phillippe Andre <jp.andre@samsung.com>
+Vincent Torri <vincent.torri@gmail.com>
+Stephen Houston <smhouston88@gmail.com>
+Jee-Yong Um <jc9.um@samsung.com>
+Tae-Hyup Kim <taehyub.kim@samsung.com>
+Yurii Tsivun <y.tsivun@samsung.com>
+Yongheon Shin <yongheon.shin@samsung.com>
+Vyacheslav Reutskiy <v.reutskiy@samsung.com>
+Bowon Ryu <bowon.ryu@samsung.com>
+Jean Guyomarc'h <jean@guyomarch.bzh>
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..7991b15
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,25 @@
+Copyright notice for Enventor:
+
+Copyright (C) 2013-2016 Hermet Park and various contributors (see AUTHORS)
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+   2. Redistributions in binary form must reproduce the above copyright 
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..a1e89e1
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,370 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
+Inc.
+
+   Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.  This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+   Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.  Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below.  The lack of an optional feature in a given package is not
+necessarily a bug.  More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+   The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.
+
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package, generally using the just-built uninstalled binaries.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.  When installing into a prefix owned by root, it is
+     recommended that the package be configured and built as a regular
+     user, and only the `make install' phase executed with root
+     privileges.
+
+  5. Optionally, type `make installcheck' to repeat any self-tests, but
+     this time using the binaries in their final installed location.
+     This target does not install anything.  Running this target as a
+     regular user, particularly if the prior `make install' required
+     root privileges, verifies that the installation completed
+     correctly.
+
+  6. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  7. Often, you can also type `make uninstall' to remove the installed
+     files again.  In practice, not all packages have tested that
+     uninstallation works correctly, even though it is required by the
+     GNU Coding Standards.
+
+  8. Some packages, particularly those that use Automake, provide `make
+     distcheck', which can by used by developers to test that all other
+     targets like `make install' and `make uninstall' work correctly.
+     This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.  This
+is known as a "VPATH" build.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.  In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+   The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+   The first method involves providing an override variable for each
+affected directory.  For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'.  Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated.  The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the `DESTDIR' variable.  For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names.  The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters.  On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+   Some packages offer the ability to configure how verbose the
+execution of `make' will be.  For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   HP-UX `make' updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as `configure' are involved.  Use GNU `make'
+instead.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+   On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS
+     KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug.  Until the bug is fixed you can use this workaround:
+
+     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..4452bbb
--- /dev/null
@@ -0,0 +1,31 @@
+MAINTAINERCLEANFILES = \
+Makefile.in \
+aclocal.m4 \
+config.guess \
+config.h.in \
+config.sub \
+configure \
+install-sh \
+depcomp \
+libtool \
+missing
+
+filesdir = $(datadir)/$(PACKAGE)/docs
+files_DATA = README
+
+EXTRA_DIST = \
+README \
+AUTHORS \
+COPYING \
+autogen.sh
+
+SUBDIRS = src data . po
+
+ACLOCAL_AMFLAGS = -I m4
+
+pkgconfigdir = $(libdir)/pkgconfig
+
+pkgconfig_DATA = pc/enventor.pc
+
+update-po:
+       $(MAKE) $(AM_MAKEFLAGS) -C po update-po
diff --git a/Makefile_Eolian_Cxx_Helper.am b/Makefile_Eolian_Cxx_Helper.am
new file mode 100644 (file)
index 0000000..12ac58e
--- /dev/null
@@ -0,0 +1,19 @@
+
+if HAVE_EOLIAN_CXX
+EOLIAN_CXX = @eolian_cxx@
+_EOLIAN_CXX_DEP = @eolian_cxx@
+else
+EOLIAN_CXX = EFL_RUN_IN_TREE=1 $(top_builddir)/src/bin/eolian_cxx/eolian_cxx${EXEEXT}
+_EOLIAN_CXX_DEP = bin/eolian_cxx/eolian_cxx${EXEEXT}
+endif
+
+AM_V_EOLCXX = $(am__v_EOLCXX_@AM_V@)
+am__v_EOLCXX_ = $(am__v_EOLCXX_@AM_DEFAULT_V@)
+am__v_EOLCXX_0 = @echo "  EOLCXX  " $@;
+
+SUFFIXES += .eo.hh
+
+%.eo.hh: %.eo $(_EOLIAN_CXX_DEP)
+       $(AM_V_EOLCXX)$(EOLIAN_CXX) $(EOLIAN_FLAGS) -o $@ $<
+
+CLEANFILES += $(BUILT_SOURCES)
diff --git a/Makefile_Eolian_Helper.am b/Makefile_Eolian_Helper.am
new file mode 100644 (file)
index 0000000..168f659
--- /dev/null
@@ -0,0 +1,24 @@
+if HAVE_EOLIAN_GEN
+EOLIAN_GEN = @eolian_gen@
+_EOLIAN_GEN_DEP = @eolian_gen@
+else
+EOLIAN_GEN = EFL_RUN_IN_TREE=1 $(top_builddir)/src/bin/eolian/eolian_gen${EXEEXT}
+_EOLIAN_GEN_DEP = bin/eolian/eolian_gen${EXEEXT}
+endif
+
+AM_V_EOL = $(am__v_EOL_@AM_V@)
+am__v_EOL_ = $(am__v_EOL_@AM_DEFAULT_V@)
+am__v_EOL_0 = @echo "  EOLIAN  " $@;
+
+SUFFIXES = .eo .eo.c .eo.h .eo.legacy.h
+
+%.eo.c: %.eo ${_EOLIAN_GEN_DEP}
+       $(AM_V_EOL)$(EOLIAN_GEN) --eo --legacy $(EOLIAN_FLAGS) --gc -o $@ $<
+
+%.eo.h: %.eo ${_EOLIAN_GEN_DEP}
+       $(AM_V_EOL)$(EOLIAN_GEN) --eo $(EOLIAN_FLAGS) --gh -o $@ $<
+
+%.eo.legacy.h: %.eo ${_EOLIAN_GEN_DEP}
+       $(AM_V_EOL)$(EOLIAN_GEN) --legacy $(EOLIAN_FLAGS) --gh -o $@ $<
+
+CLEANFILES += $(BUILT_SOURCES)
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..2134982
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,337 @@
+==============
+Enventor 0.9.0
+==============
+
+Changes since Enventor 0.8.0:
+-----------------------------
+
+Additions:
+   * Mirror Mode: Newly introduced.
+   * File Browser: Newly introduced.
+   * Live Edit: Support Auto-Align feature.
+   * Live Edit: Support relative_to among the exist parts.
+   * Live Edit: Support Fixed Width & Height Interface.
+   * Live Edit: Add Edge Attaching Effect.
+   * Template: Add a Watchface code.
+
+Improvements:
+   * Live Edit: Improve part name for more formal naming rule.
+   * Live Edit: Support direction key for moving live edit object item per pixels.
+   * Live Edit: Do not highlight part during live edit mode.
+   * Template: Remove a duplicated image comment to look better.
+   * Syntax Color: Improve string syntax color logic.
+   * Console: Hide unnecessary error messages.
+   * RedoUndo: Enhance smart function to support auto indentation.
+   * RedoUndo: Enable smart analyze for a pushed region text.
+   * Setting: Redesign GUI.
+   * Setting: Set Error-Message-Red-Alert-Effect configurable.
+   * About: Redesign from About to Help.
+   * EDC Navigator: Provide a program launch/stop functions.
+   * EDC Navigator: Redesign its basic tree behavior.
+   * Enventor API: renamed from enventor_object_file_set() -> enventor_object_main_file_set()
+   * Tools: Support a template insert button.
+   * Don't overwrite existing EDC with new template code.
+   * EDC Editor: Turned off focus highlight effect.
+
+Fixes:
+   * Setting: Fix to activate edc navigator toggle correctly.
+   * Setting: Show current font correctly.
+   * EDC Navigator: Fix the editor cursor jumping issue.
+   * EDC Navigator: Compare name elaborately to search the part correctly.
+   * Statusbar: Fix view sizing issue when an invert button is clicked repeatedly.
+   * Indentation: Check '\r' when indented code line is created on Windows.
+   * Indentation: Fix to calculate indent depth after multi line comment.
+   * Indentation: Fix to paste a word at correct position.
+   * EDC Editor: Fix a crash issue on Windows when preview part on live view is clicked.
+   * EDC Editor: Compare name elaborately to search the clicked part correctly.
+   * Live Edit: Fix malfunction of key input on Windows.
+   * Live Edit: Fix center guide text positioning problem.
+   * Live View: Update dummy part when removing all source code.
+   * RedoUndo: Correct work with unicode symbols.
+   * Template: Fix the error of line position when inserting group template.
+   * Template: Fix line count of textblock part inserted in live edit mode.
+   * Template: Fix to insert template code to the correct place.
+   * EDC Parser: Fix wrong minimum value of "base_scale"
+   * EDC Parser: Fix a crash issue when double click words on Windows.
+   * Ctxpopup: Fix a broken preview image relay behavior.
+   * Ctxpopup: Block whole area if the editor ctxpopup is activated.
+   * Ctxpopup: Don't display image previews if the selected image string is in comments.
+   * Auto Completion: Fix its list moved to selected part name position.
+   * Fix a crash issue when removing all code in edc editor.
+   * Fix a compilation issue when new empty file is opened.
+   * Fix a color selector to scalable.
+
+Changes since Enventor 0.7.0:
+-----------------------------
+
+Additions:
+   * Editor: Open/Close Bracket Highlighting.
+   * Statusbar: Support view inverting function (for simulating device rotation)
+   * Introduce a edc navigator.
+   * Support a color selector for "color" keywords in edc to change color.
+   * Add Enventor APis.
+     - enventor_object_part_states_list_get()
+     - enventor_object_parts_list_get()
+     - enventor_object_part_type_get()
+     - enventor_object_programs_list_get()
+     - ctxpopup,activated signal.
+
+Removes:
+   * Remove fixed size option in setting.
+   * Remove minimum new template code.
+   * Remove Enventr_Max_Line data type.
+
+Improvements:
+   * Editor: Support group name macros and preview those group macros.
+   * Improve Dummy Spacer UI.
+   * Statusbar supports live view zooming.
+   * Statusbar supports view size setting.
+   * View Scale slider in setting works on step size for mouse wheel.
+   * Improve the usage of the live view zooming with mouse wheel.
+   * Template code: fixed weird code insertion inside LazyEDC block.
+   * Support more autocomplete keywords.
+   * New design of Enventor logo.
+   * Improve tools ui.
+   * Simpilier editor ctxpopup ui.
+   * Console Box: Clicking Error log redirects editor cursor to the error code.
+   * Auto Indentation: Apply auto indentation for a edc file which is newly loaded.
+   * Auto Indentation: Improve logics for better smart results.
+   * Auto-select error code when error is occured.
+   * Auto completion: improve logic to guide better smart candidates lists.
+   * Live Edit: Select a name text in edc for a newly inserted part.
+   * Part Selection: Select a name in edc for a current selected part.
+   * RedoUndo: Support real-time preview when we undo/redo the code.
+   * Set a default font as Monospace type.
+   * Support monospace font types in the setting fonts list.
+   * In default, Select a current font type in the text setting.
+   * Editor Ctxpopup: Support Back key to reset the modification.
+
+Fixes:
+   * Fix incorrect tools' tooltip position.
+   * Remove some unsupported edc keyowrds.
+   * Fix some memory leak issues.
+   * Fix ridiculous editor cursor jumping issue.
+   * Fix to paste markup symbols correctly.
+   * Fix editor to work with Copy & Paste Plain Text mode.
+   * Fix crash issues.
+   * Fix a bug that dummy swallow is invisible.
+   * Fix a bug that part selection in live view doesn't work.
+   * Fix not to insert an empty line at the end of file.
+   * Fix to keep the edc changed status correctly. This brought enventor save edc files multiple times unnecessarily.
+   * Fix initial line max is 0 issue.
+   * Reset cursor position to 0 when edc file is loaded.
+   * Fix to update images properly even if very large size of image were updated by other process.
+
+Changes since Enventor 0.6.0:
+-----------------------------
+
+Additions:
+   * Tracking image resources for realtime live view updation.
+   * Marking lines which contains errors in edc editor.
+   * Support localization (English, Russian)
+   * Smart redo/undo function which applies coding convention for undo texts.
+   * Support dummy spacer.
+   * Jumping on to the code related with the current clicked part in live view.
+
+Removes:
+   * Get rid of ELM_ENGINE environment.
+
+Improvements:
+   * Focus shouldn't move on to ctxpopup when its moving.
+   * File Saving contains .edc extension automatically.
+   * Migrate on to lazy edc fully (syntax color, template code, etc..)
+   * Support realtime live view updation for the slider in ctxpoup.
+   * Renamed syntax color data file from color.src to edc.src.
+   * More compatible with ms windows platform.
+   * Add "base_scale" into template code.
+   * Improve auto completion for more correct and useful candidate keywords.
+   * Support ELM_ACCEL environment.
+   * Move the editor cursor at the end of the attributes after dismissing candidate list.
+   * Rename a temporary output file name to be different with input file name so that multiple enventors could modify same input file at the same time.
+   * Support more auto complete keywords.
+    - effect, anti_alias, mask_flags, limit, clip_to, domain
+   * Improve live edit icons quality.
+
+Fixes:
+   * Fix key modifiers to work short cut keys correctly.
+   * Correct incorrect syntax color.
+   * Enventor_Path_Type interface is updated.
+   * Fix missing edc updation if it is modified by other processes.
+   * Fix some memory leaks.
+   * Recognize part descriptions properly in the editor even though they don't have names.
+   * Create a config home folder properly if it's not existed.
+   * Fix eo build break on the latest efl(1.16)
+   * Fix a broken redo/undo function after replacing the text with search/replace feature.
+   * Fix to be avaiable to choose the last item on the candidate list.
+   * Fix to work part highlighting out for all groups in one edc.
+   * Fix to close goto window while it's toggled with a toolbar button.
+   * Fix a wierd behavior which changes edc source when ctxpopup is going to be closed.
+   * Fix to move scroller bar to correct position for find function.
+   * Fix the issue that ctxpopup preview images are remained when mouse wheel works quickly.
+   * Reset console box error messages when new or open file is performed.
+   * Let the editor have focus after live edit is done.
+   * Dismiss ctxpopup when edc build error.
+   * Dismiss ctxpopup when warning box is shown up at window exit.
+   * Fix incorrect size displaying of the live object.
+
+Changes since Enventor 0.5.0:
+-----------------------------
+
+Additions:
+   * Support editor font setting(font name, style, size).
+   * Add Enventor APis.
+     - enventor_object_font_set()/get() APIs.
+     - enventor_object_auto_complete_list_show() API.
+
+Removes:
+   * Get rid of template insert feature per parts.
+   * Get rid of tooltips from menu buttons.
+
+Improvements:
+   * Support more keywords in auto completion.
+   * Support more syntax color keywords
+   * Update live view with the current part that cursor positioned in.
+   * Improve live edit dragging handling.
+   * Introduce new command line arguments.
+   * Add more new file templates.
+   * Support edj output file path set.
+   * Update previous enventor config file properly by version info.
+   * Support saving edj file from file dialog.
+   * Enhance auto completion feature.
+   * Support part highlighting for SPACER type.
+   * Change short-cut keys for split views.
+   * Apply auto indentation when code is pasted.
+   * Support toggle effect on Tools GUI.
+   * Store/Restore editor split view status.
+   * Change live view scaling to zoom in/out concept.
+   * Adjust live view zoom range. (0.1 ~ 10.0)
+
+Fixes:
+   * Fix the compatibility to eo syntax change.
+   * Fix library initialization count corruption.
+   * Disable part highlight on Live Edit mode.
+   * Fix the live view to update by groups correctly.
+   * Fix wrong candidate popup position.
+   * Fix context corruption of font/view scale up/down.
+   * Fix auto completion popup sizing issue.
+   * Close auto completion popup if the line is deleted.
+   * Fix focus highlight remaining issue when live edit item is selected.
+   * Zoom up/down properly on live edit mode.
+   * Cancel live edit if the about(F1) is activated.
+   * Ctrl + wheel works even with numlock.
+
+Changes since Enventor 0.4.0:
+-----------------------------
+
+Additions:
+   * Support syntax color customization in setting.
+   * Add console auto hide mode.
+   * Support Live Edit (Ctrl + E).
+   * Add Enventor APIs.
+     - enventor_object_redo(), undo() APIs.
+     - enventor_object_cursor_pos_set() API.
+     - enventor_object_syntax_color_set()/get() APIs.
+   * Add "live_view,loaded" enventor smart callback.
+
+Improvements:
+   * Enable to insert image descirtiption and textblock style in template inserting.
+   * Reset console error message when error is gone.
+   * Add Text Editor mode in setting.
+   * Menu supports tooltip.
+   * Redesign Tools and support tooltip helper.
+   * Redesign candidate popup and it's behavior.
+   * Support more keywords in candidate popup.
+   * Support more keywords in auto completion.
+   * Keep window size set last time.
+
+Fixes:
+   * Fix to monitor empty file in live view.
+   * Fix intinite loop with "-to xxx.edc" in command line.
+   * Fix live view updation problem.
+   * Exporting/Importing Enventor dll for win32.
+   * Fix that edj is not reloaded when newly opened edc is changed.
+   * Fix wrong cursor position on status bar.
+   * Fix to goto window scalable.
+   * Set temporary path to default edc path by eina_file_mkstemp().
+   * Fix to show double quotation marks(") on efl 1.13
+   * Don't dismiss candidate popup on key events.
+   * Disable autoscrolling while ctxpopup is visible.
+   * Fix max value of mouse_events from 1000 to 1
+   * Fix to toggle linenumber properly with Shortcut key(F5)
+   * Fix max value of the mouse_events from 1000 to 1
+   * Fix candidate keyword name "align"
+   * Install missing eo header files
+   * Fix build package dependency.
+
+Changes since Enventor 0.3.0:
+-----------------------------
+
+Additions:
+   * Support Redo/Undo (Ctrl+R/Ctrl+Z)
+   * Support Enventor APIs.
+   * Support Console box that displays error messages.
+
+Improvements:
+   * Support auto completion Tab key to insert selection.
+   * Support auto completion more candidate keywords.
+   * Support tracking edc file modification and notification of it.
+   * Support "-to" command line option to open template menu at launching.
+   * Support multiple Enventor app processes.
+   * Improve GUIs.
+   * Generate template parts with random names.
+
+Fixes:
+   * Fixed auto completion popup to be shown even if entry cursor is moved up and down.
+   * Fixed to clear selection when find window is moved or closed.
+   * Fixed incorrect part highlight Short Cut key.
+   * Fixed memory leaks in some cases.
+   * Fixed segfault in applying syntax color.
+   * Fixed window title file path to be updated correctly.
+   * Fixed auto completion keyword relative
+   * Fixed auto completion candidation list to be updated correctly.
+   * Fixed dummy object(swallow) was invisible case.
+
+Changes since Enventor 0.2.0:
+-----------------------------
+
+Additions:
+   * Go to line (Ctrl+L)
+   * Support template codes from the new file
+   * Auto Completion (Ctrl+O)
+
+Improvements:
+   * Improved syntax color keywords to be configurable (enventor/data/color/color.src)
+   * Support more syntax color keywords
+   * Optimized syntax color function with parital applying mechacnism (Much faster in case of editing huge text)
+   * Support syntax color on macros
+   * Better intelligent focus movement
+   * Changed desktop category to Development/Utility
+
+Fixes:
+   * Fixed broken Search GUI scalability
+   * Fixed corrupted line number displaying
+   * Fixed a crash when an invalid input file is requested
+   * Got rid of a dangling empty space in the end of the file
+   * Fixed missing loading "&" character in a edc
+
+Changes since Enventor 0.1:
+---------------------------
+
+Additions:
+   * Save/Load config values (~/.config/enventor/enventor.eet)
+   * Toolbar GUI (F11)
+   * View scale change (Ctrl + Mouse Wheel)
+   * Find/Replace (Ctrl+F)
+   * Line Deletion (Ctrl+D)
+
+Improvements:
+   * Applied more syntax color keywords
+   * Display the current file path on the window title bar
+   * Support ELM_ENGINE gl set
+   * Better Pretty GUI
+   * Create a new file that is specified on the command line
+   * Support more selection keyword for candidate list display. - "action", "STATE_SET", "inherit", "image.normal", "image.tween", "target", "source" 
+
+Fixes:
+   * GUI scalability
+   * Open real "new" template code when New is requested
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..6ab4b21
--- /dev/null
+++ b/README
@@ -0,0 +1,120 @@
+[Enventor v0.9.0]
+
+Enventor, which is also known as EDC (Edje Data Collections) Editor, is a EDC script editor tool that supports text editing and previewing functions for the EDC source code.
+
+When your application requires real-time changeable layouts like animated ones, then you can write the layout design using EDC script, compile it into EDJ format file, and import it into your application using a UI layout component. You can also write design layouts from simple to complex ones using the EDC script with Enventor. Enventor helps you write EDC script code easier and finish your work faster. If you are not familiar with EDC programming, see Edje Programming Guide - https://www.enlightenment.org/program_guide/edje_pg for more information.
+
+[Requirements]
+
+  efl (>= 1.13.0)
+  elementary (>= 1.13.0)
+
+Please note that some features may not quite function correctly or completely prior to EFL 1.17. Newer would be better.
+
+Please see the following sites for more information.
+
+https://www.enlightenment.org/about-enventor
+https://phab.enlightenment.org/w/projects/enventor
+http://www.openhub.net/p/enventor
+
+[Compiling]
+
+Once you have met the requirements, compiling and installing is simple:
+
+  $ ./autogen.sh
+  $ make
+  $ sudo make install
+  $ sudo ldconfig (it may need on Linux System) 
+
+
+[Short Cut Keys]
+
+Esc - Open/Close Menu
+F1 - Help
+F2 - Set Main EDC (in File Browser)
+F3 - Quick Jump (Open an including file / Jumping to a referencing part)
+F4 - Revert Quick Jump
+F5 - Keyword Reference
+F7 - Toggle Tools
+F8 - Toggle Status
+F9 - Toggle File Browser
+F10 - Toggle EDC Navigator
+F11 - Toggle File Tab
+F12 - Settings
+
+Ctrl+S - Quick Save + Update Live View
+Ctrl+U - Toggle Dummy Parts
+Ctrl+H - Toggle Part Highlighting
+Ctrl+M - Toggle Mirror Mode
+Ctrl+W - Toggle Wireframes
+Ctrl+T - Insert Default Template Code
+Ctrl+Mouse Wheel Up - View Zoom In / Font Size Up
+Ctrl+Mouse Wheel Down - View Zoom Out / Font Size Down
+
+Alt+Left - Toggle Full Edit View
+Alt+Right - Toggle Full Live View
+Alt+Up - Toggle Full Console View
+Alt+Down - Toggle Full Editors View
+
+Ctrl+A - Select Text All
+Ctrl+Double Click - Select a word without openning candidate popup
+Ctrl+Z - Undo Text
+Ctrl+R - Redo Text
+Ctrl+C - Copy Selected Text
+Ctrl+V - Paste Copied Text
+Ctrl+X - Cut Selected Text
+Ctrl+D - Delete a Current line
+Ctrl+F - Find/Replace
+Ctrl+L - Go to line
+Ctrl+Home - Go to the Top line
+Ctrl+End - Go to the Bottom line
+Ctrl+Space - Search candidate keywords in the context
+
+
+[Command Line Usage]
+
+enventor --help
+enventor [input file] [output file] [-t] [-i image path] [-s sound path] [-f font path] [-d data path] [-w workspace path] [-e edje_cc path] [-a autocomp eet path] [-z tizen version]
+
+input file = EDC file to open. If input file is skipped, Enventor will open a default template code with a temporary file.
+output file = EDJ file to store compiled file. If output file is skipped, Enventor will store the binary file to the temporary directory.
+-t = Open template menu when you launch Enventor
+-i = path to image resources that the edc includes
+-s = path to sound resources that the edc includes
+-f = path to font resources that the edc includes
+-d = path to data resources that the edc includes
+-w = workspace directory path that contains group edc files
+-e = edje_cc, that compiles edc, path
+-a = autocomp eet, that auto complete function refers, path
+-z = tizen version
+
+Examples of Enventor command line usage:
+$ enventor
+$ enventor input.edc -i ./images
+$ enventor input.edc output.edj -i ./images
+$ enventor -t
+$ enventor newfile.edc -t
+$ enventor input.edc output.edj -i ./images -s ./sounds -w ./workspace
+$ enventor input.edc -e ~/tizen-sdk/platforms/tizen-2.3.1/common/efl-tool/efl-tools/bin/edje_cc
+$ enventor input.edc -a ~/tizen-sdk/tools/enventor/share/enventor/autocomp/2.3.1-autocomp.eet
+$ enventor input.edc -z 2.3.1
+
+
+[Developers]
+
+Many developers have contributed to Enventor project. The following names are dedicated Enventor developers' names but there are more people who've gladly contributed for Enventor. For a complete list of contributors, See AUTHORS file.
+
+Copyright (C) 2013 - 2016 by:
+
+Hermet Park
+Jaehyun Cho
+Mykyta Biliavskyi
+Kateryna Fesyna
+Tae-Hyup Kim
+Yunho Jeong
+Mincheol Seo
+Raoul Hecky
+Yurii Tsivun
+
+And various contributors (See AUTHORS)
+
diff --git a/autogen.sh b/autogen.sh
new file mode 100755 (executable)
index 0000000..b814903
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+rm -rf autom4te.cache
+rm -f aclocal.m4 ltmain.sh
+
+touch README
+touch ABOUT-NLS
+
+echo "Running autopoint..." ; autopoint -f || :
+echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS -I m4 || exit 1
+echo "Running autoheader..." ; autoheader || exit 1
+echo "Running autoconf..." ; autoconf || exit 1
+echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1
+echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1
+
+W=0
+
+rm -f config.cache-env.tmp
+echo "OLD_PARM=\"$@\"" >> config.cache-env.tmp
+echo "OLD_CFLAGS=\"$CFLAGS\"" >> config.cache-env.tmp
+echo "OLD_PATH=\"$PATH\"" >> config.cache-env.tmp
+echo "OLD_PKG_CONFIG_PATH=\"$PKG_CONFIG_PATH\"" >> config.cache-env.tmp
+echo "OLD_LDFLAGS=\"$LDFLAGS\"" >> config.cache-env.tmp
+
+cmp config.cache-env.tmp config.cache-env >> /dev/null
+if [ $? -ne 0 ]; then
+       W=1;
+fi
+
+if [ $W -ne 0 ]; then
+       echo "Cleaning configure cache...";
+       rm -f config.cache config.cache-env
+       mv config.cache-env.tmp config.cache-env
+else
+       rm -f config.cache-env.tmp
+fi
+
+if [ -z "$NOCONFIGURE" ]; then
+       ./configure -C "$@"
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..a6b7349
--- /dev/null
@@ -0,0 +1,146 @@
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+m4_define([v_maj], [0])
+m4_define([v_min], [9])
+m4_define([v_mic], [0])
+#m4_define([v_rev], m4_esyscmd([(git rev-list --count HEAD 2>/dev/null || echo 0) | tr -d '\n']))dnl
+##--   When released, remove the dnl on the below line
+dnl m4_undefine([v_rev])
+##--   When doing snapshots - change soname. remove dnl on below line
+dnl m4_define([relname], [ver-pre-svn-07])
+dnl m4_define([v_rel], [-release relname])
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+m4_ifdef([v_rev], [m4_define([v_ver], [v_maj.v_min.v_mic.v_rev])], [m4_define([v_ver], [v_maj.v_min.v_mic])])
+m4_define([lt_cur], m4_eval(v_maj + v_min))
+m4_define([lt_rev], v_mic)
+m4_define([lt_age], v_min)
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+
+AC_INIT(enventor, [v_ver], hermet@hermet.pe.kr)
+AC_PREREQ(2.52)
+AC_CONFIG_SRCDIR(configure.ac)
+AC_CONFIG_MACRO_DIR([m4])
+AC_PROG_CC
+AC_CANONICAL_BUILD
+AC_CANONICAL_HOST
+AC_CANONICAL_TARGET
+
+AM_INIT_AUTOMAKE(1.6 dist-bzip2 dist-xz)
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+AC_CONFIG_HEADERS(config.h)
+AC_GNU_SOURCE
+AC_PROG_LIBTOOL
+AM_PROG_CC_C_O
+ELM_QUICKLAUNCH
+
+AM_PROG_AS
+
+##-- localization with using gettext
+AM_GNU_GETTEXT_VERSION(0.18.1)
+AM_GNU_GETTEXT([external])
+
+#===============================================================================
+if test "x${prefix}" = "xNONE"; then
+   LOCALE_DIR="${ac_default_prefix}/share/locale"
+else
+   LOCALE_DIR="${prefix}/share/locale"
+fi
+AC_SUBST(LOCALE_DIR)
+#===============================================================================
+
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+m4_ifdef([v_rev], , [m4_define([v_rev], [0])])
+m4_ifdef([v_rel], , [m4_define([v_rel], [])])
+AC_DEFINE_UNQUOTED(VMAJ, [v_maj], [Major version])
+AC_DEFINE_UNQUOTED(VMIN, [v_min], [Minor version])
+AC_DEFINE_UNQUOTED(VMIC, [v_mic], [Micro version])
+AC_DEFINE_UNQUOTED(VREV, [v_rev], [Revison])
+
+version_info="lt_cur:lt_rev:lt_age"
+release_info="v_rel"
+AC_SUBST(version_info)
+AC_SUBST(release_info)
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+ENVENTOR_VERSION_MAJOR=v_maj
+ENVENTOR_VERSION_MINOR=v_min
+AC_SUBST(ENVENTOR_VERSION_MAJOR)
+AC_SUBST(ENVENTOR_VERSION_MINOR)
+
+EFL_ENABLE_EO_API_SUPPORT
+EFL_ENABLE_BETA_API_SUPPORT
+AC_DEFINE_UNQUOTED(ENVENTOR_WIN32_BUILD_SUPPORT, 1, "Support Win32 dllexport")
+AC_DEFINE_UNQUOTED(ENVENTOR_BETA_API_SUPPORT, 1, "Enable access to unstable ENVENTOR API that are still in beta")
+
+efl_version="1.13.0"
+requirement_enventor=" \
+eo >= ${efl_version} \
+eina >= ${efl_version} \
+eet >= ${efl_version} \
+elementary >= ${efl_version} \
+evas >= ${efl_version} \
+ecore >= ${efl_version} \
+ecore-file >= ${efl_version} \
+edje >= ${efl_version} \
+eio >= ${efl_version} \
+efreet >= ${efl_version}"
+
+AC_SUBST(requirement_enventor)
+
+PKG_CHECK_MODULES([ENVENTOR], [${requirement_enventor}])
+
+### Checks for linker characteristics
+
+# Needs to be moved into a macro, and also, needs a way to automatically fetch from all the dependencies using the Requires.
+DEPS_EOLIAN_FLAGS=`${PKG_CONFIG} --variable=eolian_flags eo evas edje ecore elementary efl`
+AC_SUBST([DEPS_EOLIAN_FLAGS])
+
+EFL_ATTRIBUTE_UNUSED
+
+# Check edje_cc
+EFL_WITH_BIN([eet], [eet-eet], [eet])
+EFL_WITH_BIN([edje], [edje-cc], [edje_cc])
+EFL_WITH_BIN([eolian], [eolian-gen], [eolian_gen])
+EFL_WITH_BIN([eolian-cxx], [eolian-cxx], [eolian_cxx])
+
+# Force the helper to try external eolian generator
+AM_CONDITIONAL([HAVE_EOLIAN_GEN], [true])
+AM_CONDITIONAL([HAVE_EOLIAN_CXX], [true])
+
+AC_CONFIG_FILES([
+po/Makefile.in
+Makefile
+src/Makefile
+src/include/Makefile
+src/lib/Makefile
+src/lib/Enventor.h
+src/bin/Makefile
+data/Makefile
+data/desktop/Makefile
+data/icon/Makefile
+data/images/Makefile
+data/themes/Makefile
+data/themes/default/Makefile
+data/themes/default/images/Makefile
+data/themes/default/sounds/Makefile
+data/themes/default/fonts/Makefile
+data/themes/elm/Makefile
+data/themes/elm/images/Makefile
+data/themes/elm/fonts/Makefile
+data/templates/Makefile
+data/templates/2.3-templates/Makefile
+data/templates/2.3.1-templates/Makefile
+data/templates/2.3.2-templates/Makefile
+data/templates/2.4-templates/Makefile
+data/templates/3.0-templates/Makefile
+data/color/Makefile
+data/autocomp/Makefile
+data/sounds/Makefile
+data/help/Makefile
+data/reference/Makefile
+pc/enventor.pc
+])
+
+AC_OUTPUT
diff --git a/data/Makefile.am b/data/Makefile.am
new file mode 100644 (file)
index 0000000..af8d524
--- /dev/null
@@ -0,0 +1,3 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = images themes templates desktop icon color sounds help autocomp reference
diff --git a/data/autocomp/2.3-autocomp.src b/data/autocomp/2.3-autocomp.src
new file mode 100644 (file)
index 0000000..8c67b3f
--- /dev/null
@@ -0,0 +1,1846 @@
+group "lexem" struct {
+   group "nodes" list {
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: ;"
+               }
+               value "cursor_offset" int: 1;
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "base_scale";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 3;
+                              value "string" string: "color";
+                              value "string" string: "color2";
+                              value "string" string: "color3";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "color_class";
+                     }
+                 }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_classes";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" COMP;";
+                     }
+                     value "cursor_offset" int: 7
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                         }
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\" COMP;";
+                                 }
+                                 value "cursor_offset" int: 7;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "image";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "size";
+                                 }
+                              }
+                           }
+                           group "txt" var_array {
+                               count 3;
+                               value "string" string: "%s {<br/>";
+                               value "string" string: "   <br/>";
+                               value "string" string: "}";
+                           }
+                           value "cursor_offset" int: 2
+                           value "line_back" int: 1;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "set";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               value "dot" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "images";
+               }
+            }
+
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                            }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" RAW;";
+                           }
+                           value "cursor_offset" int: 6;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "source";
+                           }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "sample";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tone";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "sounds";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" \"\";";
+                          }
+                          value "cursor_offset" int: 5
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                              count 1;
+                              value "string" string: "item";
+                          }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "data";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 2;
+                         value "string" string: "alias";
+                         value "string" string: "inherit";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                               count 2;
+                               value "string" string: "horizontal";
+                               value "string" string: "vertical";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "limits";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "script";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 4;
+                         value "string" string: "broadcast_signal";
+                         value "string" string: "max";
+                         value "string" string: "min";
+                         value "string" string: "script_only";
+                     }
+                  }
+                  group "lexem" struct {
+                    group "nodes" list {
+                       group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" COMP;";
+                          }
+                          value "cursor_offset" int: 7
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "image";
+                          }
+                       }
+                       group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                                group "nodes" list {
+                                }
+                                group "txt" var_array {
+                                    count 1;
+                                    value "string" string: "%s: \"\";";
+                                }
+                                value "cursor_offset" int: 2;
+                                value "line_back" int: 0;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "name";
+                                }
+                              }
+                             group "lexem" struct {
+                                group "nodes" list {
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: \"\" COMP;";
+                                      }
+                                      value "cursor_offset" int: 7;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "image";
+                                      }
+                                   }
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: ;";
+                                      }
+                                      value "cursor_offset" int: 1;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "size";
+                                      }
+                                   }
+                                }
+                                group "txt" var_array {
+                                    count 3;
+                                    value "string" string: "%s {<br/>";
+                                    value "string" string: "   <br/>";
+                                    value "string" string: "}";
+                                }
+                                value "cursor_offset" int: 2
+                                value "line_back" int: 1;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "image";
+                                }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 3;
+                              value "string" string: "%s {<br/>";
+                              value "string" string: "   <br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 2
+                          value "line_back" int: 1
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "set";
+                          }
+                       }
+                    }
+                    group "txt" var_array {
+                        count 3;
+                        value "string" string: "%s {<br/>";
+                        value "string" string: "   <br/>";
+                        value "string" string: "}";
+                    }
+                    value "cursor_offset" int: 2;
+                    value "line_back" int: 1;
+                    value "dot" int: 1;
+                    group "name" var_array {
+                       count 1;
+                       value "string" string: "images";
+                    }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 9;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "weight";
+                                                  }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "box";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: BEFORE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "cursor_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 7;
+                                    value "string" string: "access";
+                                    value "string" string: "ignore_flags";
+                                    value "string" string: "mouse_events";
+                                    value "string" string: "multiline";
+                                    value "string" string: "pointer_mode";
+                                    value "string" string: "repeat_events";
+                                    value "string" string: "scale";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\";";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 4;
+                                    value "string" string: "clip_to";
+                                    value "string" string: "insert_after";
+                                    value "string" string: "insert_before";
+                                    value "string" string: "source";
+                                 }
+                              }
+
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "clip_to";
+                                           value "string" string: "color_class";
+                                           value "string" string: "source";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 12;
+                                           value "string" string: "align";
+                                           value "string" string: "aspect";
+                                           value "string" string: "aspect_preference";
+                                           value "string" string: "color";
+                                           value "string" string: "color2";
+                                           value "string" string: "color3";
+                                           value "string" string: "fixed";
+                                           value "string" string: "max";
+                                           value "string" string: "min";
+                                           value "string" string: "minmul";
+                                           value "string" string: "step";
+                                           value "string" string: "visible";
+                                       }
+                                    }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "layout";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "align";
+                                                 value "string" string: "min";
+                                                 value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "box";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 2;
+                                                       value "string" string: "offset";
+                                                       value "string" string: "relative";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "origin";
+                                                 value "string" string: "size";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "smooth";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: SCALE;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "type";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "fill";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "border";
+                                                 value "string" string: "border_scale";
+                                                 value "string" string: "border_scale_by";
+                                                 value "string" string: "middle";
+                                                 value "string" string: "scale_hint";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "normal";
+                                                 value "string" string: "tween";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "image";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\" 0.0;";
+                                       }
+                                       value "cursor_offset" int: 6;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "inherit";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "light";
+                                                 value "string" string: "perspective";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "color";
+                                             }
+                                         }
+                                         group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "alpha";
+                                                 value "string" string: "backface_cull";
+                                                 value "string" string: "on";
+                                                 value "string" string: "smooth";
+                                                 value "string" string: "perspective_on";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 1;
+                                                       value "string" string: "center";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 3;
+                                                       value "string" string: "x";
+                                                       value "string" string: "y";
+                                                       value "string" string: "z";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "rotation";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "map";
+                                       }
+                                    }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "focal";
+                                                 value "string" string: "zplane";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "perspective";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "relative";
+                                                 value "string" string: "offset";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "to";
+                                                 value "string" string: "to_x";
+                                                 value "string" string: "to_y";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "rel1";
+                                           value "string" string: "rel2";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: NONE;";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "homogeneous";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 3
+                                                value "string" string: "align";
+                                                value "string" string: "min";
+                                                value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "table";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 7;
+                                                 value "string" string: "align";
+                                                 value "string" string: "ellipsis";
+                                                 value "string" string: "fit";
+                                                 value "string" string: "max";
+                                                 value "string" string: "min";
+                                                 value "string" string: "size";
+                                                 value "string" string: "size_range";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 7;
+                                                 value "string" string: "font";
+                                                 value "string" string: "repch";
+                                                 value "string" string: "source";
+                                                 value "string" string: "style";
+                                                 value "string" string: "text";
+                                                 value "string" string: "text_class";
+                                                 value "string" string: "text_source";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "text";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 2;
+                                     value "string" string: "%s { state: \"\" 0.0;<br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 8;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                     count 1;
+                                     value "string" string: "description";
+                                 }
+                               }
+                               group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "threshold";
+                                           value "string" string: "events";
+                                           value "string" string: "confine";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "y";
+                                           value "string" string: "x";
+                                       }
+                                     }
+                                  }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "dragable";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: NONE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "entry_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: DEFAULT;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "select_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 11;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "position";
+                                                      value "string" string: "span";
+                                                      value "string" string: "weight";
+                                                   }
+                                                 }
+                                              }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "table";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: IMAGE;";
+                                 }
+                                 value "cursor_offset" int: 0
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                     count 1;
+                                     value "string" string: "type";
+                                 }
+                              }
+                            }
+                            group "txt" var_array {
+                                count 2;
+                                value "string" string: "%s { name: \"\";<br/>";
+                                value "string" string: "}";
+                            }
+                            value "cursor_offset" int: 4;
+                            value "line_back" int: 1;
+                            group "name" var_array {
+                               count 1;
+                               value "string" string: "part";
+                            }
+                         }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "parts";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: STATE_SET \"\" 0.0;";
+                               }
+                               value "cursor_offset" int: 6;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "action";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               value "use_cntr" int: 0;
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\" \"\";";
+                               }
+                               value "cursor_offset" int: 5;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "filter";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "in";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\";";
+                               }
+                               value "cursor_offset" int: 2;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 5;
+                                  value "string" string: "after";
+                                  value "string" string: "name";
+                                  value "string" string: "source";
+                                  value "string" string: "signal";
+                                  value "string" string: "target";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: LINEAR ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "transition";
+                               }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 2;
+                              value "string" string: "%s { name: \"\";<br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 4;
+                          value "line_back" int: 1;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "program";
+                          }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "programs";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 2;
+                   value "string" string: "%s { name: \"\";<br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 4;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "group";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "collections";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 3;
+                        value "string" string: "color";
+                        value "string" string: "color2";
+                        value "string" string: "color3";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_class";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "color_classes";
+         }
+     }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 2;
+                 value "string" string: "file";
+                 value "string" string: "item";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "data";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\";";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 0;
+               group "name" var_array {
+                 count 1;
+                 value "string" string: "external";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "externals";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 1;
+                 value "string" string: "font";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "fonts";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: \"\" COMP;";
+               }
+               value "cursor_offset" int: 7
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "image";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                   }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" COMP;";
+                           }
+                           value "cursor_offset" int: 7;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "size";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2
+               value "line_back" int: 1
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "set";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         value "dot" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "images";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 2;
+                        value "string" string: "base";
+                        value "string" string: "name";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" \"\";";
+                     }
+                     value "cursor_offset" int: 5;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tag";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "style";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "styles";
+         }
+      }
+    }
+   group "txt" var_array {
+       count 1;
+       value "string" string: "%s";
+   }
+   value "cursor_offset" int: 0
+   value "line_back" int: 0;
+   group "name" var_array {
+      count 1;
+      value "string" string: "root";
+   }
+}
diff --git a/data/autocomp/2.3.1-autocomp.src b/data/autocomp/2.3.1-autocomp.src
new file mode 100644 (file)
index 0000000..8c67b3f
--- /dev/null
@@ -0,0 +1,1846 @@
+group "lexem" struct {
+   group "nodes" list {
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: ;"
+               }
+               value "cursor_offset" int: 1;
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "base_scale";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 3;
+                              value "string" string: "color";
+                              value "string" string: "color2";
+                              value "string" string: "color3";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "color_class";
+                     }
+                 }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_classes";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" COMP;";
+                     }
+                     value "cursor_offset" int: 7
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                         }
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\" COMP;";
+                                 }
+                                 value "cursor_offset" int: 7;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "image";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "size";
+                                 }
+                              }
+                           }
+                           group "txt" var_array {
+                               count 3;
+                               value "string" string: "%s {<br/>";
+                               value "string" string: "   <br/>";
+                               value "string" string: "}";
+                           }
+                           value "cursor_offset" int: 2
+                           value "line_back" int: 1;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "set";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               value "dot" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "images";
+               }
+            }
+
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                            }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" RAW;";
+                           }
+                           value "cursor_offset" int: 6;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "source";
+                           }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "sample";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tone";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "sounds";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" \"\";";
+                          }
+                          value "cursor_offset" int: 5
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                              count 1;
+                              value "string" string: "item";
+                          }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "data";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 2;
+                         value "string" string: "alias";
+                         value "string" string: "inherit";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                               count 2;
+                               value "string" string: "horizontal";
+                               value "string" string: "vertical";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "limits";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "script";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 4;
+                         value "string" string: "broadcast_signal";
+                         value "string" string: "max";
+                         value "string" string: "min";
+                         value "string" string: "script_only";
+                     }
+                  }
+                  group "lexem" struct {
+                    group "nodes" list {
+                       group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" COMP;";
+                          }
+                          value "cursor_offset" int: 7
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "image";
+                          }
+                       }
+                       group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                                group "nodes" list {
+                                }
+                                group "txt" var_array {
+                                    count 1;
+                                    value "string" string: "%s: \"\";";
+                                }
+                                value "cursor_offset" int: 2;
+                                value "line_back" int: 0;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "name";
+                                }
+                              }
+                             group "lexem" struct {
+                                group "nodes" list {
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: \"\" COMP;";
+                                      }
+                                      value "cursor_offset" int: 7;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "image";
+                                      }
+                                   }
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: ;";
+                                      }
+                                      value "cursor_offset" int: 1;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "size";
+                                      }
+                                   }
+                                }
+                                group "txt" var_array {
+                                    count 3;
+                                    value "string" string: "%s {<br/>";
+                                    value "string" string: "   <br/>";
+                                    value "string" string: "}";
+                                }
+                                value "cursor_offset" int: 2
+                                value "line_back" int: 1;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "image";
+                                }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 3;
+                              value "string" string: "%s {<br/>";
+                              value "string" string: "   <br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 2
+                          value "line_back" int: 1
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "set";
+                          }
+                       }
+                    }
+                    group "txt" var_array {
+                        count 3;
+                        value "string" string: "%s {<br/>";
+                        value "string" string: "   <br/>";
+                        value "string" string: "}";
+                    }
+                    value "cursor_offset" int: 2;
+                    value "line_back" int: 1;
+                    value "dot" int: 1;
+                    group "name" var_array {
+                       count 1;
+                       value "string" string: "images";
+                    }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 9;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "weight";
+                                                  }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "box";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: BEFORE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "cursor_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 7;
+                                    value "string" string: "access";
+                                    value "string" string: "ignore_flags";
+                                    value "string" string: "mouse_events";
+                                    value "string" string: "multiline";
+                                    value "string" string: "pointer_mode";
+                                    value "string" string: "repeat_events";
+                                    value "string" string: "scale";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\";";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 4;
+                                    value "string" string: "clip_to";
+                                    value "string" string: "insert_after";
+                                    value "string" string: "insert_before";
+                                    value "string" string: "source";
+                                 }
+                              }
+
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "clip_to";
+                                           value "string" string: "color_class";
+                                           value "string" string: "source";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 12;
+                                           value "string" string: "align";
+                                           value "string" string: "aspect";
+                                           value "string" string: "aspect_preference";
+                                           value "string" string: "color";
+                                           value "string" string: "color2";
+                                           value "string" string: "color3";
+                                           value "string" string: "fixed";
+                                           value "string" string: "max";
+                                           value "string" string: "min";
+                                           value "string" string: "minmul";
+                                           value "string" string: "step";
+                                           value "string" string: "visible";
+                                       }
+                                    }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "layout";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "align";
+                                                 value "string" string: "min";
+                                                 value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "box";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 2;
+                                                       value "string" string: "offset";
+                                                       value "string" string: "relative";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "origin";
+                                                 value "string" string: "size";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "smooth";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: SCALE;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "type";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "fill";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "border";
+                                                 value "string" string: "border_scale";
+                                                 value "string" string: "border_scale_by";
+                                                 value "string" string: "middle";
+                                                 value "string" string: "scale_hint";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "normal";
+                                                 value "string" string: "tween";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "image";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\" 0.0;";
+                                       }
+                                       value "cursor_offset" int: 6;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "inherit";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "light";
+                                                 value "string" string: "perspective";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "color";
+                                             }
+                                         }
+                                         group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "alpha";
+                                                 value "string" string: "backface_cull";
+                                                 value "string" string: "on";
+                                                 value "string" string: "smooth";
+                                                 value "string" string: "perspective_on";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 1;
+                                                       value "string" string: "center";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 3;
+                                                       value "string" string: "x";
+                                                       value "string" string: "y";
+                                                       value "string" string: "z";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "rotation";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "map";
+                                       }
+                                    }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "focal";
+                                                 value "string" string: "zplane";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "perspective";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "relative";
+                                                 value "string" string: "offset";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "to";
+                                                 value "string" string: "to_x";
+                                                 value "string" string: "to_y";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "rel1";
+                                           value "string" string: "rel2";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: NONE;";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "homogeneous";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 3
+                                                value "string" string: "align";
+                                                value "string" string: "min";
+                                                value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "table";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 7;
+                                                 value "string" string: "align";
+                                                 value "string" string: "ellipsis";
+                                                 value "string" string: "fit";
+                                                 value "string" string: "max";
+                                                 value "string" string: "min";
+                                                 value "string" string: "size";
+                                                 value "string" string: "size_range";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 7;
+                                                 value "string" string: "font";
+                                                 value "string" string: "repch";
+                                                 value "string" string: "source";
+                                                 value "string" string: "style";
+                                                 value "string" string: "text";
+                                                 value "string" string: "text_class";
+                                                 value "string" string: "text_source";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "text";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 2;
+                                     value "string" string: "%s { state: \"\" 0.0;<br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 8;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                     count 1;
+                                     value "string" string: "description";
+                                 }
+                               }
+                               group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "threshold";
+                                           value "string" string: "events";
+                                           value "string" string: "confine";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "y";
+                                           value "string" string: "x";
+                                       }
+                                     }
+                                  }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "dragable";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: NONE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "entry_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: DEFAULT;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "select_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 11;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "position";
+                                                      value "string" string: "span";
+                                                      value "string" string: "weight";
+                                                   }
+                                                 }
+                                              }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "table";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: IMAGE;";
+                                 }
+                                 value "cursor_offset" int: 0
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                     count 1;
+                                     value "string" string: "type";
+                                 }
+                              }
+                            }
+                            group "txt" var_array {
+                                count 2;
+                                value "string" string: "%s { name: \"\";<br/>";
+                                value "string" string: "}";
+                            }
+                            value "cursor_offset" int: 4;
+                            value "line_back" int: 1;
+                            group "name" var_array {
+                               count 1;
+                               value "string" string: "part";
+                            }
+                         }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "parts";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: STATE_SET \"\" 0.0;";
+                               }
+                               value "cursor_offset" int: 6;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "action";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               value "use_cntr" int: 0;
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\" \"\";";
+                               }
+                               value "cursor_offset" int: 5;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "filter";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "in";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\";";
+                               }
+                               value "cursor_offset" int: 2;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 5;
+                                  value "string" string: "after";
+                                  value "string" string: "name";
+                                  value "string" string: "source";
+                                  value "string" string: "signal";
+                                  value "string" string: "target";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: LINEAR ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "transition";
+                               }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 2;
+                              value "string" string: "%s { name: \"\";<br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 4;
+                          value "line_back" int: 1;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "program";
+                          }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "programs";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 2;
+                   value "string" string: "%s { name: \"\";<br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 4;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "group";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "collections";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 3;
+                        value "string" string: "color";
+                        value "string" string: "color2";
+                        value "string" string: "color3";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_class";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "color_classes";
+         }
+     }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 2;
+                 value "string" string: "file";
+                 value "string" string: "item";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "data";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\";";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 0;
+               group "name" var_array {
+                 count 1;
+                 value "string" string: "external";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "externals";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 1;
+                 value "string" string: "font";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "fonts";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: \"\" COMP;";
+               }
+               value "cursor_offset" int: 7
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "image";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                   }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" COMP;";
+                           }
+                           value "cursor_offset" int: 7;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "size";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2
+               value "line_back" int: 1
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "set";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         value "dot" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "images";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 2;
+                        value "string" string: "base";
+                        value "string" string: "name";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" \"\";";
+                     }
+                     value "cursor_offset" int: 5;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tag";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "style";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "styles";
+         }
+      }
+    }
+   group "txt" var_array {
+       count 1;
+       value "string" string: "%s";
+   }
+   value "cursor_offset" int: 0
+   value "line_back" int: 0;
+   group "name" var_array {
+      count 1;
+      value "string" string: "root";
+   }
+}
diff --git a/data/autocomp/2.3.2-autocomp.src b/data/autocomp/2.3.2-autocomp.src
new file mode 100644 (file)
index 0000000..8c67b3f
--- /dev/null
@@ -0,0 +1,1846 @@
+group "lexem" struct {
+   group "nodes" list {
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: ;"
+               }
+               value "cursor_offset" int: 1;
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "base_scale";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 3;
+                              value "string" string: "color";
+                              value "string" string: "color2";
+                              value "string" string: "color3";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "color_class";
+                     }
+                 }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_classes";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" COMP;";
+                     }
+                     value "cursor_offset" int: 7
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                         }
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\" COMP;";
+                                 }
+                                 value "cursor_offset" int: 7;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "image";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "size";
+                                 }
+                              }
+                           }
+                           group "txt" var_array {
+                               count 3;
+                               value "string" string: "%s {<br/>";
+                               value "string" string: "   <br/>";
+                               value "string" string: "}";
+                           }
+                           value "cursor_offset" int: 2
+                           value "line_back" int: 1;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "set";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               value "dot" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "images";
+               }
+            }
+
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                            }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" RAW;";
+                           }
+                           value "cursor_offset" int: 6;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "source";
+                           }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "sample";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tone";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "sounds";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" \"\";";
+                          }
+                          value "cursor_offset" int: 5
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                              count 1;
+                              value "string" string: "item";
+                          }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "data";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 2;
+                         value "string" string: "alias";
+                         value "string" string: "inherit";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                               count 2;
+                               value "string" string: "horizontal";
+                               value "string" string: "vertical";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "limits";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "script";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 4;
+                         value "string" string: "broadcast_signal";
+                         value "string" string: "max";
+                         value "string" string: "min";
+                         value "string" string: "script_only";
+                     }
+                  }
+                  group "lexem" struct {
+                    group "nodes" list {
+                       group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" COMP;";
+                          }
+                          value "cursor_offset" int: 7
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "image";
+                          }
+                       }
+                       group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                                group "nodes" list {
+                                }
+                                group "txt" var_array {
+                                    count 1;
+                                    value "string" string: "%s: \"\";";
+                                }
+                                value "cursor_offset" int: 2;
+                                value "line_back" int: 0;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "name";
+                                }
+                              }
+                             group "lexem" struct {
+                                group "nodes" list {
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: \"\" COMP;";
+                                      }
+                                      value "cursor_offset" int: 7;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "image";
+                                      }
+                                   }
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: ;";
+                                      }
+                                      value "cursor_offset" int: 1;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "size";
+                                      }
+                                   }
+                                }
+                                group "txt" var_array {
+                                    count 3;
+                                    value "string" string: "%s {<br/>";
+                                    value "string" string: "   <br/>";
+                                    value "string" string: "}";
+                                }
+                                value "cursor_offset" int: 2
+                                value "line_back" int: 1;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "image";
+                                }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 3;
+                              value "string" string: "%s {<br/>";
+                              value "string" string: "   <br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 2
+                          value "line_back" int: 1
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "set";
+                          }
+                       }
+                    }
+                    group "txt" var_array {
+                        count 3;
+                        value "string" string: "%s {<br/>";
+                        value "string" string: "   <br/>";
+                        value "string" string: "}";
+                    }
+                    value "cursor_offset" int: 2;
+                    value "line_back" int: 1;
+                    value "dot" int: 1;
+                    group "name" var_array {
+                       count 1;
+                       value "string" string: "images";
+                    }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 9;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "weight";
+                                                  }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "box";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: BEFORE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "cursor_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 7;
+                                    value "string" string: "access";
+                                    value "string" string: "ignore_flags";
+                                    value "string" string: "mouse_events";
+                                    value "string" string: "multiline";
+                                    value "string" string: "pointer_mode";
+                                    value "string" string: "repeat_events";
+                                    value "string" string: "scale";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\";";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 4;
+                                    value "string" string: "clip_to";
+                                    value "string" string: "insert_after";
+                                    value "string" string: "insert_before";
+                                    value "string" string: "source";
+                                 }
+                              }
+
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "clip_to";
+                                           value "string" string: "color_class";
+                                           value "string" string: "source";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 12;
+                                           value "string" string: "align";
+                                           value "string" string: "aspect";
+                                           value "string" string: "aspect_preference";
+                                           value "string" string: "color";
+                                           value "string" string: "color2";
+                                           value "string" string: "color3";
+                                           value "string" string: "fixed";
+                                           value "string" string: "max";
+                                           value "string" string: "min";
+                                           value "string" string: "minmul";
+                                           value "string" string: "step";
+                                           value "string" string: "visible";
+                                       }
+                                    }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "layout";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "align";
+                                                 value "string" string: "min";
+                                                 value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "box";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 2;
+                                                       value "string" string: "offset";
+                                                       value "string" string: "relative";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "origin";
+                                                 value "string" string: "size";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "smooth";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: SCALE;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "type";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "fill";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "border";
+                                                 value "string" string: "border_scale";
+                                                 value "string" string: "border_scale_by";
+                                                 value "string" string: "middle";
+                                                 value "string" string: "scale_hint";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "normal";
+                                                 value "string" string: "tween";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "image";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\" 0.0;";
+                                       }
+                                       value "cursor_offset" int: 6;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "inherit";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "light";
+                                                 value "string" string: "perspective";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "color";
+                                             }
+                                         }
+                                         group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "alpha";
+                                                 value "string" string: "backface_cull";
+                                                 value "string" string: "on";
+                                                 value "string" string: "smooth";
+                                                 value "string" string: "perspective_on";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 1;
+                                                       value "string" string: "center";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 3;
+                                                       value "string" string: "x";
+                                                       value "string" string: "y";
+                                                       value "string" string: "z";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "rotation";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "map";
+                                       }
+                                    }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "focal";
+                                                 value "string" string: "zplane";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "perspective";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "relative";
+                                                 value "string" string: "offset";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "to";
+                                                 value "string" string: "to_x";
+                                                 value "string" string: "to_y";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "rel1";
+                                           value "string" string: "rel2";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: NONE;";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "homogeneous";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 3
+                                                value "string" string: "align";
+                                                value "string" string: "min";
+                                                value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "table";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 7;
+                                                 value "string" string: "align";
+                                                 value "string" string: "ellipsis";
+                                                 value "string" string: "fit";
+                                                 value "string" string: "max";
+                                                 value "string" string: "min";
+                                                 value "string" string: "size";
+                                                 value "string" string: "size_range";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 7;
+                                                 value "string" string: "font";
+                                                 value "string" string: "repch";
+                                                 value "string" string: "source";
+                                                 value "string" string: "style";
+                                                 value "string" string: "text";
+                                                 value "string" string: "text_class";
+                                                 value "string" string: "text_source";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "text";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 2;
+                                     value "string" string: "%s { state: \"\" 0.0;<br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 8;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                     count 1;
+                                     value "string" string: "description";
+                                 }
+                               }
+                               group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "threshold";
+                                           value "string" string: "events";
+                                           value "string" string: "confine";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "y";
+                                           value "string" string: "x";
+                                       }
+                                     }
+                                  }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "dragable";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: NONE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "entry_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: DEFAULT;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "select_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 11;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "position";
+                                                      value "string" string: "span";
+                                                      value "string" string: "weight";
+                                                   }
+                                                 }
+                                              }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "table";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: IMAGE;";
+                                 }
+                                 value "cursor_offset" int: 0
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                     count 1;
+                                     value "string" string: "type";
+                                 }
+                              }
+                            }
+                            group "txt" var_array {
+                                count 2;
+                                value "string" string: "%s { name: \"\";<br/>";
+                                value "string" string: "}";
+                            }
+                            value "cursor_offset" int: 4;
+                            value "line_back" int: 1;
+                            group "name" var_array {
+                               count 1;
+                               value "string" string: "part";
+                            }
+                         }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "parts";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: STATE_SET \"\" 0.0;";
+                               }
+                               value "cursor_offset" int: 6;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "action";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               value "use_cntr" int: 0;
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\" \"\";";
+                               }
+                               value "cursor_offset" int: 5;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "filter";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "in";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\";";
+                               }
+                               value "cursor_offset" int: 2;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 5;
+                                  value "string" string: "after";
+                                  value "string" string: "name";
+                                  value "string" string: "source";
+                                  value "string" string: "signal";
+                                  value "string" string: "target";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: LINEAR ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "transition";
+                               }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 2;
+                              value "string" string: "%s { name: \"\";<br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 4;
+                          value "line_back" int: 1;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "program";
+                          }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "programs";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 2;
+                   value "string" string: "%s { name: \"\";<br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 4;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "group";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "collections";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 3;
+                        value "string" string: "color";
+                        value "string" string: "color2";
+                        value "string" string: "color3";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_class";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "color_classes";
+         }
+     }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 2;
+                 value "string" string: "file";
+                 value "string" string: "item";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "data";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\";";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 0;
+               group "name" var_array {
+                 count 1;
+                 value "string" string: "external";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "externals";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 1;
+                 value "string" string: "font";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "fonts";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: \"\" COMP;";
+               }
+               value "cursor_offset" int: 7
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "image";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                   }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" COMP;";
+                           }
+                           value "cursor_offset" int: 7;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "size";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2
+               value "line_back" int: 1
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "set";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         value "dot" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "images";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 2;
+                        value "string" string: "base";
+                        value "string" string: "name";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" \"\";";
+                     }
+                     value "cursor_offset" int: 5;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tag";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "style";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "styles";
+         }
+      }
+    }
+   group "txt" var_array {
+       count 1;
+       value "string" string: "%s";
+   }
+   value "cursor_offset" int: 0
+   value "line_back" int: 0;
+   group "name" var_array {
+      count 1;
+      value "string" string: "root";
+   }
+}
diff --git a/data/autocomp/2.4-autocomp.src b/data/autocomp/2.4-autocomp.src
new file mode 100644 (file)
index 0000000..c471f21
--- /dev/null
@@ -0,0 +1,2093 @@
+group "lexem" struct {
+   group "nodes" list {
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: ;"
+               }
+               value "cursor_offset" int: 1;
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "base_scale";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 3;
+                              value "string" string: "color";
+                              value "string" string: "color2";
+                              value "string" string: "color3";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "color_class";
+                     }
+                 }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_classes";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" COMP;";
+                     }
+                     value "cursor_offset" int: 7
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                         }
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\" COMP;";
+                                 }
+                                 value "cursor_offset" int: 7;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "image";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "size";
+                                 }
+                              }
+                           }
+                           group "txt" var_array {
+                               count 3;
+                               value "string" string: "%s {<br/>";
+                               value "string" string: "   <br/>";
+                               value "string" string: "}";
+                           }
+                           value "cursor_offset" int: 2
+                           value "line_back" int: 1;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "set";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               value "dot" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "images";
+               }
+            }
+
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                            }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" RAW;";
+                           }
+                           value "cursor_offset" int: 6;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "source";
+                           }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "sample";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tone";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "sounds";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" \"\";";
+                          }
+                          value "cursor_offset" int: 5
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                              count 1;
+                              value "string" string: "item";
+                          }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "data";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 2;
+                         value "string" string: "alias";
+                         value "string" string: "inherit";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                               count 2;
+                               value "string" string: "horizontal";
+                               value "string" string: "vertical";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "limits";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "script";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 4;
+                         value "string" string: "broadcast_signal";
+                         value "string" string: "max";
+                         value "string" string: "min";
+                         value "string" string: "script_only";
+                     }
+                  }
+                  group "lexem" struct {
+                    group "nodes" list {
+                       group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" COMP;";
+                          }
+                          value "cursor_offset" int: 7
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "image";
+                          }
+                       }
+                       group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                                group "nodes" list {
+                                }
+                                group "txt" var_array {
+                                    count 1;
+                                    value "string" string: "%s: \"\";";
+                                }
+                                value "cursor_offset" int: 2;
+                                value "line_back" int: 0;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "name";
+                                }
+                              }
+                             group "lexem" struct {
+                                group "nodes" list {
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: \"\" COMP;";
+                                      }
+                                      value "cursor_offset" int: 7;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "image";
+                                      }
+                                   }
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: ;";
+                                      }
+                                      value "cursor_offset" int: 1;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "size";
+                                      }
+                                   }
+                                }
+                                group "txt" var_array {
+                                    count 3;
+                                    value "string" string: "%s {<br/>";
+                                    value "string" string: "   <br/>";
+                                    value "string" string: "}";
+                                }
+                                value "cursor_offset" int: 2
+                                value "line_back" int: 1;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "image";
+                                }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 3;
+                              value "string" string: "%s {<br/>";
+                              value "string" string: "   <br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 2
+                          value "line_back" int: 1
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "set";
+                          }
+                       }
+                    }
+                    group "txt" var_array {
+                        count 3;
+                        value "string" string: "%s {<br/>";
+                        value "string" string: "   <br/>";
+                        value "string" string: "}";
+                    }
+                    value "cursor_offset" int: 2;
+                    value "line_back" int: 1;
+                    value "dot" int: 1;
+                    group "name" var_array {
+                       count 1;
+                       value "string" string: "images";
+                    }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 10;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "spread";
+                                                      value "string" string: "weight";
+                                                  }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "box";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: BEFORE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "cursor_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: SOFT_SHADOW;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "effect";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 8;
+                                    value "string" string: "access";
+                                    value "string" string: "anti_alias";
+                                    value "string" string: "ignore_flags";
+                                    value "string" string: "mouse_events";
+                                    value "string" string: "multiline";
+                                    value "string" string: "pointer_mode";
+                                    value "string" string: "repeat_events";
+                                    value "string" string: "scale";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\";";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 4;
+                                    value "string" string: "clip_to";
+                                    value "string" string: "insert_after";
+                                    value "string" string: "insert_before";
+                                    value "string" string: "source";
+                                 }
+                              }
+
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "clip_to";
+                                           value "string" string: "color_class";
+                                           value "string" string: "source";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 12;
+                                           value "string" string: "align";
+                                           value "string" string: "aspect";
+                                           value "string" string: "aspect_preference";
+                                           value "string" string: "color";
+                                           value "string" string: "color2";
+                                           value "string" string: "color3";
+                                           value "string" string: "fixed";
+                                           value "string" string: "max";
+                                           value "string" string: "min";
+                                           value "string" string: "minmul";
+                                           value "string" string: "step";
+                                           value "string" string: "visible";
+                                       }
+                                    }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "layout";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "align";
+                                                 value "string" string: "min";
+                                                 value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "box";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 2;
+                                                       value "string" string: "offset";
+                                                       value "string" string: "relative";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "origin";
+                                                 value "string" string: "size";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "smooth";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: SCALE;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "type";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "fill";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "border";
+                                                 value "string" string: "border_scale";
+                                                 value "string" string: "border_scale_by";
+                                                 value "string" string: "middle";
+                                                 value "string" string: "scale_hint";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "normal";
+                                                 value "string" string: "tween";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "image";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\" 0.0;";
+                                       }
+                                       value "cursor_offset" int: 6;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "inherit";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "light";
+                                                 value "string" string: "perspective";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "color";
+                                             }
+                                         }
+                                         group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "alpha";
+                                                 value "string" string: "backface_cull";
+                                                 value "string" string: "on";
+                                                 value "string" string: "smooth";
+                                                 value "string" string: "perspective_on";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 1;
+                                                       value "string" string: "center";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 3;
+                                                       value "string" string: "x";
+                                                       value "string" string: "y";
+                                                       value "string" string: "z";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "rotation";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "map";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "source_clip";
+                                                 value "string" string: "source_visible";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "proxy";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" 0;";
+                                             }
+                                             value "cursor_offset" int: 4;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "int";
+                                                 value "string" string: "bool";
+                                             }
+                                          }
+                                       }
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" 0.0;";
+                                             }
+                                             value "cursor_offset" int: 6;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "double";
+                                             }
+                                          }
+                                       }
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" \"\";";
+                                             }
+                                             value "cursor_offset" int: 5;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "string";
+                                                 value "string" string: "choice";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "params";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "code";
+                                                 value "string" string: "source";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" \"\";";
+                                             }
+                                             value "cursor_offset" int: 5;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "data";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "filter";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "focal";
+                                                 value "string" string: "zplane";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "perspective";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "relative";
+                                                 value "string" string: "offset";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "to";
+                                                 value "string" string: "to_x";
+                                                 value "string" string: "to_y";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "rel1";
+                                           value "string" string: "rel2";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" \"\";";
+                                             }
+                                             value "cursor_offset" int: 5;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "base";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                            group "nodes" list {
+                                            }
+                                            group "txt" var_array {
+                                                count 1;
+                                                value "string" string: "%s: ;";
+                                            }
+                                            value "cursor_offset" int: 1;
+                                            value "line_back" int: 0;
+                                            group "name" var_array {
+                                               count 1;
+                                               value "string" string: "in";
+                                            }
+                                          }
+                                          group "lexem" struct {
+                                            group "nodes" list {
+                                            }
+                                            group "txt" var_array {
+                                                count 1;
+                                                value "string" string: "%s: \"\";";
+                                            }
+                                            value "cursor_offset" int: 2;
+                                            value "line_back" int: 0;
+                                            group "name" var_array {
+                                               count 1;
+                                               value "string" string: "after";
+                                            }
+                                          }
+                                          group "lexem" struct {
+                                            group "nodes" list {
+                                            }
+                                            group "txt" var_array {
+                                                count 1;
+                                                value "string" string: "%s: LINEAR ;";
+                                            }
+                                            value "cursor_offset" int: 1;
+                                            value "line_back" int: 0;
+                                            group "name" var_array {
+                                               count 1;
+                                               value "string" string: "transition";
+                                            }
+                                          }
+                                      }
+                                      group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "link";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: NONE;";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "homogeneous";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 3
+                                                value "string" string: "align";
+                                                value "string" string: "min";
+                                                value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "table";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 7;
+                                                 value "string" string: "align";
+                                                 value "string" string: "ellipsis";
+                                                 value "string" string: "fit";
+                                                 value "string" string: "max";
+                                                 value "string" string: "min";
+                                                 value "string" string: "size";
+                                                 value "string" string: "size_range";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 8;
+                                                 value "string" string: "domain";
+                                                 value "string" string: "font";
+                                                 value "string" string: "repch";
+                                                 value "string" string: "source";
+                                                 value "string" string: "style";
+                                                 value "string" string: "text";
+                                                 value "string" string: "text_class";
+                                                 value "string" string: "text_source";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "text";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: NONE;";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "limit";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 2;
+                                     value "string" string: "%s { state: \"\" 0.0;<br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 8;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                     count 1;
+                                     value "string" string: "description";
+                                 }
+                               }
+                               group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "threshold";
+                                           value "string" string: "events";
+                                           value "string" string: "confine";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "y";
+                                           value "string" string: "x";
+                                       }
+                                     }
+                                  }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "dragable";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: NONE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 2;
+                                    value "string" string: "entry_mode";
+                                    value "string" string: "mask_flags";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: DEFAULT;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "select_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 12;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "position";
+                                                      value "string" string: "spread";
+                                                      value "string" string: "span";
+                                                      value "string" string: "weight";
+                                                   }
+                                                 }
+                                              }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "table";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: IMAGE;";
+                                 }
+                                 value "cursor_offset" int: 0
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                     count 1;
+                                     value "string" string: "type";
+                                 }
+                              }
+                            }
+                            group "txt" var_array {
+                                count 2;
+                                value "string" string: "%s { name: \"\";<br/>";
+                                value "string" string: "}";
+                            }
+                            value "cursor_offset" int: 4;
+                            value "line_back" int: 1;
+                            group "name" var_array {
+                               count 1;
+                               value "string" string: "part";
+                            }
+                         }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "parts";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: STATE_SET \"\" 0.0;";
+                               }
+                               value "cursor_offset" int: 6;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "action";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               value "use_cntr" int: 0;
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\" \"\";";
+                               }
+                               value "cursor_offset" int: 5;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "filter";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "in";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\";";
+                               }
+                               value "cursor_offset" int: 2;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 5;
+                                  value "string" string: "after";
+                                  value "string" string: "name";
+                                  value "string" string: "source";
+                                  value "string" string: "signal";
+                                  value "string" string: "target";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: LINEAR ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "transition";
+                               }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 2;
+                              value "string" string: "%s { name: \"\";<br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 4;
+                          value "line_back" int: 1;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "program";
+                          }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "programs";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 2;
+                   value "string" string: "%s { name: \"\";<br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 4;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "group";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "collections";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 3;
+                        value "string" string: "color";
+                        value "string" string: "color2";
+                        value "string" string: "color3";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_class";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "color_classes";
+         }
+     }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 2;
+                 value "string" string: "file";
+                 value "string" string: "item";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "data";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\";";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 0;
+               group "name" var_array {
+                 count 1;
+                 value "string" string: "external";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "externals";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 1;
+                 value "string" string: "font";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "fonts";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: \"\" COMP;";
+               }
+               value "cursor_offset" int: 7
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "image";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                   }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" COMP;";
+                           }
+                           value "cursor_offset" int: 7;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "size";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2
+               value "line_back" int: 1
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "set";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         value "dot" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "images";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 2;
+                        value "string" string: "base";
+                        value "string" string: "name";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" \"\";";
+                     }
+                     value "cursor_offset" int: 5;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tag";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "style";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "styles";
+         }
+      }
+    }
+   group "txt" var_array {
+       count 1;
+       value "string" string: "%s";
+   }
+   value "cursor_offset" int: 0
+   value "line_back" int: 0;
+   group "name" var_array {
+      count 1;
+      value "string" string: "root";
+   }
+}
diff --git a/data/autocomp/3.0-autocomp.src b/data/autocomp/3.0-autocomp.src
new file mode 100644 (file)
index 0000000..85924f8
--- /dev/null
@@ -0,0 +1,2091 @@
+group "lexem" struct {
+   group "nodes" list {
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: ;"
+               }
+               value "cursor_offset" int: 1;
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "base_scale";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 3;
+                              value "string" string: "color";
+                              value "string" string: "color2";
+                              value "string" string: "color3";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "color_class";
+                     }
+                 }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_classes";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" COMP;";
+                     }
+                     value "cursor_offset" int: 7
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                         }
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\" COMP;";
+                                 }
+                                 value "cursor_offset" int: 7;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "image";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "size";
+                                 }
+                              }
+                           }
+                           group "txt" var_array {
+                               count 3;
+                               value "string" string: "%s {<br/>";
+                               value "string" string: "   <br/>";
+                               value "string" string: "}";
+                           }
+                           value "cursor_offset" int: 2
+                           value "line_back" int: 1;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "set";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               value "dot" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "images";
+               }
+            }
+
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                            }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" RAW;";
+                           }
+                           value "cursor_offset" int: 6;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "source";
+                           }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "sample";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tone";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "sounds";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" \"\";";
+                          }
+                          value "cursor_offset" int: 5
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                              count 1;
+                              value "string" string: "item";
+                          }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "data";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 2;
+                         value "string" string: "alias";
+                         value "string" string: "inherit";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                               count 2;
+                               value "string" string: "horizontal";
+                               value "string" string: "vertical";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "limits";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "script";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 4;
+                         value "string" string: "broadcast_signal";
+                         value "string" string: "max";
+                         value "string" string: "min";
+                         value "string" string: "script_only";
+                     }
+                  }
+                  group "lexem" struct {
+                    group "nodes" list {
+                       group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" COMP;";
+                          }
+                          value "cursor_offset" int: 7
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "image";
+                          }
+                       }
+                       group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                                group "nodes" list {
+                                }
+                                group "txt" var_array {
+                                    count 1;
+                                    value "string" string: "%s: \"\";";
+                                }
+                                value "cursor_offset" int: 2;
+                                value "line_back" int: 0;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "name";
+                                }
+                              }
+                             group "lexem" struct {
+                                group "nodes" list {
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: \"\" COMP;";
+                                      }
+                                      value "cursor_offset" int: 7;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "image";
+                                      }
+                                   }
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: ;";
+                                      }
+                                      value "cursor_offset" int: 1;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "size";
+                                      }
+                                   }
+                                }
+                                group "txt" var_array {
+                                    count 3;
+                                    value "string" string: "%s {<br/>";
+                                    value "string" string: "   <br/>";
+                                    value "string" string: "}";
+                                }
+                                value "cursor_offset" int: 2
+                                value "line_back" int: 1;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "image";
+                                }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 3;
+                              value "string" string: "%s {<br/>";
+                              value "string" string: "   <br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 2
+                          value "line_back" int: 1
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "set";
+                          }
+                       }
+                    }
+                    group "txt" var_array {
+                        count 3;
+                        value "string" string: "%s {<br/>";
+                        value "string" string: "   <br/>";
+                        value "string" string: "}";
+                    }
+                    value "cursor_offset" int: 2;
+                    value "line_back" int: 1;
+                    value "dot" int: 1;
+                    group "name" var_array {
+                       count 1;
+                       value "string" string: "images";
+                    }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 10;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "spread";
+                                                      value "string" string: "weight";
+                                                  }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "box";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: BEFORE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "cursor_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: SOFT_SHADOW;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "effect";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 8;
+                                    value "string" string: "access";
+                                    value "string" string: "anti_alias";
+                                    value "string" string: "ignore_flags";
+                                    value "string" string: "mouse_events";
+                                    value "string" string: "multiline";
+                                    value "string" string: "pointer_mode";
+                                    value "string" string: "repeat_events";
+                                    value "string" string: "scale";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\";";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 4;
+                                    value "string" string: "clip_to";
+                                    value "string" string: "insert_after";
+                                    value "string" string: "insert_before";
+                                    value "string" string: "source";
+                                 }
+                              }
+
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "clip_to";
+                                           value "string" string: "color_class";
+                                           value "string" string: "source";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 12;
+                                           value "string" string: "align";
+                                           value "string" string: "aspect";
+                                           value "string" string: "aspect_preference";
+                                           value "string" string: "color";
+                                           value "string" string: "color2";
+                                           value "string" string: "color3";
+                                           value "string" string: "fixed";
+                                           value "string" string: "max";
+                                           value "string" string: "min";
+                                           value "string" string: "minmul";
+                                           value "string" string: "step";
+                                           value "string" string: "visible";
+                                       }
+                                    }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "layout";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "align";
+                                                 value "string" string: "min";
+                                                 value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "box";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 2;
+                                                       value "string" string: "offset";
+                                                       value "string" string: "relative";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "origin";
+                                                 value "string" string: "size";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "smooth";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: SCALE;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "type";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "fill";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "border";
+                                                 value "string" string: "border_scale";
+                                                 value "string" string: "border_scale_by";
+                                                 value "string" string: "middle";
+                                                 value "string" string: "scale_hint";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "normal";
+                                                 value "string" string: "tween";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "image";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "inherit";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "light";
+                                                 value "string" string: "perspective";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "color";
+                                             }
+                                         }
+                                         group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "alpha";
+                                                 value "string" string: "backface_cull";
+                                                 value "string" string: "on";
+                                                 value "string" string: "smooth";
+                                                 value "string" string: "perspective_on";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 1;
+                                                       value "string" string: "center";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 3;
+                                                       value "string" string: "x";
+                                                       value "string" string: "y";
+                                                       value "string" string: "z";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "rotation";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "map";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "source_clip";
+                                                 value "string" string: "source_visible";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "proxy";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" 0;";
+                                             }
+                                             value "cursor_offset" int: 4;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "int";
+                                                 value "string" string: "bool";
+                                             }
+                                          }
+                                       }
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" 0.0;";
+                                             }
+                                             value "cursor_offset" int: 6;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "double";
+                                             }
+                                          }
+                                       }
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" \"\";";
+                                             }
+                                             value "cursor_offset" int: 5;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "string";
+                                                 value "string" string: "choice";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "params";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "code";
+                                                 value "string" string: "source";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" \"\";";
+                                             }
+                                             value "cursor_offset" int: 5;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "data";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "filter";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "focal";
+                                                 value "string" string: "zplane";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "perspective";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "relative";
+                                                 value "string" string: "offset";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "to";
+                                                 value "string" string: "to_x";
+                                                 value "string" string: "to_y";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "rel1";
+                                           value "string" string: "rel2";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" \"\";";
+                                             }
+                                             value "cursor_offset" int: 5;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "base";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                            group "nodes" list {
+                                            }
+                                            group "txt" var_array {
+                                                count 1;
+                                                value "string" string: "%s: ;";
+                                            }
+                                            value "cursor_offset" int: 1;
+                                            value "line_back" int: 0;
+                                            group "name" var_array {
+                                               count 1;
+                                               value "string" string: "in";
+                                            }
+                                          }
+                                          group "lexem" struct {
+                                            group "nodes" list {
+                                            }
+                                            group "txt" var_array {
+                                                count 1;
+                                                value "string" string: "%s: \"\";";
+                                            }
+                                            value "cursor_offset" int: 2;
+                                            value "line_back" int: 0;
+                                            group "name" var_array {
+                                               count 1;
+                                               value "string" string: "after";
+                                            }
+                                          }
+                                          group "lexem" struct {
+                                            group "nodes" list {
+                                            }
+                                            group "txt" var_array {
+                                                count 1;
+                                                value "string" string: "%s: LINEAR ;";
+                                            }
+                                            value "cursor_offset" int: 1;
+                                            value "line_back" int: 0;
+                                            group "name" var_array {
+                                               count 1;
+                                               value "string" string: "transition";
+                                            }
+                                          }
+                                      }
+                                      group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "link";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: NONE;";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "homogeneous";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 3
+                                                value "string" string: "align";
+                                                value "string" string: "min";
+                                                value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "table";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 7;
+                                                 value "string" string: "align";
+                                                 value "string" string: "ellipsis";
+                                                 value "string" string: "fit";
+                                                 value "string" string: "max";
+                                                 value "string" string: "min";
+                                                 value "string" string: "size";
+                                                 value "string" string: "size_range";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 8;
+                                                 value "string" string: "domain";
+                                                 value "string" string: "font";
+                                                 value "string" string: "repch";
+                                                 value "string" string: "source";
+                                                 value "string" string: "style";
+                                                 value "string" string: "text";
+                                                 value "string" string: "text_class";
+                                                 value "string" string: "text_source";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "text";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: NONE;";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "limit";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 2;
+                                     value "string" string: "%s { \"\";<br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 4;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                     count 1;
+                                     value "string" string: "desc";
+                                 }
+                               }
+                               group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "threshold";
+                                           value "string" string: "events";
+                                           value "string" string: "confine";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "y";
+                                           value "string" string: "x";
+                                       }
+                                     }
+                                  }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "dragable";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: NONE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 2;
+                                    value "string" string: "entry_mode";
+                                    value "string" string: "mask_flags";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: DEFAULT;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "select_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 12;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "position";
+                                                      value "string" string: "spread";
+                                                      value "string" string: "span";
+                                                      value "string" string: "weight";
+                                                   }
+                                                 }
+                                              }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "table";
+                                 }
+                              }
+                            }
+                            group "txt" var_array {
+                                count 2;
+                                value "string" string: "%s { \"\";<br/>";
+                                value "string" string: "}";
+                            }
+                            value "cursor_offset" int: 4;
+                            value "line_back" int: 1;
+                            group "name" var_array {
+                               count 12;
+                               value "string" string: "image";
+                               value "string" string: "group";
+                               value "string" string: "swallow";
+                               value "string" string: "external";
+                               value "string" string: "rect";
+                               value "string" string: "spacer";
+                               value "string" string: "proxy";
+                               value "string" string: "box";
+                               value "string" string: "table";
+                               value "string" string: "text";
+                               value "string" string: "textblock";
+                               value "string" string: "part";
+                            }
+                         }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "parts";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: STATE_SET \"\";";
+                               }
+                               value "cursor_offset" int: 2;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "action";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               value "use_cntr" int: 0;
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\" \"\";";
+                               }
+                               value "cursor_offset" int: 5;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "filter";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "in";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\";";
+                               }
+                               value "cursor_offset" int: 2;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 5;
+                                  value "string" string: "after";
+                                  value "string" string: "name";
+                                  value "string" string: "source";
+                                  value "string" string: "signal";
+                                  value "string" string: "target";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: LINEAR ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "transition";
+                               }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 3;
+                              value "string" string: "%s {<br/>";
+                              value "string" string: "   <br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 2;
+                          value "line_back" int: 1;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "program";
+                          }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "programs";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 2;
+                   value "string" string: "%s { \"\";<br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 4;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "group";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "collections";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 3;
+                        value "string" string: "color";
+                        value "string" string: "color2";
+                        value "string" string: "color3";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_class";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "color_classes";
+         }
+     }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 2;
+                 value "string" string: "file";
+                 value "string" string: "item";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "data";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\";";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 0;
+               group "name" var_array {
+                 count 1;
+                 value "string" string: "external";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "externals";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 1;
+                 value "string" string: "font";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "fonts";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: \"\" COMP;";
+               }
+               value "cursor_offset" int: 7
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "image";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                   }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" COMP;";
+                           }
+                           value "cursor_offset" int: 7;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "size";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2
+               value "line_back" int: 1
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "set";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         value "dot" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "images";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 2;
+                        value "string" string: "base";
+                        value "string" string: "name";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" \"\";";
+                     }
+                     value "cursor_offset" int: 5;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tag";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "style";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "styles";
+         }
+      }
+    }
+   group "txt" var_array {
+       count 1;
+       value "string" string: "%s";
+   }
+   value "cursor_offset" int: 0
+   value "line_back" int: 0;
+   group "name" var_array {
+      count 1;
+      value "string" string: "root";
+   }
+}
diff --git a/data/autocomp/Makefile.am b/data/autocomp/Makefile.am
new file mode 100644 (file)
index 0000000..2fd7d99
--- /dev/null
@@ -0,0 +1,51 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EET_EET = @eet_eet@
+
+EXTRA_DIST = autocomp.src \
+                        2.3-autocomp.src \
+                        2.3.1-autocomp.src \
+                        2.3.2-autocomp.src \
+                        2.4-autocomp.src \
+                        3.0-autocomp.src
+
+filesdir = $(datadir)/$(PACKAGE)/autocomp
+files_DATA = autocomp.eet \
+                        2.3-autocomp.eet \
+                        2.3.1-autocomp.eet \
+                        2.3.2-autocomp.eet \
+                        2.4-autocomp.eet \
+                        3.0-autocomp.eet
+
+autocomp.eet: autocomp.src
+       $(EET_EET) -e \
+       $(top_builddir)/data/autocomp/$@ node \
+       $< 1
+
+2.3-autocomp.eet: 2.3-autocomp.src
+       $(EET_EET) -e \
+       $(top_builddir)/data/autocomp/$@ node \
+       $< 1
+
+2.3.1-autocomp.eet: 2.3.1-autocomp.src
+       $(EET_EET) -e \
+       $(top_builddir)/data/autocomp/$@ node \
+       $< 1
+
+2.3.2-autocomp.eet: 2.3.2-autocomp.src
+       $(EET_EET) -e \
+       $(top_builddir)/data/autocomp/$@ node \
+       $< 1
+
+2.4-autocomp.eet: 2.4-autocomp.src
+       $(EET_EET) -e \
+       $(top_builddir)/data/autocomp/$@ node \
+       $< 1
+
+3.0-autocomp.eet: 3.0-autocomp.src
+       $(EET_EET) -e \
+       $(top_builddir)/data/autocomp/$@ node \
+       $< 1
+
+clean-local:
+       rm -rf *.eet *~
diff --git a/data/autocomp/autocomp.src b/data/autocomp/autocomp.src
new file mode 100644 (file)
index 0000000..85924f8
--- /dev/null
@@ -0,0 +1,2091 @@
+group "lexem" struct {
+   group "nodes" list {
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: ;"
+               }
+               value "cursor_offset" int: 1;
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "base_scale";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 3;
+                              value "string" string: "color";
+                              value "string" string: "color2";
+                              value "string" string: "color3";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "color_class";
+                     }
+                 }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_classes";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" COMP;";
+                     }
+                     value "cursor_offset" int: 7
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                         }
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\" COMP;";
+                                 }
+                                 value "cursor_offset" int: 7;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "image";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "size";
+                                 }
+                              }
+                           }
+                           group "txt" var_array {
+                               count 3;
+                               value "string" string: "%s {<br/>";
+                               value "string" string: "   <br/>";
+                               value "string" string: "}";
+                           }
+                           value "cursor_offset" int: 2
+                           value "line_back" int: 1;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "set";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               value "dot" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "images";
+               }
+            }
+
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                            }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" RAW;";
+                           }
+                           value "cursor_offset" int: 6;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "name";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "source";
+                           }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "sample";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tone";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "sounds";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" \"\";";
+                          }
+                          value "cursor_offset" int: 5
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                              count 1;
+                              value "string" string: "item";
+                          }
+                       }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "data";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 2;
+                         value "string" string: "alias";
+                         value "string" string: "inherit";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\";";
+                           }
+                           value "cursor_offset" int: 2;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                               count 2;
+                               value "string" string: "horizontal";
+                               value "string" string: "vertical";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "limits";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                         count 1;
+                         value "string" string: "script";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                         count 4;
+                         value "string" string: "broadcast_signal";
+                         value "string" string: "max";
+                         value "string" string: "min";
+                         value "string" string: "script_only";
+                     }
+                  }
+                  group "lexem" struct {
+                    group "nodes" list {
+                       group "lexem" struct {
+                          group "nodes" list {
+                          }
+                          group "txt" var_array {
+                              count 1;
+                              value "string" string: "%s: \"\" COMP;";
+                          }
+                          value "cursor_offset" int: 7
+                          value "line_back" int: 0;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "image";
+                          }
+                       }
+                       group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                                group "nodes" list {
+                                }
+                                group "txt" var_array {
+                                    count 1;
+                                    value "string" string: "%s: \"\";";
+                                }
+                                value "cursor_offset" int: 2;
+                                value "line_back" int: 0;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "name";
+                                }
+                              }
+                             group "lexem" struct {
+                                group "nodes" list {
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: \"\" COMP;";
+                                      }
+                                      value "cursor_offset" int: 7;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "image";
+                                      }
+                                   }
+                                   group "lexem" struct {
+                                      group "nodes" list {
+                                      }
+                                      group "txt" var_array {
+                                          count 1;
+                                          value "string" string: "%s: ;";
+                                      }
+                                      value "cursor_offset" int: 1;
+                                      value "line_back" int: 0;
+                                      group "name" var_array {
+                                         count 1;
+                                         value "string" string: "size";
+                                      }
+                                   }
+                                }
+                                group "txt" var_array {
+                                    count 3;
+                                    value "string" string: "%s {<br/>";
+                                    value "string" string: "   <br/>";
+                                    value "string" string: "}";
+                                }
+                                value "cursor_offset" int: 2
+                                value "line_back" int: 1;
+                                group "name" var_array {
+                                   count 1;
+                                   value "string" string: "image";
+                                }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 3;
+                              value "string" string: "%s {<br/>";
+                              value "string" string: "   <br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 2
+                          value "line_back" int: 1
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "set";
+                          }
+                       }
+                    }
+                    group "txt" var_array {
+                        count 3;
+                        value "string" string: "%s {<br/>";
+                        value "string" string: "   <br/>";
+                        value "string" string: "}";
+                    }
+                    value "cursor_offset" int: 2;
+                    value "line_back" int: 1;
+                    value "dot" int: 1;
+                    group "name" var_array {
+                       count 1;
+                       value "string" string: "images";
+                    }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 10;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "spread";
+                                                      value "string" string: "weight";
+                                                  }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "box";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: BEFORE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "cursor_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: SOFT_SHADOW;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "effect";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: ;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 8;
+                                    value "string" string: "access";
+                                    value "string" string: "anti_alias";
+                                    value "string" string: "ignore_flags";
+                                    value "string" string: "mouse_events";
+                                    value "string" string: "multiline";
+                                    value "string" string: "pointer_mode";
+                                    value "string" string: "repeat_events";
+                                    value "string" string: "scale";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: \"\";";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 4;
+                                    value "string" string: "clip_to";
+                                    value "string" string: "insert_after";
+                                    value "string" string: "insert_before";
+                                    value "string" string: "source";
+                                 }
+                              }
+
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "clip_to";
+                                           value "string" string: "color_class";
+                                           value "string" string: "source";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 12;
+                                           value "string" string: "align";
+                                           value "string" string: "aspect";
+                                           value "string" string: "aspect_preference";
+                                           value "string" string: "color";
+                                           value "string" string: "color2";
+                                           value "string" string: "color3";
+                                           value "string" string: "fixed";
+                                           value "string" string: "max";
+                                           value "string" string: "min";
+                                           value "string" string: "minmul";
+                                           value "string" string: "step";
+                                           value "string" string: "visible";
+                                       }
+                                    }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "layout";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "align";
+                                                 value "string" string: "min";
+                                                 value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "box";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 2;
+                                                       value "string" string: "offset";
+                                                       value "string" string: "relative";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "origin";
+                                                 value "string" string: "size";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "smooth";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: SCALE;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "type";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "fill";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "border";
+                                                 value "string" string: "border_scale";
+                                                 value "string" string: "border_scale_by";
+                                                 value "string" string: "middle";
+                                                 value "string" string: "scale_hint";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "normal";
+                                                 value "string" string: "tween";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "image";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "inherit";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "light";
+                                                 value "string" string: "perspective";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "color";
+                                             }
+                                         }
+                                         group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 5;
+                                                 value "string" string: "alpha";
+                                                 value "string" string: "backface_cull";
+                                                 value "string" string: "on";
+                                                 value "string" string: "smooth";
+                                                 value "string" string: "perspective_on";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 1;
+                                                       value "string" string: "center";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                       count 3;
+                                                       value "string" string: "x";
+                                                       value "string" string: "y";
+                                                       value "string" string: "z";
+                                                   }
+                                                }
+                                             }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "rotation";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "map";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "source_clip";
+                                                 value "string" string: "source_visible";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "proxy";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" 0;";
+                                             }
+                                             value "cursor_offset" int: 4;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "int";
+                                                 value "string" string: "bool";
+                                             }
+                                          }
+                                       }
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" 0.0;";
+                                             }
+                                             value "cursor_offset" int: 6;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "double";
+                                             }
+                                          }
+                                       }
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" \"\";";
+                                             }
+                                             value "cursor_offset" int: 5;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "string";
+                                                 value "string" string: "choice";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "params";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "code";
+                                                 value "string" string: "source";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" \"\";";
+                                             }
+                                             value "cursor_offset" int: 5;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "data";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "filter";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "focal";
+                                                 value "string" string: "zplane";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "perspective";
+                                       }
+                                   }
+                                   group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 2;
+                                                 value "string" string: "relative";
+                                                 value "string" string: "offset";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 3;
+                                                 value "string" string: "to";
+                                                 value "string" string: "to_x";
+                                                 value "string" string: "to_y";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "rel1";
+                                           value "string" string: "rel2";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\" \"\";";
+                                             }
+                                             value "cursor_offset" int: 5;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 1;
+                                                 value "string" string: "base";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                            group "nodes" list {
+                                            }
+                                            group "txt" var_array {
+                                                count 1;
+                                                value "string" string: "%s: ;";
+                                            }
+                                            value "cursor_offset" int: 1;
+                                            value "line_back" int: 0;
+                                            group "name" var_array {
+                                               count 1;
+                                               value "string" string: "in";
+                                            }
+                                          }
+                                          group "lexem" struct {
+                                            group "nodes" list {
+                                            }
+                                            group "txt" var_array {
+                                                count 1;
+                                                value "string" string: "%s: \"\";";
+                                            }
+                                            value "cursor_offset" int: 2;
+                                            value "line_back" int: 0;
+                                            group "name" var_array {
+                                               count 1;
+                                               value "string" string: "after";
+                                            }
+                                          }
+                                          group "lexem" struct {
+                                            group "nodes" list {
+                                            }
+                                            group "txt" var_array {
+                                                count 1;
+                                                value "string" string: "%s: LINEAR ;";
+                                            }
+                                            value "cursor_offset" int: 1;
+                                            value "line_back" int: 0;
+                                            group "name" var_array {
+                                               count 1;
+                                               value "string" string: "transition";
+                                            }
+                                          }
+                                      }
+                                      group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "link";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: NONE;";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "homogeneous";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                count 3
+                                                value "string" string: "align";
+                                                value "string" string: "min";
+                                                value "string" string: "padding";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "table";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: ;";
+                                             }
+                                             value "cursor_offset" int: 1;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 7;
+                                                 value "string" string: "align";
+                                                 value "string" string: "ellipsis";
+                                                 value "string" string: "fit";
+                                                 value "string" string: "max";
+                                                 value "string" string: "min";
+                                                 value "string" string: "size";
+                                                 value "string" string: "size_range";
+                                             }
+                                          }
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                             }
+                                             group "txt" var_array {
+                                                 count 1;
+                                                 value "string" string: "%s: \"\";";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 0;
+                                             group "name" var_array {
+                                                 count 8;
+                                                 value "string" string: "domain";
+                                                 value "string" string: "font";
+                                                 value "string" string: "repch";
+                                                 value "string" string: "source";
+                                                 value "string" string: "style";
+                                                 value "string" string: "text";
+                                                 value "string" string: "text_class";
+                                                 value "string" string: "text_source";
+                                             }
+                                          }
+                                       }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       value "dot" int: 1;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "text";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: NONE;";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 1;
+                                           value "string" string: "limit";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 2;
+                                     value "string" string: "%s { \"\";<br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 4;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                     count 1;
+                                     value "string" string: "desc";
+                                 }
+                               }
+                               group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: \"\";";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 3;
+                                           value "string" string: "threshold";
+                                           value "string" string: "events";
+                                           value "string" string: "confine";
+                                       }
+                                    }
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                       }
+                                       group "txt" var_array {
+                                           count 1;
+                                           value "string" string: "%s: ;";
+                                       }
+                                       value "cursor_offset" int: 1;
+                                       value "line_back" int: 0;
+                                       group "name" var_array {
+                                           count 2;
+                                           value "string" string: "y";
+                                           value "string" string: "x";
+                                       }
+                                     }
+                                  }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "dragable";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: NONE;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 2;
+                                    value "string" string: "entry_mode";
+                                    value "string" string: "mask_flags";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                 }
+                                 group "txt" var_array {
+                                     count 1;
+                                     value "string" string: "%s: DEFAULT;";
+                                 }
+                                 value "cursor_offset" int: 1;
+                                 value "line_back" int: 0;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "select_mode";
+                                 }
+                              }
+                              group "lexem" struct {
+                                 group "nodes" list {
+                                    group "lexem" struct {
+                                       group "nodes" list {
+                                          group "lexem" struct {
+                                             group "nodes" list {
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: \"\";";
+                                                   }
+                                                   value "cursor_offset" int: 2;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 2;
+                                                      value "string" string: "name";
+                                                      value "string" string: "source";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: GROUP;";
+                                                   }
+                                                   value "cursor_offset" int: 0;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 1;
+                                                      value "string" string: "type";
+                                                   }
+                                                }
+                                                group "lexem" struct {
+                                                   group "nodes" list {
+                                                   }
+                                                   group "txt" var_array {
+                                                       count 1;
+                                                       value "string" string: "%s: ;";
+                                                   }
+                                                   value "cursor_offset" int: 1;
+                                                   value "line_back" int: 0;
+                                                   group "name" var_array {
+                                                      count 12;
+                                                      value "string" string: "align";
+                                                      value "string" string: "aspect";
+                                                      value "string" string: "aspect_mode";
+                                                      value "string" string: "max";
+                                                      value "string" string: "min";
+                                                      value "string" string: "options";
+                                                      value "string" string: "padding";
+                                                      value "string" string: "prefer";
+                                                      value "string" string: "position";
+                                                      value "string" string: "spread";
+                                                      value "string" string: "span";
+                                                      value "string" string: "weight";
+                                                   }
+                                                 }
+                                              }
+                                             group "txt" var_array {
+                                                 count 3;
+                                                 value "string" string: "%s {<br/>";
+                                                 value "string" string: "   <br/>";
+                                                 value "string" string: "}";
+                                             }
+                                             value "cursor_offset" int: 2;
+                                             value "line_back" int: 1;
+                                             group "name" var_array {
+                                                count 1;
+                                                value "string" string: "item";
+                                             }
+                                          }
+                                        }
+                                       group "txt" var_array {
+                                           count 3;
+                                           value "string" string: "%s {<br/>";
+                                           value "string" string: "   <br/>";
+                                           value "string" string: "}";
+                                       }
+                                       value "cursor_offset" int: 2;
+                                       value "line_back" int: 1;
+                                       group "name" var_array {
+                                          count 1;
+                                          value "string" string: "items";
+                                       }
+                                    }
+                                 }
+                                 group "txt" var_array {
+                                     count 3;
+                                     value "string" string: "%s {<br/>";
+                                     value "string" string: "   <br/>";
+                                     value "string" string: "}";
+                                 }
+                                 value "cursor_offset" int: 2;
+                                 value "line_back" int: 1;
+                                 group "name" var_array {
+                                    count 1;
+                                    value "string" string: "table";
+                                 }
+                              }
+                            }
+                            group "txt" var_array {
+                                count 2;
+                                value "string" string: "%s { \"\";<br/>";
+                                value "string" string: "}";
+                            }
+                            value "cursor_offset" int: 4;
+                            value "line_back" int: 1;
+                            group "name" var_array {
+                               count 12;
+                               value "string" string: "image";
+                               value "string" string: "group";
+                               value "string" string: "swallow";
+                               value "string" string: "external";
+                               value "string" string: "rect";
+                               value "string" string: "spacer";
+                               value "string" string: "proxy";
+                               value "string" string: "box";
+                               value "string" string: "table";
+                               value "string" string: "text";
+                               value "string" string: "textblock";
+                               value "string" string: "part";
+                            }
+                         }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "parts";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                          group "nodes" list {
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: STATE_SET \"\";";
+                               }
+                               value "cursor_offset" int: 2;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "action";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               value "use_cntr" int: 0;
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\" \"\";";
+                               }
+                               value "cursor_offset" int: 5;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "filter";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "in";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: \"\";";
+                               }
+                               value "cursor_offset" int: 2;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 5;
+                                  value "string" string: "after";
+                                  value "string" string: "name";
+                                  value "string" string: "source";
+                                  value "string" string: "signal";
+                                  value "string" string: "target";
+                               }
+                             }
+                             group "lexem" struct {
+                               group "nodes" list {
+                               }
+                               group "txt" var_array {
+                                   count 1;
+                                   value "string" string: "%s: LINEAR ;";
+                               }
+                               value "cursor_offset" int: 1;
+                               value "line_back" int: 0;
+                               group "name" var_array {
+                                  count 1;
+                                  value "string" string: "transition";
+                               }
+                             }
+                          }
+                          group "txt" var_array {
+                              count 3;
+                              value "string" string: "%s {<br/>";
+                              value "string" string: "   <br/>";
+                              value "string" string: "}";
+                          }
+                          value "cursor_offset" int: 2;
+                          value "line_back" int: 1;
+                          group "name" var_array {
+                             count 1;
+                             value "string" string: "program";
+                          }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "programs";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 2;
+                   value "string" string: "%s { \"\";<br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 4;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "group";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "collections";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1
+                         value "string" string: "%s: ;";
+                     }
+                     value "cursor_offset" int: 1;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 3;
+                        value "string" string: "color";
+                        value "string" string: "color2";
+                        value "string" string: "color3";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "color_class";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "color_classes";
+         }
+     }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 2;
+                 value "string" string: "file";
+                 value "string" string: "item";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "data";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\";";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 0;
+               group "name" var_array {
+                 count 1;
+                 value "string" string: "external";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "externals";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+              group "nodes" list {
+              }
+              group "txt" var_array {
+                  count 1;
+                  value "string" string: "%s: \"\" \"\";";
+              }
+              value "cursor_offset" int: 5
+              value "line_back" int: 0;
+              group "name" var_array {
+                 count 1;
+                 value "string" string: "font";
+              }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "fonts";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+               }
+               group "txt" var_array {
+                   count 1;
+                   value "string" string: "%s: \"\" COMP;";
+               }
+               value "cursor_offset" int: 7
+               value "line_back" int: 0;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "image";
+               }
+            }
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "name";
+                     }
+                   }
+                  group "lexem" struct {
+                     group "nodes" list {
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: \"\" COMP;";
+                           }
+                           value "cursor_offset" int: 7;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "image";
+                           }
+                        }
+                        group "lexem" struct {
+                           group "nodes" list {
+                           }
+                           group "txt" var_array {
+                               count 1;
+                               value "string" string: "%s: ;";
+                           }
+                           value "cursor_offset" int: 1;
+                           value "line_back" int: 0;
+                           group "name" var_array {
+                              count 1;
+                              value "string" string: "size";
+                           }
+                        }
+                     }
+                     group "txt" var_array {
+                         count 3;
+                         value "string" string: "%s {<br/>";
+                         value "string" string: "   <br/>";
+                         value "string" string: "}";
+                     }
+                     value "cursor_offset" int: 2
+                     value "line_back" int: 1;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "image";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2
+               value "line_back" int: 1
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "set";
+               }
+            }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         value "dot" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "images";
+         }
+      }
+      group "lexem" struct {
+         group "nodes" list {
+            group "lexem" struct {
+               group "nodes" list {
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\";";
+                     }
+                     value "cursor_offset" int: 2;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 2;
+                        value "string" string: "base";
+                        value "string" string: "name";
+                     }
+                  }
+                  group "lexem" struct {
+                     group "nodes" list {
+                     }
+                     group "txt" var_array {
+                         count 1;
+                         value "string" string: "%s: \"\" \"\";";
+                     }
+                     value "cursor_offset" int: 5;
+                     value "line_back" int: 0;
+                     group "name" var_array {
+                        count 1;
+                        value "string" string: "tag";
+                     }
+                  }
+               }
+               group "txt" var_array {
+                   count 3;
+                   value "string" string: "%s {<br/>";
+                   value "string" string: "   <br/>";
+                   value "string" string: "}";
+               }
+               value "cursor_offset" int: 2;
+               value "line_back" int: 1;
+               group "name" var_array {
+                  count 1;
+                  value "string" string: "style";
+               }
+           }
+         }
+         group "txt" var_array {
+             count 3;
+             value "string" string: "%s {<br/>";
+             value "string" string: "   <br/>";
+             value "string" string: "}";
+         }
+         value "cursor_offset" int: 2;
+         value "line_back" int: 1;
+         group "name" var_array {
+            count 1;
+            value "string" string: "styles";
+         }
+      }
+    }
+   group "txt" var_array {
+       count 1;
+       value "string" string: "%s";
+   }
+   value "cursor_offset" int: 0
+   value "line_back" int: 0;
+   group "name" var_array {
+      count 1;
+      value "string" string: "root";
+   }
+}
diff --git a/data/color/Makefile.am b/data/color/Makefile.am
new file mode 100644 (file)
index 0000000..f8eb5be
--- /dev/null
@@ -0,0 +1,22 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EET_EET = @eet_eet@
+
+EXTRA_DIST = \
+edc.src \
+syntax_template.dat \
+syntax_template_old.dat
+
+filesdir = $(datadir)/$(PACKAGE)/color
+files_DATA = \
+edc.eet \
+syntax_template.dat \
+syntax_template_old.dat
+
+%.eet: %.src
+       $(EET_EET) -e \
+       $(top_builddir)/data/color/$@ color \
+       $< 1
+
+clean-local:
+       rm -rf *.eet *~
diff --git a/data/color/edc.src b/data/color/edc.src
new file mode 100644 (file)
index 0000000..a88cbb1
--- /dev/null
@@ -0,0 +1,291 @@
+group "syntax_color_group" struct {
+   value "string" string: "6D6D6D";
+   value "comment" string: "078601";
+   value "macro" string: "FF4242";
+   value "count" string: "6";
+   group "colors" array {
+      count 6;
+      group "color" struct {
+         value "val" string: "A3A3A3";
+         group "keys" list {
+            value "key" string: "{";
+            value "key" string: "}";
+            value "key" string: "[";
+            value "key" string: "]";
+            value "key" string: ";";
+            value "key" string: ":";
+            value "key" string: ".";
+            value "key" string: "(";
+            value "key" string: ")";
+            value "key" string: "!";
+            value "key" string: "=";
+            value "key" string: "&amp;";
+            value "key" string: "&gt;";
+            value "key" string: "&lt;";
+            value "key" string: "|";
+            value "key" string: "\\";
+         }
+      }
+      group "color" struct {
+         value "val" string: "2062EA";
+         group "keys" list {
+            value "key" string: "box";
+            value "key" string: "collections";
+            value "key" string: "color_class ";
+            value "key" string: "color_classes";
+            value "key" string: "data";
+            value "key" string: "description";
+            value "key" string: "desc";
+            value "key" string: "dragable";
+            value "key" string: "externals";
+            value "key" string: "external";
+            value "key" string: "fill";
+            value "key" string: "fonts";
+            value "key" string: "gradient";
+            value "key" string: "group";
+            value "key" string: "images";
+            value "key" string: "image ";
+            value "key" string: "image.";
+            value "key" string: "items";
+            value "key" string: "item";
+            value "key" string: "map";
+            value "key" string: "origin";
+            value "key" string: "params";
+            value "key" string: "param";
+            value "key" string: "parts";
+            value "key" string: "part";
+            value "key" string: "programs";
+            value "key" string: "program";
+            value "key" string: "proxy";
+            value "key" string: "perspective ";
+            value "key" string: "rect";
+            value "key" string: "rel1";
+            value "key" string: "rel2";
+            value "key" string: "rotation";
+            value "key" string: "sample";
+            value "key" string: "script";
+            value "key" string: "set.";
+            value "key" string: "set ";
+            value "key" string: "sounds";
+            value "key" string: "spacer";
+            value "key" string: "styles";
+            value "key" string: "swallow";
+            value "key" string: "size ";
+            value "key" string: "table";
+            value "key" string: "text ";
+            value "key" string: "text.";
+            value "key" string: "textblock";
+            value "key" string: "zoom";
+         }
+      }
+      group "color" struct {
+         value "val" string: "5200DB";
+         group "keys" list {
+            value "key" string: "action";
+            value "key" string: "after";
+            value "key" string: "alias";
+            value "key" string: "align";
+            value "key" string: "anti_alias";
+            value "key" string: "aspect_mode";
+            value "key" string: "aspect_preference";
+            value "key" string: "aspect";
+            value "key" string: "backface_cull";
+            value "key" string: "base_scale";
+            value "key" string: "base";
+            value "key" string: "border_scale";
+            value "key" string: "border";
+            value "key" string: "center";
+            value "key" string: "clip_to";
+            value "key" string: "color2";
+            value "key" string: "color3";
+            value "key" string: "color_class:";
+            value "key" string: "color";
+            value "key" string: "confine";
+            value "key" string: "cursor_mode";
+            value "key" string: "effect";
+            value "key" string: "ellipsis";
+            value "key" string: "entry_mode";
+            value "key" string: "fixed";
+            value "key" string: "focal";
+            value "key" string: "font";
+            value "key" string: "ignore_flags";
+            value "key" string: "image";
+            value "key" string: "inherit";
+            value "key" string: "insert_after";
+            value "key" string: "insert_before";
+            value "key" string: "in";
+            value "key" string: "layout";
+            value "key" string: "max";
+            value "key" string: "middle";
+            value "key" string: "min";
+            value "key" string: "mouse_events";
+            value "key" string: "multiline";
+            value "key" string: "name";
+            value "key" string: "nomouse";
+            value "key" string: "no_render";
+            value "key" string: "norender";
+            value "key" string: "normal";
+            value "key" string: "offset";
+            value "key" string: "on";
+            value "key" string: "padding:";
+            value "key" string: "perspective:";
+            value "key" string: "perspective_on";
+            value "key" string: "position";
+            value "key" string: "prefer";
+            value "key" string: "relative";
+            value "key" string: "render";
+            value "key" string: "repch";
+            value "key" string: "repeat_events";
+            value "key" string: "scale";
+            value "key" string: "select_mode";
+            value "key" string: "signal";
+            value "key" string: "span";
+            value "key" string: "spread";
+            value "key" string: "state";
+            value "key" string: "string";
+            value "key" string: "style";
+            value "key" string: "smooth";
+            value "key" string: "source";
+            value "key" string: "size";
+            value "key" string: "tag";
+            value "key" string: "target";
+            value "key" string: "text:";
+            value "key" string: "text_class";
+            value "key" string: "text_source";
+            value "key" string: "to_x";
+            value "key" string: "to_y";
+            value "key" string: "to";
+            value "key" string: "transition";
+            value "key" string: "type";
+            value "key" string: "tween";
+            value "key" string: "visible";
+            value "key" string: "weight";
+            value "key" string: "x:";
+            value "key" string: "y:";
+            value "key" string: "z:";
+            value "key" string: "zplane";
+         }
+      }
+      group "color" struct {
+         value "val" string: "D130C0";
+         group "keys" list {
+            value "key" string: "ACCELERATE_FACTOR";
+            value "key" string: "ACCELERATE";
+            value "key" string: "ACCEL_FAC";
+            value "key" string: "ACTION_STOP";
+            value "key" string: "BEFORE";
+            value "key" string: "BOTH";
+            value "key" string: "BOTTOM";
+            value "key" string: "BOUNCE";
+            value "key" string: "BOX";
+            value "key" string: "CUBIC_BEZIER";
+            value "key" string: "COMP";
+            value "key" string: "CURRENT";
+            value "key" string: "DECELERATE_FACTOR";
+            value "key" string: "DECELERATE";
+            value "key" string: "DECEL_FAC";
+            value "key" string: "DEFAULT";
+            value "key" string: "DIVISOR_INTERP";
+            value "key" string: "DIVIS";
+            value "key" string: "EDITABLE";
+            value "key" string: "EXPLICIT";
+            value "key" string: "EXTERNAL";
+            value "key" string: "FAR_SHADOW";
+            value "key" string: "FAR_SOFT_SHADOW";
+            value "key" string: "FOCUS_SET";
+            value "key" string: "GLOW";
+            value "key" string: "GRADIENT";
+            value "key" string: "GROUP";
+            value "key" string: "HORIZONTAL";
+            value "key" string: "IMAGE";
+            value "key" string: "LINEAR";
+            value "key" string: "LIN";
+            value "key" string: "LOSSY";
+            value "key" string: "LOSSY_ETC1";
+            value "key" string: "LOSSY_ETC2";
+            value "key" string: "MSG_FLOAT_SET";
+            value "key" string: "MSG_FLOAT";
+            value "key" string: "MSG_INT_FLOAT_SET";
+            value "key" string: "MSG_INT_FLOAT";
+            value "key" string: "MSG_INT_SET";
+            value "key" string: "MSG_INT";
+            value "key" string: "MSG_STRING_INT_SET";
+            value "key" string: "MSG_STRING_INT";
+            value "key" string: "MSG_STRING_SET";
+            value "key" string: "MSG_STRING";
+            value "key" string: "NEITHER";
+            value "key" string: "NONE";
+            value "key" string: "ON_HOLD";
+            value "key" string: "OUTLINE_SOFT_SHADOW";
+            value "key" string: "OUTLINE_SHADOW";
+            value "key" string: "OUTLINE";
+            value "key" string: "PART";
+            value "key" string: "PASSWORD";
+            value "key" string: "PLAIN";
+            value "key" string: "PLAY_SAMPLE";
+            value "key" string: "PROGRAM";
+            value "key" string: "PROXY";
+            value "key" string: "RAW";
+            value "key" string: "RECT";
+            value "key" string: "SHADOW";
+            value "key" string: "SIGNAL_EMIT";
+            value "key" string: "SINUSOIDAL_FACTOR";
+            value "key" string: "SINUSOIDAL";
+            value "key" string: "SIN_FAC";
+            value "key" string: "SIN";
+            value "key" string: "SOFT_OUTLINE";
+            value "key" string: "SOFT_SHADOW";
+            value "key" string: "SOLID";
+            value "key" string: "SPACER";
+            value "key" string: "SPRING";
+            value "key" string: "SOURCE";
+            value "key" string: "STATE_SET";
+            value "key" string: "SWALLOW";
+            value "key" string: "TABLE";
+            value "key" string: "TEXTBLOCK";
+            value "key" string: "TEXT";
+            value "key" string: "USER";
+            value "key" string: "VERTICAL";
+         }
+      }
+      group "color" struct {
+         value "val" string: "2DB4C8";
+         group "keys" list {
+            value "key" string: "anim";
+            value "key" string: "cancel_anim";
+            value "key" string: "cancel_timer";
+            value "key" string: "custom_state";
+            value "key" string: "emit";
+            value "key" string: "getarg";
+            value "key" string: "get_drag";
+            value "key" string: "get_float";
+            value "key" string: "get_geometry";
+            value "key" string: "get_int";
+            value "key" string: "get_state_val";
+            value "key" string: "get_state";
+            value "key" string: "get_text";
+            value "key" string: "round";
+            value "key" string: "run_program";
+            value "key" string: "set_float";
+            value "key" string: "set_int";
+            value "key" string: "set_state_val";
+            value "key" string: "set_state";
+            value "key" string: "set_text";
+            value "key" string: "set_tween_state";
+            value "key" string: "snprintf";
+            value "key" string: "strcmp";
+            value "key" string: "timer";
+         }
+      }
+      group "color" struct {
+         value "val" string: "C88800";
+         group "keys" list {
+            value "key" string: "else";
+            value "key" string: "if";
+            value "key" string: "new";
+            value "key" string: "public";
+            value "key" string: "return";
+         }
+      }
+   }
+}
diff --git a/data/color/syntax_template.dat b/data/color/syntax_template.dat
new file mode 100644 (file)
index 0000000..e9ce6c2
--- /dev/null
@@ -0,0 +1 @@
+<font_size=%3d><color=#%s>//comment</color><br/><color=#%s>#define RECT_COLOR</color> 0 136 170 255<br/><color=#%s>rect</color> <color=#%s>{</color> <color=#%s>&quot;part_name&quot;</color><color=#%s>;</color><br/>   <color=#%s>desc</color> <color=#%s>{</color> <color=#%s>&quot;default&quot;</color> <color=#%s>;</color><br/>      <color=#%s>rel1</color><color=#%s>.</color><color=#%s>relative</color><color=#%s>:</color> 0.0 0.0<color=#%s>;</color><br/>      <color=#%s>rel2</color><color=#%s>.</color><color=#%s>relative</color><color=#%s>:</color> 1.0 1.0<color=#%s>;</color><br/>      <color=#%s>color</color><color=#%s>:</color> <color=#%s>RECT_COLOR</color><color=#%s>;</color><br/>   <color=#%s>}</color><br/><color=#%s>}</color><br/><color=#%s>program</color> <color=#%s>{</color> <color=#%s>&quot;mouse_down&quot;</color><color=#%s>;</color><br/>   <color=#%s>signal</color><color=#%s>:</color> <color=#%s>&quot;mouse,down,1&quot;</color><color=#%s>;</color><br/>   <color=#%s>source</color><color=#%s>:</color> <color=#%s>&quot;rect&quot;</color><color=#%s>;</color><br/>   <color=#%s>action</color><color=#%s>:</color> <color=#%s>STATE_SET</color> <color=#%s>&quot;default&quot;</color> 0.0<color=#%s>;</color><br/>   <color=#%s>target</color><color=#%s>:</color> <color=#%s>&quot;rect&quot;</color><color=#%s>;</color><br/><color=#%s>}</color><br/><color=#%s>script</color> <color=#%s>{</color><br/>   <color=#%s>public</color> flag <color=#%s>=</color> 0<color=#%s>;</color><br/>   <color=#%s>public</color> func<color=#%s>() {</color><br/>      <color=#%s>if</color> <color=#%s>(!</color><color=#%s>get_int</color><color=#%s>(</color>flag<color=#%s>))</color> <color=#%s>set_int</color><color=#%s>(</color>flag<color=#%s>,</color> 1<color=#%s>);</color><br/>   <color=#%s>}</color><br/><color=#%s>}</color></font_size>
diff --git a/data/color/syntax_template_old.dat b/data/color/syntax_template_old.dat
new file mode 100644 (file)
index 0000000..a7d22b3
--- /dev/null
@@ -0,0 +1 @@
+   <font_size=%3d><color=#%s>//comment</color><br/>   <color=#%s>#define RECT_COLOR</color> 0 136 170 255<br/>   <color=#%s>part</color> <color=#%s>{</color> <color=#%s>name</color><color=#%s>:</color> <color=#%s>&quot;rect&quot;</color><color=#%s>;</color><br/>      <color=#%s>type</color><color=#%s>:</color> <color=#%s>RECT</color><color=#%s>;</color><br/>      <color=#%s>description</color> <color=#%s>{</color> <color=#%s>state</color><color=#%s>:</color> <color=#%s>&quot;default&quot;</color> 0.0<color=#%s>;</color><br/>         <color=#%s>rel1</color><color=#%s>.</color><color=#%s>relative</color><color=#%s>:</color> 0.0 0.0<color=#%s>;</color><br/>         <color=#%s>rel2</color><color=#%s>.</color><color=#%s>relative</color><color=#%s>:</color> 1.0 1.0<color=#%s>;</color><br/>         <color=#%s>color</color><color=#%s>:</color> <color=#%s>RECT_COLOR</color><color=#%s>;</color><br/>      <color=#%s>}</color><br/>   <color=#%s>}</color><br/>   <color=#%s>program</color> <color=#%s>{</color> <color=#%s>name</color><color=#%s>:</color> <color=#%s>&quot;mouse_down&quot;</color><color=#%s>;</color><br/>      <color=#%s>signal</color><color=#%s>:</color> <color=#%s>&quot;mouse,down,1&quot;</color><color=#%s>;</color><br/>      <color=#%s>source</color><color=#%s>:</color> <color=#%s>&quot;rect&quot;</color><color=#%s>;</color><br/>      <color=#%s>action</color><color=#%s>:</color> <color=#%s>STATE_SET</color> <color=#%s>&quot;default&quot;</color> 0.0<color=#%s>;</color><br/>      <color=#%s>target</color><color=#%s>:</color> <color=#%s>&quot;rect&quot;</color><color=#%s>;</color><br/>   <color=#%s>}</color><br/>   <color=#%s>script</color> <color=#%s>{</color><br/>      <color=#%s>public</color> flag <color=#%s>=</color> 0<color=#%s>;</color><br/>      <color=#%s>public</color> func<color=#%s>() {</color><br/>         <color=#%s>if</color> <color=#%s>(!</color><color=#%s>get_int</color><color=#%s>(</color>flag<color=#%s>))</color> <color=#%s>set_int</color><color=#%s>(</color>flag<color=#%s>,</color> 1<color=#%s>);</color><br/>      <color=#%s>}</color><br/>   <color=#%s>}</color></font_size>
diff --git a/data/desktop/Makefile.am b/data/desktop/Makefile.am
new file mode 100644 (file)
index 0000000..7414f7f
--- /dev/null
@@ -0,0 +1,6 @@
+MAINTAINERCLEANFILES = Makefile.in
+filesdir = $(datadir)/applications
+files_DATA = \
+enventor.desktop
+
+EXTRA_DIST = $(files_DATA)
diff --git a/data/desktop/enventor.desktop b/data/desktop/enventor.desktop
new file mode 100644 (file)
index 0000000..29b120e
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=Application
+Name=Enventor
+Comment=Enlightenment EDC Editor
+Comment[ru]=Редактор EDC-файлов
+Icon=enventor
+Exec=enventor
+Terminal=false
+#MimeType=text/edc
+Categories=Development;Utility;
diff --git a/data/help/COMMAND b/data/help/COMMAND
new file mode 100644 (file)
index 0000000..1eda1e8
--- /dev/null
@@ -0,0 +1,19 @@
+enventor --help</br>
+enventor [input file] [output file] [-t] [-i image path] [-s sound path] [-f font path] [-d data path] [-w workspace path]</br>
+</br>
+input file = EDC file to open. If input file is skipped, Enventor will open a default template code with a temporary file.</br>
+output file = EDJ file to store compiled file. If output file is skipped, Enventor will store the binary file to the temporary directory.</br>
+-t = Open template menu when you launch Enventor</br>
+-i = path to image resources that the edc includes</br>
+-s = path to sound resources that the edc includes</br>
+-f = path to font resources that the edc includes</br>
+-d = path to data resources that the edc includes</br>
+-w = workspace directory path that contains group edc files</br>
+</br>
+Examples of Enventor command line usage:</br>
+$ enventor</br>
+$ enventor input.edc -i ./images</br>
+$ enventor input.edc output.edj -i ./images</br>
+$ enventor -t</br>
+$ enventor newfile.edc -t</br>
+$ enventor input.edc output.edj -i ./images -s ./sounds -w ./workspace
diff --git a/data/help/DEVEL b/data/help/DEVEL
new file mode 100644 (file)
index 0000000..f26fd66
--- /dev/null
@@ -0,0 +1,16 @@
+Many developers have contributed to Enventor project. The following names are dedicated Enventor developers' names but there are more people who've gladly contributed for Enventor. For a complete list of contributors, See AUTHORS file.</br>
+</br>
+Copyright (C) 2013 - 2016 by:</br>
+</br>
+Hermet Park</br>
+Jaehyun Cho</br>
+Mykyta Biliavskyi</br>
+Kateryna Fesyna</br>
+Tae-Hyup Kim</br>
+Bowon Ryu</br>
+Yunho Jeong</br>
+Mincheol Seo</br>
+Raoul Hecky</br>
+Yurii Tsivun</br>
+</br>
+And various contributors (See AUTHORS)
diff --git a/data/help/HISTORY b/data/help/HISTORY
new file mode 100644 (file)
index 0000000..17f1022
--- /dev/null
@@ -0,0 +1,58 @@
+<b>Changes since EDC Editor 0.8.0</b><br>
+<br>
+<b>Additions:</b><br>
+   * Mirror Mode: Newly introduced.<br>
+   * File Browser: Newly introduced.<br>
+   * Live Edit: Support Auto-Align feature.<br>
+   * Live Edit: Support relative_to among the exist parts.<br>
+   * Live Edit: Support Fixed Width and Height Interface.<br>
+   * Live Edit: Add Edge Attaching Effect.<br>
+   * Template: Add a Watchface code.<br>
+<br>
+<b>Improvements:</b><br>
+   * Live Edit: Improve part name for more formal naming rule.<br>
+   * Live Edit: Support direction key for moving live edit object item per pixels.<br>
+   * Live Edit: Do not highlight part during live edit mode.<br>
+   * Template: Remove a duplicated image comment to look better.<br>
+   * Syntax Color: Improve string syntax color logic.<br>
+   * Console: Hide unnecessary error messages.<br>
+   * RedoUndo: Enhance smart function to support auto indentation.<br>
+   * RedoUndo: Enable smart analyze for a pushed region text.<br>
+   * Setting: Redesign GUI.<br>
+   * Setting: Set Error-Message-Red-Alert-Effect configurable.<br>
+   * About: Redesign from About to Help.<br>
+   * EDC Navigator: Provide a program launch/stop functions.<br>
+   * EDC Navigator: Redesign its basic tree behavior.<br>
+   * EDC Editor API: renamed from enventor_object_file_set() -> enventor_object_main_file_set()<br>
+   * Tools: Support a template insert button.<br>
+   * Don't overwrite existing EDC with new template code.<br>
+   * EDC Editor: Turned off focus highlight effect.<br>
+<br>
+<b>Fixes:</b><br>
+   * Setting: Fix to activate edc navigator toggle correctly.<br>
+   * Setting: Show current font correctly.<br>
+   * EDC Navigator: Fix the editor cursor jumping issue.<br>
+   * EDC Navigator: Compare name elaborately to search the part correctly.<br>
+   * Statusbar: Fix view sizing issue when an invert button is clicked repeatedly.<br>
+   * Indentation: Check '\r' when indented code line is created on Windows.<br>
+   * Indentation: Fix to calculate indent depth after multi line comment.<br>
+   * Indentation: Fix to paste a word at correct position.<br>
+   * EDC Editor: Fix a crash issue on Windows when preview part on live view is clicked.<br>
+   * EDC Editor: Compare name elaborately to search the clicked part correctly.<br>
+   * Live Edit: Fix malfunction of key input on Windows.<br>
+   * Live Edit: Fix center guide text positioning problem.<br>
+   * Live View: Update dummy part when removing all source code.<br>
+   * RedoUndo: Correct work with unicode symbols.<br>
+   * Template: Fix the error of line position when inserting group template.<br>
+   * Template: Fix line count of textblock part inserted in live edit mode.<br>
+   * Template: Fix to insert template code to the correct place.<br>
+   * EDC Parser: Fix wrong minimum value of "base_scale"<br>
+   * EDC Parser: Fix a crash issue when double click words on Windows.<br>
+   * Ctxpopup: Fix a broken preview image relay behavior.<br>
+   * Ctxpopup: Block whole area if the editor ctxpopup is activated.<br>
+   * Ctxpopup: Don't display image previews if the selected image string is in comments.<br>
+   * Auto Completion: Fix its list moved to selected part name position.<br>
+   * Fix a crash issue when removing all code in edc editor.<br>
+   * Fix a compilation issue when new empty file is opened.<br>
+   * Fix a color selector to scalable.<br>
+<br>
diff --git a/data/help/INTRO b/data/help/INTRO
new file mode 100644 (file)
index 0000000..0131d1f
--- /dev/null
@@ -0,0 +1,12 @@
+<b>EDC Editor v0.9.0</b></br>
+</br>
+EDC Editor, which is also known as EDC (Edje Data Collections) Editor, is a EDC script editor tool that supports text editing and previewing functions for the EDC source code.</br>
+</br>
+When your application requires real-time changeable layouts like animated ones, then you can write the layout design using EDC script, compile it into EDJ format file, and import it into your application using a UI layout component. You can also write design layouts from simple to complex ones using the EDC script with EDC Editor. EDC Editor helps you write EDC script code easier and finish your work faster. If you are not familiar with EDC programming, see Edje Programming Guide - https://www.enlightenment.org/program_guide/edje_pg for more information.</br>
+</br>
+Please see the following sites for more information.</br>
+</br>
+https://www.enlightenment.org/about-enventor</br>
+https://phab.enlightenment.org/w/projects/enventor</br>
+http://www.openhub.net/p/enventor
+
diff --git a/data/help/Makefile.am b/data/help/Makefile.am
new file mode 100644 (file)
index 0000000..3be6f8f
--- /dev/null
@@ -0,0 +1,10 @@
+MAINTAINERCLEANFILES = Makefile.in
+filesdir = $(datadir)/$(PACKAGE)/help
+files_DATA = \
+INTRO \
+HISTORY \
+SHORTCUT \
+COMMAND \
+DEVEL
+
+EXTRA_DIST = $(files_DATA)
diff --git a/data/help/SHORTCUT b/data/help/SHORTCUT
new file mode 100644 (file)
index 0000000..9b8a37e
--- /dev/null
@@ -0,0 +1,43 @@
+<b>Functions:</b></br>
+  Esc - Open/Close Menu</br>
+  F1 - Help</br>
+  F2 - Set Main EDC (in File Browser)</br>
+  F3 - Quick Jump (Open an including file / Jumping to a referencing part)</br>
+  F4 - Revert Quick Jump</br>
+  F5 - Keyword Reference</br>
+  F7 - Toggle Tools</br>
+  F8 - Toggle Status</br>
+  F9 - Toggle File Browser</br>
+  F10 - Toggle EDC Navigator</br>
+  F11 - Toggle File Tab</br>
+  F12 - Settings</br>
+</br>
+  Ctrl+S - Quick Save + Update Live View</br>
+  Ctrl+U - Toggle Dummy Parts</br>
+  Ctrl+H - Toggle Part Highlighting</br>
+  Ctrl+M - Toggle Mirror Mode</br>
+  Ctrl+W - Toggle Wireframes</br>
+  Ctrl+T - Insert Default Template Code</br>
+  Ctrl+Mouse Wheel Up - View Zoom In / Font Size Up</br>
+  Ctrl+Mouse Wheel Down - View Zoom Out / Font Size Down</br>
+</br>
+<b>Panes Control:</b></br>
+  Alt+Left - Toggle Full Edit View</br>
+  Alt+Right - Toggle Full Live View</br>
+  Alt+Up - Toggle Full Console View</br>
+  Alt+Down - Toggle Full Editors View</br>
+</br>
+<b>Text Editor:</b></br>
+  Ctrl+A - Select Text All</br>
+  Ctrl+Double Click - Select a word without openning candidate popup</br>
+  Ctrl+Z - Undo Text</br>
+  Ctrl+R - Redo Text</br>
+  Ctrl+C - Copy Selected Text</br>
+  Ctrl+V - Paste Copied Text</br>
+  Ctrl+X - Cut Selected Text</br>
+  Ctrl+D - Delete a Current line</br>
+  Ctrl+F - Find/Replace</br>
+  Ctrl+L - Go to line</br>
+  Ctrl+Home - Go to the Top line</br>
+  Ctrl+End - Go to the Bottom line</br>
+  Ctrl+Space - Search candidate keywords in the context
diff --git a/data/icon/Makefile.am b/data/icon/Makefile.am
new file mode 100644 (file)
index 0000000..8905261
--- /dev/null
@@ -0,0 +1,6 @@
+MAINTAINERCLEANFILES = Makefile.in
+filesdir = $(datadir)/icons
+files_DATA = \
+enventor.png
+
+EXTRA_DIST = $(files_DATA)
diff --git a/data/icon/enventor.png b/data/icon/enventor.png
new file mode 100755 (executable)
index 0000000..fdd4430
Binary files /dev/null and b/data/icon/enventor.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG.png b/data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG.png
new file mode 100644 (file)
index 0000000..d5ad410
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png b/data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png
new file mode 100644 (file)
index 0000000..ebfb65f
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png b/data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png
new file mode 100644 (file)
index 0000000..7a66fc7
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_ICON_ARROW.png b/data/images/EDC_EDITOR_EMBEDDED_ICON_ARROW.png
new file mode 100644 (file)
index 0000000..081e3cf
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_ICON_ARROW.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_ICON_BADGE.png b/data/images/EDC_EDITOR_EMBEDDED_ICON_BADGE.png
new file mode 100644 (file)
index 0000000..1975d95
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_ICON_BADGE.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png b/data/images/EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png
new file mode 100644 (file)
index 0000000..3fa4967
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_ICON_CLIP.png b/data/images/EDC_EDITOR_EMBEDDED_ICON_CLIP.png
new file mode 100644 (file)
index 0000000..e386b3b
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_ICON_CLIP.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png b/data/images/EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png
new file mode 100644 (file)
index 0000000..8d5ac2e
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_ICON_DOCK.png b/data/images/EDC_EDITOR_EMBEDDED_ICON_DOCK.png
new file mode 100644 (file)
index 0000000..c478f25
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_ICON_DOCK.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png b/data/images/EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png
new file mode 100644 (file)
index 0000000..6f1c367
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_ICON_LOCK.png b/data/images/EDC_EDITOR_EMBEDDED_ICON_LOCK.png
new file mode 100644 (file)
index 0000000..5892b34
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_ICON_LOCK.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png b/data/images/EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png
new file mode 100644 (file)
index 0000000..a903915
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_IMAGE.png b/data/images/EDC_EDITOR_EMBEDDED_IMAGE.png
new file mode 100644 (file)
index 0000000..70c4b36
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_IMAGE.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_MONTH_STROKE.png b/data/images/EDC_EDITOR_EMBEDDED_MONTH_STROKE.png
new file mode 100644 (file)
index 0000000..09f486f
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_MONTH_STROKE.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png b/data/images/EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png
new file mode 100644 (file)
index 0000000..e90d54a
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png b/data/images/EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png
new file mode 100644 (file)
index 0000000..12074dc
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png
new file mode 100644 (file)
index 0000000..d1ad63a
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png
new file mode 100644 (file)
index 0000000..445d8e0
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png
new file mode 100644 (file)
index 0000000..93f6d88
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png
new file mode 100644 (file)
index 0000000..b76ee37
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png
new file mode 100644 (file)
index 0000000..f3acc15
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png
new file mode 100644 (file)
index 0000000..1c8de84
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-01.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-01.png
new file mode 100644 (file)
index 0000000..0b5ad6c
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-01.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-02.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-02.png
new file mode 100644 (file)
index 0000000..78d6e68
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-02.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-03.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-03.png
new file mode 100644 (file)
index 0000000..2fd39e9
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-03.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-04.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-04.png
new file mode 100644 (file)
index 0000000..e587614
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-04.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-05.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-05.png
new file mode 100644 (file)
index 0000000..34967a1
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-05.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-06.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-06.png
new file mode 100644 (file)
index 0000000..f6e91c5
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-06.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-07.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-07.png
new file mode 100644 (file)
index 0000000..918f3fa
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-07.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-08.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-08.png
new file mode 100644 (file)
index 0000000..22fab75
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-08.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-09.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-09.png
new file mode 100644 (file)
index 0000000..de6ca65
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-09.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-10.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-10.png
new file mode 100644 (file)
index 0000000..8f79950
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-10.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-11.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-11.png
new file mode 100644 (file)
index 0000000..f0fbaf3
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-11.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_TRIAB-12.png b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-12.png
new file mode 100644 (file)
index 0000000..9339e14
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_TRIAB-12.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_WATCHFACE.png b/data/images/EDC_EDITOR_EMBEDDED_WATCHFACE.png
new file mode 100644 (file)
index 0000000..9597790
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_WATCHFACE.png differ
diff --git a/data/images/EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png b/data/images/EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png
new file mode 100644 (file)
index 0000000..133b959
Binary files /dev/null and b/data/images/EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png differ
diff --git a/data/images/Makefile.am b/data/images/Makefile.am
new file mode 100644 (file)
index 0000000..0489d21
--- /dev/null
@@ -0,0 +1,43 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+filesdir = $(datadir)/$(PACKAGE)/images
+files_DATA = EDC_EDITOR_EMBEDDED_IMAGE.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-01.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-02.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-03.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-04.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-05.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-06.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-07.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-08.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-09.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-10.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-11.png \
+             EDC_EDITOR_EMBEDDED_TRIAB-12.png \
+             EDC_EDITOR_EMBEDDED_MONTH_STROKE.png \
+             EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png \
+             EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png \
+             EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png \
+             EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png \
+             EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png \
+             EDC_EDITOR_EMBEDDED_WATCHFACE.png \
+             EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png \
+             EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png \
+             EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png \
+             EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png \
+             EDC_EDITOR_EMBEDDED_BUTTON_BG.png \
+             EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png \
+             EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png \
+             EDC_EDITOR_EMBEDDED_ICON_ARROW.png \
+             EDC_EDITOR_EMBEDDED_ICON_BADGE.png \
+             EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png \
+             EDC_EDITOR_EMBEDDED_ICON_CLIP.png \
+             EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png \
+             EDC_EDITOR_EMBEDDED_ICON_DOCK.png \
+             EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png \
+             EDC_EDITOR_EMBEDDED_ICON_LOCK.png \
+             EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png \
+             enventor_logo.png \
+             enventor.ico
+
+EXTRA_DIST = $(files_DATA)
diff --git a/data/images/enventor.ico b/data/images/enventor.ico
new file mode 100644 (file)
index 0000000..cebe1f1
Binary files /dev/null and b/data/images/enventor.ico differ
diff --git a/data/images/enventor_logo.png b/data/images/enventor_logo.png
new file mode 100644 (file)
index 0000000..725990a
Binary files /dev/null and b/data/images/enventor_logo.png differ
diff --git a/data/reference/Makefile.am b/data/reference/Makefile.am
new file mode 100644 (file)
index 0000000..4613fda
--- /dev/null
@@ -0,0 +1,5 @@
+MAINTAINERCLEANFILES = Makefile.in
+filesdir = $(datadir)/$(PACKAGE)/reference
+files_DATA = reference.src
+
+EXTRA_DIST = $(files_DATA)
diff --git a/data/reference/reference.src b/data/reference/reference.src
new file mode 100644 (file)
index 0000000..a3be737
--- /dev/null
@@ -0,0 +1,555 @@
+collections { "The <hilight>collections</hilight> represents a theme.</br>The <hilight>collections</hilight> block contains a list of groups that composes a theme.";
+   base_scale { "The <hilight>base_scale</hilight> indicates the scale factor that the edc file is based on.</br>The size of a scalable object is multiplied with the device scale value. If the scalable object with the size 10 is created in a device with the scale 1.0, the size of the object is 20 in a device with the scale 2.0, and 40 in a device with the scale 4.0.</br>The relationship among scale, device scale and base scale is as follows.</br>Scale = Device Scale / Base Scale.";
+   }
+   color_classes { "The <hilight>color_classes</hilight> block contains a list of one or more <hilight>color_class</hilight> blocks.</br>Each <hilight>color_class</hilight> allows designers to name an arbitary group of colors to be used in the theme, the application can use that name to alter the color values at runtime.";
+      color_class { "The <hilight>color_class</hilight> allows designers to name an arbitrary group of colors to be used in the theme, the application can use that name to alter the color values at runtime.";
+         color { "The main color.";
+         }
+         color2 { "Used as outline in text and textblock parts.";
+         }
+         color3 { "Used as shadow in text and textblock parts.";
+         }
+         name { "Sets the name for the color class, used as reference by both the theme and the application.";
+         }
+      }
+   }
+
+   fonts { "The <hilight>fonts</hilight> block is used to list each font file with an alias used later in the theme.";
+      font { "Defines each font file and alias.";
+      }
+   }
+
+   group { "The <hilight>group</hilight> represents a widget style.</br>The <hilight>group</hilight> block contains parts and programs that compose a widget style.";
+      alias { "Additional name to be used as an identifier. Defining multiple aliases is supported.";
+      }
+
+      broadcast_signal { "Signal gets automatically broadcasted to all sub group parts. Default is "on".";
+      }
+
+      data { "The <hilight>data</hilight> block is used to pass arbitrary parameters from the theme to the application.";
+         item { "Defines a new parameter, the value is the string specified next to it.";
+         }
+      }
+
+      fonts { "The <hilight>fonts</hilight> block is used to list each font file with an alias used later in the theme.";
+         font { "Defines each font file and alias.";
+         }
+      }
+
+      images { "The <hilight>images</hilight> block is used to list each image file which are used in the theme. If any compression method is used, it is also defined here.";
+         image { "The <hilight>image</hilight> represents an image file which is used in the theme. If any compression method is used, it is also defined here.";
+         }
+         set { "The <hilight>set</hilight> block is used to define an image with different content depending on their size.";
+            image { "The <hilight>image</hilight> block inside the <hilight>set</hilight> block defines the characteristic of an image. Every block describes one image and the size rule to use it.";
+               size { "Defines the minimum and maximum size that selects the specified image.";
+               }
+               image { "This is included in each image file. Available compression methods are RAW, COMP, LOSSY, and USER.";
+               }
+            }
+            name { "Defines the name that refer to this image description.";
+            }
+         }
+      }
+
+      inherit { "Parent group name for inheritance.</br>Group inherit is used to inherit any predefined group and change some property which belongs to part, description, items or program. The child group has the same properties as its parent group.</br>If you specify the type again in an inherited part, it causes an error.";
+      }
+
+      limits { "This block is used to trigger signals when the Edje object is resized.";
+         horizontal { "This sends a signal limit,name,over when the object is resized and passes the limit by growing over it.</br>When the object's size is reduced below the limit, signal limit,name,below is sent.</br>This limit is applied on the y axis and is given in pixels.";
+         }
+         vertical { "This sends a signal limit,name,over when the object is resized and passes the limit by growing over it.</br>When the object's size is reduced below the limit, signal limit,name,below is sent.</br>This limit is applied on the x axis and is given in pixels.";
+         }
+      }
+
+      max { "The maximum size for the container defined by the totality of the parts.";
+      }
+
+      min { "The minimum size for the container defined by the composition of the parts.";
+      }
+
+      parts { "The <hilight>parts</hilight> represents visual elements.</br>The <hilight>parts</hilight> block contains a list of parts that describes a basic design element.";
+         part { "The <hilight>part</hilight> represents a basic design element such as an image, rectangle or text.</br>The <hilight>part</hilight> block contains a list of descriptions that defines a state of the element.";
+            access { "Specifies whether the part uses accessibility feature (1), or not (0).</br>It is set to 0 by default.";
+            }
+            box { "On a box part, the <hilight>box</hilight> block is used to set other groups as elements of the box.</br>These can be mixed with external objects set by the application through the edje_object_part_box*() functions.";
+               items { "The <hilight>items</hilight> block contains a list of <hilight>item</hilight> blocks.</br>Each <hilight>item</hilight> item block contains other group as an element of the box.";
+                  item { "The <hilight>item</hilight> item block contains other group as an element of the box.";
+                     align { "Moves the item relatively along both axis inside the part.</br>For horizontal alignment, 0.0 moves the item to touch the left edge of the part and 1.0 moves the item to touch the right edge of the part.</br>For vertical alignment, 0.0 moves the item to touch the top edge of the part and 1.0 moves the item to touch the bottom edge of the part.</br>The default value is 0.5 0.5.";
+                     }
+                     aspect { "Sets the aspect width and height hints for this object.";
+                     }
+                     aspect_mode { "Sets the aspect control hints for this object.</br>The available hints are NONE, NEITHER, HORIZONTAL, VERTICAL, and BOTH.";
+                     }
+                     max { "Sets the maximum size hints for this object.";
+                     }
+                     min { "Sets the minimum size hints for this object.";
+                     }
+                     name { "Sets the name of the object via evas_object_name_set()";
+                     }
+                     options { "Sets extra options for the object.";
+                     }
+                     padding { "Sets the padding hints for this object.";
+                     }
+                     prefer { "Sets the preferred size hints for this object.";
+                     }
+                     source { "Sets the group this object is made of.";
+                     }
+                     spread { "Replicates the item in a rectangle of size width x height box starting from the defined position of this item.</br>The default value is 1 1.";
+                     }
+                     type { "Sets the type of the object this item holds.</br>The supported type is GROUP.";
+                     }
+                     weight { "Sets the weight hints for this object.";
+                     }
+                  }
+               }
+            }
+            clip_to { "Only renders the area of the part that coincides with the given part.";
+            }
+            cursor_mode { "Sets where to draw the (blinking) cursor for textblock parts.</br>The available modes are UNDER and BEFORE.";
+            }
+            desc { "The <hilight>desc</hilight> defines a state of a part.</br>The <hilight>desc</hilight> block contains properties of a part such as size, position, color, image and text.";
+               align { "Moves the object relatively along both axis inside its container.</br>For horizontal alignment, 0.0 moves the object to touch the left edge of its container and 1.0 moves the object to touch the right edge of its container.</br>For vertical alignment, 0.0 moves the object to touch the top edge of its container and 1.0 moves the object to touch the bottom edge of its container.</br>The default value is 0.5 0.5.";
+               }
+               aspect { "Forces the ratio of the width to height to be kept between the minimum and maximum set.</br>For example, 1.0 1.0 increases the width a pixel for every pixel added to height and 2.0 2.0 increases the width two pixels for every pixel added to height.</br>The default value is 0.0 0.0 which disables <hilight>aspect</hilight>.";
+               }
+               aspect_preference { "Sets the dimensions to which the <hilight>aspect</hilight> property applies.</br>For example, if the dimension is HORIZONTAL, then the object fits its width to its container's width so its height can be longer than its container's height.</br>Available options are BOTH, VERTICAL, HORIZONTAL, SOURCE, and NONE.";
+               }
+               box { "On a box part, the <hilight>box</hilight> block is used to define how items are displayed inside of the box part.";
+                  align { "Moves items relatively along both axis inside the box.</br>For horizontal alignment, 0.0 moves items to touch the left edge of the box and 1.0 moves items to touch the right edge of the box.</br>For vertical alignment, 0.0 moves items to touch the top edge of the box and 1.0 moves items to touch the bottom edge of the box.</br>The default value is 0.5 0.5.";
+                  }
+                  layout { "Sets how the items are arranged in the box.</br>The available layouts are horizontal (default), vertical, horizontal_homogeneous, vertical_homogeneous, horizontal_max, vertical_max, horizontal_flow, vertical_flow, and stack.";
+                  }
+                  min { "When any of the parameters is enabled (1) it forces the minimum size of the box to be equal to the minimum size of the items.</br>The default value is 0 0.";
+                  }
+                  padding { "Sets the padding in pixels between items of the box.</br>The default value is 0 0.";
+                  }
+               }
+               clip_to { "Only renders the area of the part that coincides with the given part.";
+               }
+               color { "Sets the main color to the specified values in RGBA (between 0 and 255).</br>Notice that the <hilight>color</hilight> of the textblock part is set in the text style.";
+               }
+               color2 { "Sets the text outline color to the specified values in RGBA (0 to 255).</br>Notice that <hilight>color2</hilight> is valid only for the text part with the outline effect.</br>Notice that the <hilight>color2</hilight> of the textblock part is set in the text style.";
+               }
+               color3 { "Sets the text shadow color to the specified values in RGBA (0 to 255).</br>Notice that <hilight>color3</hilight> is valid only for the text part with the shadow effect.</br>Notice that the <hilight>color3</hilight> of the textblock part is set in the text style.";
+               }
+               color_class { "The part uses the color values of the named color_class, these values can be overridden by the <hilight>color</hilight>, <hilight>color2</hilight>, and <hilight>color3</hilight> properties.";
+               }
+               fill { "Sets how the image is going to fill the image part.";
+                  origin { "Sets the starting point of the image relatively to the image part.";
+                     offset { "Sets the starting point of the image in pixels from the top-left of the image part.</br>For example, 50 50 fills the image from 50 pixels right and 50 pixels down from the top-left point of the image part.";
+                     }
+                     relative { "Sets the starting point of the image relatively from the top-left of the image part.</br>For example, 0.1 0.1 fills the image from the 0.1 0.1 relative position of the image part.";
+                     }
+                  }
+                  size { "Sets the tile size.";
+                     offset { "Increases the tile size in pixels along each axis.</br>For example, 50 50 increases the tile size by 50 pixels along x and y axis.";
+                     }
+                     relative { "Sets the tile size relatively to the image size.</br>For example, 0.5 0.5 shrinks the tile size to 1/4 of the image size.";
+                     }
+                  }
+                  smooth { "Specifies whether the smooth scaling is applied to the image when the image is scaled.</br>The default value is 1 (enabled).";
+                  }
+                  type { "Spicifies whether the image is scaled or tiled to fill the image part.</br>The available types are SCALE (default) and TILE.";
+                  }
+               }
+               fixed { "Specifies whether the minimum size of this part affects the minimum size of the widget (group).</br>Normally, <hilight>fixed</hilight> is used to set a minimum width or height to a line or a point shaped part.</br>For example, rel1 and rel2 of a part are the same position along x axis and the part has a minimum width, then fixed: 1 0 should be applied not to increase the minimum width of the widget infinitely.</br>The default value is 0 0 (the minimum size of the part affects the minimum size of the widget).";
+               }
+               image { "On an image part, the <hilight>image</hilight> block is used to define how the image is displayed.";
+                  border { "Sets the area (in pixels) of each side of the image (left, right, top, and bottom) which is displayed as a fixed size border from the side.</br>The border area is not resized when the image is resized to fill the image part.";
+                  }
+                  border_scale { "Specifies whether the border is scaled by the object/global scale factors.";
+                  }
+                  border_scale_by { "If border scaling is enabled then normally the OUTPUT border sizes (e.g. if 3 pixels on the left edge are set as a border, then normally at scale 1.0, those 3 columns are always exactly 3 columns of output, or at scale 2.0 they are 6 columns, or 0.33 they merge into a single column).</br>This property multiplies the input scale factor by this multiplier, allowing the creation of supersampled borders to make higher resolution outputs possible by always using the highest resolution artwork and then runtime scaling it down.</br>Value can be: 0.0 or bigger (0.0 or 1.0 to turn it off).";
+                  }
+                  middle { "Specifies how the rest of the image (not covered by the defined border) is displayed.</br>The rest of the image can be displayed with alpha (DEFAULT), displayed without alpha (SOLID), or not displayed (NONE).</br>The default value is DEFAULT.";
+                  }
+                  normal { "Sets the name of an image to be used.</br>Notice that the name of the image should be declared in the <hilight>images</hilight> block.";
+                  }
+                  scale_hint { "Sets the evas image scale hint letting the engine more effectively save cached copies of the scaled image if it makes sense.</br>The available values are NONE, DYNAMIC, and STATIC.";
+                  }
+                  tween { "Sets the name of an image to be animated during the transition to the state of the part containing the <hilight>image</hilight> block.</br>The <hilight>image</hilight> block can have none, one or multiple <hilight>tween</hilight> declarations.</br>Images declared with <hilight>tween</hilight> are displayed in the order they are listed during the transition to the state they are declared in.</br>The <hilight>normal</hilight> image is displayed in the beginning and in the end.";
+                  }
+               }
+               inherit { "Inherits all the properties from the named description.</br>The properties defined in the description override the inherited properties, reducing the amount of necessary code for simple state changes.";
+               }
+               limit { "Emits a signal when the part size changes from zero or to a zero ("limit,width,over" or "limit,width,zero"). By default no signal are emitted.</br>The available values are NONE, WIDTH, HEIGHT, and BOTH.";
+               }
+               link { "The <hilight>link</hilight> block can be used to create transitions to the enclosing part description state.</br>The result of the above block is identical to creating a program with.";
+                  after { "Specifies a program that is run after the current program completes.</br>The source and signal parameters of a program run as an after are ignored.</br>Multiple after statements can be specified per program.";
+                  }
+                  base { "Specifies a signal and a source which triggers the transition to this state.</br>The source parameter is optional here and is filled with the current group's default value if it is not provided.";
+                  }
+                  in { "in [from] [range]</br>Waits [from] seconds before executing the program and adds a random number of seconds (from 0 to [range]) to the total waiting time.";
+                  }
+                  transition { "transition [type] [length] (interp val 1) (interp val 2) (option)</br>Defines how transitions occur using STATE_SET action.</br>[type] is the style of the transition and [length] is a double specifying the number of seconds in which to preform the transition.</br>The available types are LINEAR, SINUSOIDAL, ACCELERATE, ACCELERATE_FACTOR, DECELERATE_FACTOR, SINUSOIDAL_FACTOR, DIVISOR_INTERP, BOUNCE, and SPRING";
+                  }
+               }
+               map { "The <hilight>map</hilight> block is used to apply evas map rendering functions (e.g. perspective effect, rotation effect, lighting, and color blending).";
+                  alpha { "Specifies whether alpha channel is enabled or not during map rendering.</br>The default value is 1 (enabled).";
+                  }
+                  backface_cull { "Specifies whether backface culling is enabled or not.";
+                  }
+                  color { "color [point] [red] [green] [blue] [alpha]</br>Sets the color of a vertex in the map.</br>Colors are linearly interpolated between vertex points through the map.</br>The default color of a vertex in a map is white solid (255, 255, 255, 255) which means it has no affect on modifying the part pixels.</br>Currently only four points are supported: 0 - Left-Top point of a part. 1 - Right-Top point of a part. 2 - Left-Bottom point of a part. 3 - Right-Bottom point of a part.";
+                  }
+                  light { "Sets the part that is used as the light for calculating the brightness (based on how directly the part's surface is facing the light source point).</br>Like the perspective point part, the center point is used and zplane is used for the z position (0 being the zero-plane where all 2D objects normally live) and positive values being further away into the distance.</br>The light part color is used as the light color (alpha not used for light color). The color2 color is used for the ambient lighting when calculating brightness (alpha also not used).";
+                  }
+                  on { "Specifies whether mapping is enabled or not for the part.</br>The default value is 0 (disabled).";
+                  }
+                  perspective { "Sets the part that is used as the perspective point for giving a part a 3D look.</br>The perspective point must have a perspective section that provides zplane and focal properties. The center of this part is used as the focal point, thus size, color and visibility are not relevant, just center point, zplane and focal are used. This also implicitly enables perspective transforms.";
+                  }
+                  perspective_on { "Specifies whether perspective effect is enabled or not.";
+                  }
+                  rotation { "The <hilight>rotation</hilight> is used to rotate the part, optionally with the center on another part.";
+                     center { "Sets the part that is used as the center of rotation when rotating the part with this description.</br>The part's center point is used as the rotation center when applying rotation around the x, y and z axes.</br>If no center is given, the parts original center itself is used for the rotation center.";
+                     }
+                     x { "Sets the rotation around the x axis of the part considering the <hilight>center</hilight> set.</br>The value is given in degrees.";
+                     }
+                     y { "Sets the rotation around the y axis of the part considering the <hilight>center</hilight> set.</br>The value is given in degrees.";
+                     }
+                     z { "Sets the rotation around the x axis of the part considering the <hilight>center</hilight> set.</br>The value is given in degrees.";
+                     }
+                  }
+                  smooth { "Specifies whether smooth map rendering is enabled or not.</br>This may be linear interpolation, anisotropic filtering or anything the engine decides is smooth. This is a best-effort hint and may not produce precisely the same results in all engines and situations.</br>The default value is 1 (enabled).";
+                  }
+               }
+               max { "Sets the maximum size of the part.</br>The size of -1.0 means that it is ignored in that direction.";
+               }
+               min { "Sets the minimum size of the part.</br>To make this <hilight>min</hilight> size not affect to the minimum size of the object, <hilight>fixed</hilight> should be set with 1 for that direction.";
+               }
+               minmul { "Sets a multiplier forcibly applied to whatever minimum size is only during minimum size calculation.";
+               }
+               perspective { "The <hilight>perspective</hilight> is used to add focal and plane perspective to the part.</br>Must be provided if the part is being used by other parts as it is perspective target.";
+                  focal { "Sets the z value that is not scaled.</br>Normally this is 0 as that is the z distance.";
+                  }
+                  zplane { "Sets the distance from the focal z plane (zplane) and the camera (i.e. equating to focal length of the camera).";
+                  }
+               }
+               rel1 { "The <hilight>rel1</hilight> block is used to define the position of the top-left corner of the part.</br>";
+                  offset { "Adds an absoute offset (in pixels) along each axis.";
+                  }
+                  relative { "Moves the corner to a relative position of the part given to the keyword <hilight>to</hilight>.</br>The value for the left side of the part is 0.0 and the value for the right side of the part is 1.0.</br>The value for the top side of the part is 0.0 and the value for the bottom side of the part is 1.0";
+                  }
+                  to { "Sets another part referenced for positioning the corners along both x axis and y axis.";
+                  }
+                  to_x { "Sets another part referenced for positioning the corners along x axis.";
+                  }
+                  to_y { "Sets another part referenced for positioning the corners along y axis.";
+                  }
+               }
+               rel2 { "The <hilight>rel2</hilight> block is used to define the position of the bottom-right corner of the part.";
+                  #inherit "collections.group.parts.part.desc.rel1";
+               }
+               source { "Sets another part to be used by the part's content.</br>Notice that this works only with proxy parts.";
+               }
+               step { "Restricts resizing of each dimension to values divisible by its value.</br>This causes the part to jump from value to value while resizing.</br>The default value is 0 0 which disables stepping.";
+               }
+               table { "On a table part, the <hilight>table</hilight> block is used to define how items are displayed inside of the table part.";
+                  align { "Moves items relatively along both axis inside the table.</br>For horizontal alignment, 0.0 moves items to touch the left edge of the table and 1.0 moves items to touch the right edge of the table.</br>For vertical alignment, 0.0 moves items to touch the top edge of the table and 1.0 moves items to touch the bottom edge of the table.</br>The default value is 0.5 0.5.";
+                  }
+                  homogeneous { "Sets how the space for each item is arranged in the table.</br>The available modes are NONE (default), TABLE, and ITEM.";
+                  }
+                  min { "When any of the parameters is enabled (1) it forces the minimum size of the table to be equal to the minimum size of the items.</br>The default value is 0 0.";
+                  }
+                  padding { "Sets the padding in pixels between items of the table.</br>The default value is 0 0.";
+                  }
+               }
+               text { "The <hilight>text</hilight> block is used to define text properties.";
+                  align { "Moves the text relatively along both axis inside the part.</br>For horizontal alignment, 0.0 moves the text to touch the left edge of the part and 1.0 moves the text to touch the right edge of the part.</br>For vertical alignment, 0.0 moves the text to touch the top edge of the part and 1.0 moves the text to touch the bottom edge of the part.</br>The default value is 0.5 0.5.";
+                  }
+                  domain { "Sets the domain name of the .mo file which has to be checked for translation.";
+                  }
+                  ellipsis { "Balances the text in a relative point from 0.0 to 1.0, this point is the last section of the string to be cut out in case of a resize that is smaller than the text itself.</br>The default value is 0.0.";
+                  }
+                  fit { "Specifies whether resizing the text to fit in the part or not.</br>The default value is 0 0 (disabled).";
+                  }
+                  font { "Sets the font family to one of the aliases set up in the <hilight>fonts</hilight> block.";
+                  }
+                  max { "When any of the parameters is enabled (1) it forces the maximum size of the container to be equal to the maximum size of the text (width and height).</br>The default value is 0 0 (disabled).";
+                  }
+                  min { "When any of the parameters is enabled (1) it forces the minimum size of the container to be equal to the minimum size of the text (width and height).</br>The default value is 0 0 (disabled).";
+                  }
+                  repch { "Sets a replacement character string to hide the details in the password mode.</br>This works only if the part is <hilight>textblock</hilight> and the <hilight>entry_mode</hilight> is PASSWORD.</br>Normally * is used, but you can use anything you like.";
+                  }
+                  size { "Sets the default font size.";
+                  }
+                  size_range { "Sets the allowed font size.</br>Setting min and max to 0 means that sizing is not restricted.</br>The default value is 0 0 (sizing is not restricted).";
+                  }
+                  source { "Uses text properties of the given part (e.g. font and size).";
+                  }
+                  style { "Uses the default style and tags defined in the <hilight>style</hilight> block with the specified name.";
+                  }
+                  text { "Sets the default text string.";
+                  }
+                  text_class { "Sets the text's class which can be used to factor font and font size properties.";
+                  }
+                  text_source { "Sets the text string the same as the given part's text string.</br>The text string is updated when the given part's text string changes.";
+                  }
+               }
+               visible { "Specifies whether the part is visible or not.</br>If the part is not visible, then the part does not receive mouse events.</br>The default value is 1 (visible).";
+               }
+            }
+            description { "The <hilight>description</hilight> defines a state of a part.</br>The <hilight>description</hilight> block contains properties of a part such as size, position, color, image and text.";
+               #inherit "collections.group.parts.part.desc";
+            }
+            dragable { "When this block is used the part can be dragged around the interface, do not confuse with external drag and drop.</br>By default Edje (and most applications) attempts to use the minimal size possible for a draggable part.</br>If the min property is not set in the description the part is (most likely) set to 0px width and 0px height, thus invisible.";
+               confine { "Limits the movement of the dragged part to another part's container.</br>Set a min size for the part, or the dragged object will not show up.";
+               }
+               events { "Causes the part to forward the drag events to another part, thus ignoring them for itself.";
+               }
+               threshold { "When set, the movement of the dragged part can only start when it get moved enough to be outside of the threshold part.";
+               }
+               x { "Used to set up dragging events for the X axis.</br>The first parameter is used to enable (1 or -1) and disable (0) dragging along the axis.</br>When enabled, 1 sets the starting point at 0.0 and -1 at 1.0.</br>The second parameter takes any integer and limits movement to values divisible by it, causing the part to jump from position to position.</br>If the second parameter, step, is set to 0 it is calculated as width of confine part divided by the third parameter,count.";
+               }
+               y { "Used to set up dragging events for the Y axis.</br>The first parameter is used to enable (1 or -1) and disable (0) dragging along the axis.</br>When enabled, 1 sets the starting point at 0.0 and -1 at 1.0.</br>The second parameter takes any integer and limits movement to values divisible by it, causing the part to jump from position to position.</br>If the second parameter, step, is set to 0 it is calculated as height of confine part divided by the third parameter, count.";
+               }
+            }
+            effect { "Applies the selected outline, shadow, or glow effect to textblock parts.</br>The available effects are PLAIN, OUTLINE, SOFT_OUTLINE, SHADOW, SOFT_SHADOW, OUTLINE_SHADOW, OUTLINE_SOFT_SHADOW, FAR_SHADOW, FAR_SOFT_SHADOW, and GLOW.</br>The available shadow directions definitions are BOTTOM_RIGHT, BOTTOM, BOTTOM_LEFT, LEFT, TOP_LEFT, TOP, TOP_RIGHT, and RIGHT (default is BOTTOM_RIGHT).";
+            }
+            entry_mode { "Sets the edit mode for textblock parts.</br>The available modes are NONE, PLAIN, EDITABLE, and PASSWORD.";
+            }
+            ignore_flags { "Specifies whether events with the given flags are ignored, i.e., do not emit signals to the parts.</br>Multiple flags must be separated by spaces, the effect is ignoring all events with one of the flags specified.</br>The available flags are NONE and ON_HOLD";
+            }
+            insert_after { "Inserts the part above the given part.</br>Notice that one part cannot have both insert_before and insert_after.</br>Notice that one part cannot refer more than one by insert_after.";
+            }
+            insert_before { "Inserts the part below the given part.</br>Notice that one part cannot have both insert_before and insert_after.</br>Notice that one part cannot refer more than one by insert_before.";
+            }
+            mouse_events { "Specifies whether the part receives mouse events or not.</br>The default value is 1 (receiving mouse events).";
+            }
+            multiline { "Specifies whether multiple lines are allowed for editable textblock parts.";
+            }
+            pointer_mode { "Sets the mouse pointer behavior for the given part.</br>The default value is AUTOGRAB.</br>The available modes are AUTOGRAB and NOGRAB.";
+            }
+            repeat_events { "Specifies whether the part passes mouse events to other parts below it.</br>The default value is 0 (not passing mouse events).";
+            }
+            scale { "Specifies whether the part scales its size with an Edje scaling factor.</br>This is used to scale properties such as font size, min/max size of the part, and it can also be used to scale based on DPI of the target device.</br>The default value is 0 (not scaling).";
+            }
+            select_mode { "Sets how the text selection is triggered for textblock parts.</br>The available modes are DEFAULT and EXPLICIT.";
+            }
+            source { "Sets the given group to the group/textblock parts.</br>Sets the given elementary widget to the external part. (e.g. elm/button)";
+            }
+            table { "On a box part, the <hilight>table</hilight> block is used to set other groups as elements of the box.</br>These can be mixed with external objects set by the application through the edje_object_part_box*() functions.";
+               items { "The <hilight>items</hilight> block contains a list of <hilight>item</hilight> blocks.</br>Each <hilight>item</hilight> item block contains other group as an element of the box.";
+                  item { "The <hilight>item</hilight> item block contains other group as an element of the box.";
+                     align { "Moves the item relatively along both axis inside the part.</br>For horizontal alignment, 0.0 moves the item to touch the left edge of the part and 1.0 moves the item to touch the right edge of the part.</br>For vertical alignment, 0.0 moves the item to touch the top edge of the part and 1.0 moves the item to touch the bottom edge of the part.</br>The default value is 0.5 0.5.";
+                     }
+                     aspect { "Sets the aspect width and height hints for this object.";
+                     }
+                     aspect_mode { "Sets the aspect control hints for this object.</br>The available hints are NONE, NEITHER, HORIZONTAL, VERTICAL, and BOTH.";
+                     }
+                     max { "Sets the maximum size hints for this object.";
+                     }
+                     min { "Sets the minimum size hints for this object.";
+                     }
+                     name { "Sets the name of the object via evas_object_name_set()";
+                     }
+                     options { "Sets extra options for the object.";
+                     }
+                     padding { "Sets the padding hints for this object.";
+                     }
+                     position { "Sets the position in the table.";
+                     }
+                     prefer { "Sets the preferred size hints for this object.";
+                     }
+                     source { "Sets the group this object is made of.";
+                     }
+                     span { "Sets how many columns and rows this item uses.</br>The default value is 1 1.";
+                     }
+                     spread { "Replicates the item in a rectangle of size width x height box starting from the defined position of this item.</br>The default value is 1 1.";
+                     }
+                     type { "Sets the type of the object this item holds.</br>The supported type is GROUP.";
+                     }
+                     weight { "Sets the weight hints for this object.";
+                     }
+                  }
+               }
+            }
+            type { "Sets the part type.</br>The available types are IMAGE (default), RECT, SWALLOW, TEXT, TEXTBLOCK, SPACER, GROUP, BOX, TABLE, PROXY and EXTERNAL.";
+            }
+         }
+
+         box { "The <hilight>box</hilight> represents a box part. The <hilight>box</hilight> part is used to contain other objects.</br>The <hilight>box</hilight> block contains a list of descriptions that defines a state of the box part.</br>It also has a row or column.";
+            #inherit "collections.group.parts.part";
+         }
+
+         external { "The <hilight>external</hilight> represents an external part. The <hilight>external</hilight> part is used to set a widget inside of it.</br>The <hilight>external</hilight> block contains a list of descriptions that defines a state of the external part.";
+            #inherit "collections.group.parts.part";
+         }
+
+         group { "The <hilight>group</hilight> represents a group part. The <hilight>group</hilight> part is used to include other group (widget style) inside of it.</br>The <hilight>group</hilight> block contains a list of descriptions that defines a state of the group part.";
+            #inherit "collections.group.parts.part";
+         }
+
+         image { "The <hilight>image</hilight> represents an image part. The <hilight>image</hilight> part is used to display an image file.</br>The <hilight>image</hilight> block contains a list of descriptions that defines a state of the image part.";
+            #inherit "collections.group.parts.part";
+         }
+
+         proxy { "The <hilight>proxy</hilight> represents a proxy part. The <hilight>proxy</hilight> part is used to clone other part in the same group.</br>The <hilight>proxy</hilight> block contains a list of descriptions that defines a state of the proxy part.";
+            #inherit "collections.group.parts.part";
+         }
+
+         rect { "The <hilight>rect</hilight> represents a rectangle part. The <hilight>rect</hilight> part is used to draw a rectangle.</br>The <hilight>rect</hilight> block contains a list of descriptions that defines a state of the rectangle part.";
+            #inherit "collections.group.parts.part";
+         }
+
+         spacer { "The <hilight>spacer</hilight> represents a spacer part. The <hilight>spacer</hilight> part is used as a padding area (it is not visible and it does not receive mouse events and it also does not need any memory allocation unlike other parts.).</br>The <hilight>spacer</hilight> block contains a list of descriptions that defines a state of the spacer part.";
+            #inherit "collections.group.parts.part";
+         }
+
+         swallow { "The <hilight>swallow</hilight> represents a swallow part. The <hilight>swallow</hilight> part is used to set a widget into this part.</br>The <hilight>swallow</hilight> block contains a list of descriptions that defines a state of the swallow part.";
+            #inherit "collections.group.parts.part";
+         }
+
+         table { "The <hilight>table</hilight> represents a table part. The <hilight>table</hilight> part is used to contain other parts.</br>The <hilight>table</hilight> block contains a list of descriptions that defines a state of the table part.</br>It also has a row and column.";
+            #inherit "collections.group.parts.part";
+         }
+
+         text { "The <hilight>text</hilight> represents a text part. The <hilight>text</hilight> part is used to write a simple string with single line in this part.</br>The <hilight>text</hilight> block contains a list of descriptions that defines a state of the text part.";
+            #inherit "collections.group.parts.part";
+         }
+
+         textblock { "The <hilight>textblock</hilight> represents a textblock part. The <hilight>textblock</hilight> part is used to write complex strings and mark-up elements with multiple lines in this part.</br>The <hilight>textblock</hilight> block contains a list of descriptions that defines a state of the textblock part.";
+            #inherit "collections.group.parts.part";
+         }
+
+         vector { "The <hilight>vector</hilight> represents a vector part. The <hilight>vector</hilight> part is used to display a vector file.</br>The <hilight>vector</hilight> block contains a list of descriptions that defines a state of the vector part.";
+            #inherit "collections.group.parts.part";
+         }
+      }
+
+      programs { "The <hilight>programs</hilight> defines how your interface reacts to events.</br>The <hilight>programs</hilight> block contains a list of programs that reacts to events.";
+         program { "The <hilight>program</hilight> defines how your interface reacts to events. The <hilight>program</hilight> can change the state of parts and trigger/listen events.</br>The <hilight>program</hilight> block contains signal, source, action and target.</br>signal is an event that the program is waiting for.</br>source is a part that catches the signal. (e.g. mouse clicking area)</br>action defines what is going to do when the signal is caught. (e.g. changing the state of a part)</br>target is a part that changes its state.";
+            action { "action [type] (param1) (param2) (param3) (param4)</br>Specifies an action to be performed by the program.</br>The available types are STATE_SET, SIGNAL_EMIT, etc.";
+            }
+            after {"Specifies a program that is run after the current program completes.</br>The source and signal parameters of a program run as an after are ignored.</br>Multiple after statements can be specified per program.";
+            }
+            filter { "filter [part] [state]</br>Filters signals to be only accepted if the part is in state named [state].</br>Only one filter per program can be used.</br>If [state] is not given, the source of the event is used instead.";
+            }
+            in { "in [from] [range]</br>Waits [from] seconds before executing the program and adds a random number of seconds (from 0 to [range]) to the total waiting time.";
+            }
+            name { "Sets the name of the program as a unique identifier.";
+            }
+            signal { "Specifies a signal which triggers the transition to this state.</br>Only one signal per program can be used.</br>The available predefined signals are "mouse,in", "mouse,out", "mouse,move", "mouse,down,*", "mouse,up,*", "mouse,wheel,0,*", etc.";
+            }
+            source { "Specifies a source which filters the incoming signals depending on the sender name.</br>The part name which receives the signal is used as the source name (e.g. If a user does mouse down to a part named "abc", then "mouse,down,*" signal and "abc" source can catches this event.).</br>Only one source per program can be used.";
+            }
+            target { "Specifies a program or a part on which the specified action acts.";
+            }
+            transition { "transition [type] [length] (interp val 1) (interp val 2) (option)</br>Defines how transitions occur using STATE_SET action.</br>[type] is the style of the transition and [length] is a double specifying the number of seconds in which to preform the transition.</br>The available types are LINEAR, SINUSOIDAL, ACCELERATE, ACCELERATE_FACTOR, DECELERATE_FACTOR, SINUSOIDAL_FACTOR, DIVISOR_INTERP, BOUNCE, and SPRING";
+            }
+         }
+      }
+
+      script { "The <hilight>script</hilight> block is used to inject embryo scripts to a given Edje theme and it functions in two modalities. When it is included inside a program block, the script is executed every time the program is run, on the other hand, when included directly into a group, part, or description block, it is executed once at the load time, in the load order.";
+      }
+
+      sounds { "The <hilight>sounds</hilight> block contains a list of one or more sound samples and tone items.";
+         sample { "The <hilight>sample</hilight> block defines the sound sample.";
+            name { "Used to include each sound file. Valid types are RAW, COMP, LOSSY, and AS_IS.";
+            }
+            source { "The sound source file name.";
+            }
+         }
+         tone { "A sound of the given frequency.";
+         }
+      }
+
+      styles { "The <hilight>styles</hilight> block contains a list of one or more <hilight>style</hilight> blocks.</br>The <hilight>style</hilight> block is used to create style <tags> for advanced TEXTBLOCK formatting.";
+         style { "The <hilight>style</hilight> block is used to create style <tags> for advanced TEXTBLOCK formatting.";
+            base { "The <hilight>base</hilight> represents style properties that are applied to the text.</br>The available tags that can be used in the style property are as follows.</br>font, font_size, color, color_class, text_class, ellipsis, wrap, style, valign, and align.";
+            }
+            name { "The name of the style to be used as reference later in the theme.";
+            }
+            tag { "The <hilight>tag</hilight> defines the meaning of each tag in the style.</br>Style is applied to the text between the beginning tag <tags> and the ending tag </tags>.";
+            }
+         }
+      }
+   }
+
+   images { "The <hilight>images</hilight> block is used to list each image file which are used in the theme. If any compression method is used, it is also defined here.";
+      image { "The <hilight>image</hilight> represents an image file which is used in the theme. If any compression method is used, it is also defined here.";
+      }
+      set { "The <hilight>set</hilight> block is used to define an image with different content depending on their size.";
+         image { "The <hilight>image</hilight> block inside the <hilight>set</hilight> block defines the characteristic of an image. Every block describes one image and the size rule to use it.";
+            size { "Defines the minimum and maximum size that selects the specified image.";
+            }
+            image { "This is included in each image file. Available compression methods are RAW, COMP, LOSSY, and USER.";
+            }
+         }
+         name { "Defines the name that refer to this image description.";
+         }
+      }
+   }
+
+   sounds { "The <hilight>sounds</hilight> block contains a list of one or more sound samples and tone items.";
+      sample { "The <hilight>sample</hilight> block defines the sound sample.";
+         name { "Used to include each sound file. Valid types are RAW, COMP, LOSSY, and AS_IS.";
+         }
+         source { "The sound source file name.";
+         }
+      }
+      tone { "A sound of the given frequency.";
+      }
+   }
+
+   styles { "The <hilight>styles</hilight> block contains a list of one or more <hilight>style</hilight> blocks.</br>The <hilight>style</hilight> block is used to create style <tags> for advanced TEXTBLOCK formatting.";
+      style { "The <hilight>style</hilight> block is used to create style <tags> for advanced TEXTBLOCK formatting.";
+         base { "The <hilight>base</hilight> represents style properties that are applied to the text.</br>The available tags that can be used in the style property are as follows.</br>font, font_size, color, color_class, text_class, ellipsis, wrap, style, valign, and align.";
+         }
+         name { "The name of the style to be used as reference later in the theme.";
+         }
+         tag { "The <hilight>tag</hilight> defines the meaning of each tag in the style.</br>Style is applied to the text between the beginning tag <tags> and the ending tag </tags>.";
+         }
+      }
+   }
+}
+
+color_classes { "The <hilight>color_classes</hilight> block contains a list of one or more <hilight>color_class</hilight> blocks.</br>Each <hilight>color_class</hilight> allows designers to name an arbitary group of colors to be used in the theme, the application can use that name to alter the color values at runtime.";
+   color_class { "The <hilight>color_class</hilight> allows designers to name an arbitrary group of colors to be used in the theme, the application can use that name to alter the color values at runtime.";
+      color { "The main color.";
+      }
+      color2 { "Used as outline in text and textblock parts.";
+      }
+      color3 { "Used as shadow in text and textblock parts.";
+      }
+      name { "Sets the name for the color class, used as reference by both the theme and the application.";
+      }
+   }
+}
+
+data { "The <hilight>data</hilight> block is used to pass arbitrary parameters from the theme to the application.";
+   file { "Defines a new parameter, the value is the contents of the specified file formatted as a single string of text.</br>This property only works with plain text files.";
+   }
+   item { "Defines a new parameter, the value is the string specified next to it.";
+   }
+}
+
+fonts { "The <hilight>fonts</hilight> block is used to list each font file with an alias used later in the theme.";
+   font { "Defines each font file and alias.";
+   }
+}
+
+images { "The <hilight>images</hilight> block is used to list each image file which are used in the theme. If any compression method is used, it is also defined here.";
+   image { "The <hilight>image</hilight> represents an image file which is used in the theme. If any compression method is used, it is also defined here.";
+   }
+   set { "The <hilight>set</hilight> block is used to define an image with different content depending on their size.";
+      image { "The <hilight>image</hilight> block inside the <hilight>set</hilight> block defines the characteristic of an image. Every block describes one image and the size rule to use it.";
+         size { "Defines the minimum and maximum size that selects the specified image.";
+         }
+         image { "This is included in each image file. Available compression methods are RAW, COMP, LOSSY, and USER.";
+         }
+      }
+      name { "Defines the name that refer to this image description.";
+      }
+   }
+}
+
+styles { "The <hilight>styles</hilight> block contains a list of one or more <hilight>style</hilight> blocks.</br>The <hilight>style</hilight> block is used to create style <tags> for advanced TEXTBLOCK formatting.";
+   style { "The <hilight>style</hilight> block is used to create style <tags> for advanced TEXTBLOCK formatting.";
+      base { "The <hilight>base</hilight> represents style properties that are applied to the text.</br>The available tags that can be used in the style property are as follows.</br>font, font_size, color, color_class, text_class, ellipsis, wrap, style, valign, and align.";
+      }
+      name { "The name of the style to be used as reference later in the theme.";
+      }
+      tag { "The <hilight>tag</hilight> defines the meaning of each tag in the style.</br>Style is applied to the text between the beginning tag <tags> and the ending tag </tags>.";
+      }
+   }
+}
diff --git a/data/sounds/EDC_EDITOR_EMBEDDED_TAP.wav b/data/sounds/EDC_EDITOR_EMBEDDED_TAP.wav
new file mode 100644 (file)
index 0000000..eecd4e3
Binary files /dev/null and b/data/sounds/EDC_EDITOR_EMBEDDED_TAP.wav differ
diff --git a/data/sounds/Makefile.am b/data/sounds/Makefile.am
new file mode 100644 (file)
index 0000000..4c61a43
--- /dev/null
@@ -0,0 +1,6 @@
+MAINTAINERCLEANFILES = Makefile.in
+filesdir = $(datadir)/$(PACKAGE)/sounds
+files_DATA = \
+EDC_EDITOR_EMBEDDED_TAP.wav
+
+EXTRA_DIST = $(files_DATA)
diff --git a/data/templates/2.3-templates/Basic.edc b/data/templates/2.3-templates/Basic.edc
new file mode 100644 (file)
index 0000000..4b699e7
--- /dev/null
@@ -0,0 +1,75 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+            description { state: "clicked" 0.0;
+               rel1.relative: 0.65 0.15;
+               rel2.relative: 0.85 0.35;
+               color: 170 136 0 255;
+            }
+         }
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: OUTLINE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 0.5 1.0;
+               color: 0 150 221 255;
+               color2: 0 150 221 155;
+               text {
+                  size: 20;
+                  font: "Sans";
+                  text: "EDC Editor";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+         part { name: "content";
+            type: SWALLOW;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+      /*
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "rect";
+            action: STATE_SET "clicked" 0.0;
+            target: "rect";
+         }
+         program { name: "mouse_up";
+            signal: "mouse,up,1";
+            source: "rect";
+            action: STATE_SET "default" 0.0;
+            target: "rect";
+         }
+      }
+      */
+   }
+}
diff --git a/data/templates/2.3-templates/Clip.edc b/data/templates/2.3-templates/Clip.edc
new file mode 100644 (file)
index 0000000..822a353
--- /dev/null
@@ -0,0 +1,31 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "clipper";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 1.0;
+               color: 0 136 170 255;
+            }
+         }
+         part { name: "logo";
+            type: IMAGE;
+            clip_to: "clipper";
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3-templates/CustomButton.edc b/data/templates/2.3-templates/CustomButton.edc
new file mode 100644 (file)
index 0000000..db73633
--- /dev/null
@@ -0,0 +1,456 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+#define ICON     1
+#define LABEL    2
+#define MASK     3
+#define DISABLE  4
+#define PRESSED  8
+#define BACKGROUND  16
+      script {
+         public btmode;
+         public eval_mode(m) {
+            new m1 = m & MASK;
+            new d = m & DISABLE;
+            new p = m & PRESSED;
+            new bg = m & BACKGROUND;
+            if (bg) {
+               set_state(PART:"base", "hidden", 0.0);
+               set_state(PART:"elm.swallow.background", "visible", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.background", "default", 0.0);
+               if (!d) {
+                  if (!p)
+                  {
+                     set_state(PART:"base", "default", 0.0);
+                     set_state(PART:"base", "default", 0.0);
+                  }
+                  else {
+                     set_state(PART:"base", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"base", "disabled", 0.0);
+               }
+            }
+            if (m1 == (ICON | LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p) {
+                     set_state(PART:"elm.text", "visible", 0.0);
+                     set_state(PART:"icon_clip", "default", 0.0);
+                  } else {
+                     set_state(PART:"elm.text", "pressed_visible", 0.0);
+                     set_state(PART:"icon_clip", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"elm.text", "disabled_visible", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (ICON)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  else
+                  set_state(PART:"icon_clip", "pressed", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"elm.text", "textonly", 0.0);
+                  else
+                  set_state(PART:"elm.text", "pressed_textonly", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"elm.text", "disabled_textonly", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "base";
+            type: IMAGE;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               image.middle: SOLID;
+               rel1.offset: -1 0;
+               rel2.offset: 0 1;
+               fill.smooth: 0;
+               color_class: "button_bg";
+            }
+            description { state: "hovered" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            description { state: "pressed" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+               color_class: "button_bg_pressed";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               color_class: "button_bg_disabled";
+            }
+            description { state: "hidden" 0.0;
+               inherit: "default";
+               visible: 0;
+            }
+         }
+         part { name: "elm.swallow.background";
+            type: SWALLOW;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "base";
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "icon_clip";
+            type: RECT;
+            description { state: "default" 0.0;
+               color_class: "button_icon";
+            }
+            description { state: "pressed" 0.0;
+               inherit: "default";
+               color_class: "button_icon_pressed";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               color_class: "button_icon_disabled";
+            }
+         }
+         part { name: "elm.swallow.content";
+            type: SWALLOW;
+            mouse_events: 0;
+            clip_to: "icon_clip";
+            description { state: "default" 0.0;
+               fixed: 1 0;
+               align: 0.0 0.5;
+               rel1.offset: 6 5;
+               rel1.to: "base";
+               rel2.relative: 0.0 1.0;
+               rel2.offset: 6 -8;
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               fixed: 1 0;
+               aspect: 1.0 1.0;
+               visible: 1;
+            }
+            description { state: "icononly" 0.0;
+               inherit: "default";
+               fixed: 0 0;
+               align: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               rel2.offset: -7 -8;
+               visible: 1;
+            }
+         }
+         part { name: "sizer.content";
+            type: TEXT;
+            mouse_events: 0;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 0;
+               text {
+                  font: FN;
+                  size: 10;
+                  min: 0 0;
+                  text_class: "button_text";
+               }
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+            description { state: "icononly" 0.0;
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+         }
+         part { name: "elm.text";
+            type: TEXT;
+            mouse_events: 0;
+            effect: SHADOW BOTTOM;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.offset: 0 5;
+               rel1.relative: 1.0 0.0;
+               rel1.to_x: "elm.swallow.content";
+               rel1.to_y: "base";
+               rel2.offset: -8 -8;
+               rel2.to: "base";
+               color_class: "button_text";
+               color3: 255 255 255 255;
+               text {
+                  font: FN;
+                  size: 10;
+                  align: 0.5 0.5;
+                  min: 0 0;
+                  text_class: "button";
+               }
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "pressed_visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            description { state: "textonly" 0.0;
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "pressed_textonly" 0.0;
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            description { state: "disabled_visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "disabled_textonly" 0.0;
+               inherit: "default";
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+         }
+         part { name: "event";
+            type: RECT;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               visible: 0;
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,press" "elm";
+            after: "button_click_anim";
+         }
+         program { name: "button_click_anim";
+            script {
+               new m = get_int(btmode);
+               m |= PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_unclick";
+            signal: "mouse,up,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,unpress" "elm";
+            after: "button_unclick_anim";
+         }
+         program { name: "button_unclick_anim";
+            script {
+               new m = get_int(btmode);
+               m &= ~PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_hover";
+            signal: "mouse,in";
+            source: "event";
+            action: STATE_SET "hovered" 0.0;
+            target: "base";
+         }
+         program { name: "button_unhover";
+            signal: "mouse,out";
+            source: "event";
+            action: STATE_SET "default" 0.0;
+            target: "base";
+         }
+         program { name: "buttonactivate";
+            signal: "elm,anim,activate";
+            source: "elm";
+            action: STATE_SET "pressed" 0.0;
+            target: "base";
+            after: "button_unpressed_anim";
+         }
+         program { name: "button_unpressed_anim";
+            action: STATE_SET "default" 0.0;
+            in: 0.5 0.0;
+            target: "base";
+         }
+         program { name: "mouse_click";
+            signal: "mouse,clicked,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,click" "elm";
+         }
+         program { name: "button_text_visible";
+            signal: "elm,state,text,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_text_hidden";
+            signal: "elm,state,text,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_icon_visible";
+            signal: "elm,state,icon,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_icon_hidden";
+            signal: "elm,state,icon,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_background_visible";
+            signal: "elm,state,background,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_background_hidden";
+            signal: "elm,state,background,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_state_disabled";
+            signal: "elm,state,disabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_state_enabled";
+            signal: "elm,state,enabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+      }
+#undef ICON
+#undef LABEL
+#undef MASK
+#undef DISABLE
+#undef PRESSED
+#undef BACKGROUND
+   }
+}
diff --git a/data/templates/2.3-templates/Empty.edc b/data/templates/2.3-templates/Empty.edc
new file mode 100644 (file)
index 0000000..7f34dd8
--- /dev/null
@@ -0,0 +1,7 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3-templates/Group.edc b/data/templates/2.3-templates/Group.edc
new file mode 100644 (file)
index 0000000..8853b12
--- /dev/null
@@ -0,0 +1,41 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+         }
+         part { name: "group";
+            type: GROUP;
+            source: "my_group";
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+   }
+   group { name: "my_group";
+      parts {
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            description { state: "default" 0.0;
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 30;
+                  font: "Sans";
+                  text: "My Group";
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3-templates/Image.edc b/data/templates/2.3-templates/Image.edc
new file mode 100644 (file)
index 0000000..73a4d4b
--- /dev/null
@@ -0,0 +1,22 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3-templates/Listitem.edc b/data/templates/2.3-templates/Listitem.edc
new file mode 100644 (file)
index 0000000..8627bf9
--- /dev/null
@@ -0,0 +1,285 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 233 242 242 255;
+               align: 0.5 0.5;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               min: 300 60;
+               max: 99999 60;
+               fixed: 1 1;
+            }
+         }
+         part { name: "point_rect";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 176 137 255;
+               align: 0.0 0.0;
+               rel1.to: "bg";
+               rel1.relative: 0.0 0.0;
+               rel2.to: "bg";
+               min: 5 0;
+               max: 5 99999;
+               fixed: 1 0;
+            }
+         }
+         part { name: "padding_left";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "point_rect";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "point_rect";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "icon_status";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png";
+               align: 0.0 0.5;
+               rel1.to: "padding_left";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_left";
+               rel2.relative: 0.0 0.5;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "icon_user";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "icon_status";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_status";
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "user_name";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 130 130 130 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Lisa";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to: "icon_user";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_user";
+               min: 100 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "message";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 145 145 145 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "How are you? I'm fine, thank you, and you?";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to_x: "padding_left";
+               rel1.to_y: "padding_icon";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "padding_icon";
+               rel2.relative: 0.0 1.0;
+               min: 200 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "padding_right";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "bg";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "bg";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 135 135 135 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "21 Mar.";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.5;
+               min: 40 20;
+               max: 40 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "icon_clip";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png";
+               align: 1.0 0.5;
+               rel1.to: "date";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "date";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png";
+            }
+         }
+         part { name: "icon_badge";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_clip";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_clip";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png";
+            }
+         }
+         part { name: "icon_lock";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_badge";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_badge";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png";
+            }
+         }
+         part { name: "icon_check";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.5;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.9;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "padding_icon";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "icon_check";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_check";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down_lock";
+            signal: "mouse,down,1";
+            source: "icon_lock";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_lock";
+         }
+         program { name: "mouse_up_lock";
+            signal: "mouse,up,1";
+            source: "icon_lock";
+            action: STATE_SET "default" 0.0;
+            target: "icon_lock";
+         }
+         program { name: "mouse_down_badge";
+            signal: "mouse,down,1";
+            source: "icon_badge";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_badge";
+         }
+         program { name: "mouse_up_badge";
+            signal: "mouse,up,1";
+            source: "icon_badge";
+            action: STATE_SET "default" 0.0;
+            target: "icon_badge";
+         }
+         program { name: "mouse_down_clip";
+            signal: "mouse,down,1";
+            source: "icon_clip";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_clip";
+         }
+         program { name: "mouse_up_clip";
+            signal: "mouse,up,1";
+            source: "icon_clip";
+            action: STATE_SET "default" 0.0;
+            target: "icon_clip";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3-templates/Makefile.am b/data/templates/2.3-templates/Makefile.am
new file mode 100644 (file)
index 0000000..a9ad78a
--- /dev/null
@@ -0,0 +1,105 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EDJE_CC = @edje_cc@
+EDJE_FLAGS = -id $(top_srcdir)/data/images -sd $(top_srcdir)/data/sounds
+
+filesdir = $(datadir)/$(PACKAGE)/templates/2.3-templates
+files_DATA = Basic.edc \
+             Basic.edj \
+             CustomButton.edc \
+             CustomButton.edj \
+             Clip.edc \
+             Clip.edj \
+             Empty.edc \
+             Empty.edj \
+             Group.edc \
+             Group.edj \
+             Image.edc \
+             Image.edj \
+             Listitem.edc \
+             Listitem.edj \
+             MobileLayout.edc \
+             MobileLayout.edj \
+             MouseEvent.edc \
+             MouseEvent.edj \
+             Proxy.edc \
+             Proxy.edj \
+             Rect.edc \
+             Rect.edj \
+             Spacer.edc \
+             Spacer.edj \
+             Text.edc \
+             Text.edj \
+             Textblock.edc \
+             Textblock.edj \
+             Transition.edc \
+             Transition.edj \
+             Tween.edc \
+             Tween.edj \
+             Watchface.edc \
+             Watchface.edj \
+             Watchface2.edc \
+             Watchface2.edj
+
+EXTRA_DIST = $(files_DATA)
+
+srcdir = $(top_srcdir)/data/templates/2.3-templates
+builddir = $(top_builddir)/data/templates/2.3-templates
+
+Basic.edj: Makefile Basic.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Basic.edc $(builddir)/Basic.edj
+
+CustomButton.edj: Makefile CustomButton.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/CustomButton.edc $(builddir)/CustomButton.edj
+
+Empty.edj: Makefile Empty.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Empty.edc $(builddir)/Empty.edj
+
+MobileLayout.edj: Makefile MobileLayout.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MobileLayout.edc $(builddir)/MobileLayout.edj
+
+MouseEvent.edj: Makefile MouseEvent.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MouseEvent.edc $(builddir)/MouseEvent.edj
+
+Textblock.edj: Makefile Textblock.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Textblock.edc $(builddir)/Textblock.edj
+
+Transition.edj: Makefile Transition.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Transition.edc $(builddir)/Transition.edj
+
+Tween.edj: Makefile Tween.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Tween.edc $(builddir)/Tween.edj
+
+Rect.edj: Makefile Rect.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Rect.edc $(builddir)/Rect.edj
+
+Group.edj: Makefile Group.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Group.edc $(builddir)/Group.edj
+
+Listitem.edj: Makefile Listitem.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Listitem.edc $(builddir)/Listitem.edj
+
+Image.edj: Makefile Image.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Image.edc $(builddir)/Image.edj
+
+Text.edj: Makefile Text.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Text.edc $(builddir)/Text.edj
+
+Proxy.edj: Makefile Proxy.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Proxy.edc $(builddir)/Proxy.edj
+
+Clip.edj: Makefile Clip.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Clip.edc $(builddir)/Clip.edj
+
+Spacer.edj: Makefile Spacer.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Spacer.edc $(builddir)/Spacer.edj
+
+Watchface.edj: Makefile Watchface.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface.edc $(builddir)/Watchface.edj
+
+Watchface2.edj: Makefile Watchface2.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface2.edc $(builddir)/Watchface2.edj
+
+clean-local:
+       rm -f *.edj
+       rm -f $(datadir)/$(PACKAGE)/templates/2.3-templates/*edj
diff --git a/data/templates/2.3-templates/MobileLayout.edc b/data/templates/2.3-templates/MobileLayout.edc
new file mode 100644 (file)
index 0000000..a2491a5
--- /dev/null
@@ -0,0 +1,509 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png" COMP;
+      }
+      parts {
+         part { name: "base";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 200 300;
+            }
+         }
+         /* Header */
+         part { name: "header";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 200 0 0 255;
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel2.to: "base";
+               rel2.relative: 1.0 0.1;
+               min: 0 40;
+               max: 9999 40;
+               fixed: 0 1;
+            }
+         }
+         part { name: "header_padding";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "header";
+               rel2.to: "header";
+               max: 10 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "header_button_panel_open";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               color: 125 125 125 255;
+            }
+         }
+         part { name: "header_button_panel_close";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "header_title";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "TITLE";
+                  min: 0 0;
+               }
+               rel1.to: "header";
+               rel2.to: "header";
+            }
+         }
+         /* Content */
+         part { name: "content_padding_top";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "header";
+               min: 0 5;
+               fixed: 0 1;
+            }
+         }
+         part { name: "content_main";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 30 46 93 255;
+               align: 0.5 0.0;
+               rel1.to: "content_padding_top";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 5 0;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_main_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add main content";
+                  min: 0 0;
+               }
+               rel1.to: "content_main";
+               rel2.to: "content_main";
+            }
+         }
+         part { name: "content_padding_middle";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel1.relative: 0.0 0.5;
+               rel2.to: "base";
+               max: 0 5;
+            }
+         }
+         part { name: "content_sub_1";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 136 170 255;
+               align: 0.0 0.0;
+               rel1.to: "content_padding_middle";
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 0.5 0.85;
+               rel2.offset: 0 0;
+            }
+         }
+         part { name: "content_sub_1_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 1";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_1";
+               rel2.to: "content_sub_1";
+            }
+         }
+         part { name: "content_sub_2";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 66 118 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.0;
+               rel1.offset: 5 0;
+               rel2.to_x: "base";
+               rel2.to_y: "content_sub_1";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_sub_2_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 2";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_2";
+               rel2.to: "content_sub_2";
+            }
+         }
+         part { name: "content_sub_3";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 83 66 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.5;
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.85;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_sub_3_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 3";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_3";
+               rel2.to: "content_sub_3";
+            }
+         }
+         part { name: "content_bottom";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 95 95 95 255;
+               rel1.to: "content_sub_1";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 0 5;
+               rel2.to: "base";
+               rel2.offset: -5 -5;
+            }
+         }
+         part { name: "content_bottom_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add bottom content";
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "content_bottom";
+               rel2.to: "content_bottom";
+            }
+         }
+         /* Mask */
+         part { name: "mask";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 155;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         /* Panel */
+         part { name: "panel_base";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               rel2.relative: 0.7 1.0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_1";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 94 0 255;
+               rel1.to: "panel_base";
+               rel1.offset: 0 1;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.15;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_1_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Add";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "panel_content_1";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_1";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_2";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 130 36 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.15;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.30;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_2_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Your";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_2";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_2";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_3";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 166 72 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.30;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.45;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_3_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Content";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_3";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_3";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_4";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 202 108 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.45;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.60;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_4_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "in Swallow";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_4";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_4";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_swallow";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 0;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.6;
+               rel1.offset: 5 5;
+               rel2.to: "panel_base";
+               rel2.offset: -5 -5;
+
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+      }
+      programs {
+         program { name: "panel_open";
+            signal: "mouse,down,1";
+            source: "header_button_panel_open";
+            action: STATE_SET "clicked" 0.0;
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+         program { name: "panel_close";
+            signal: "mouse,down,1";
+            source: "header_button_panel_close";
+            action: STATE_SET "default" 0.0;
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3-templates/MouseEvent.edc b/data/templates/2.3-templates/MouseEvent.edc
new file mode 100644 (file)
index 0000000..2516cf9
--- /dev/null
@@ -0,0 +1,84 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+      parts {
+         part { name:  "button_shadow";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 155;
+               rel1.to: "button_bg";
+               rel1.offset: 5 5;
+               rel2.to: "button_bg";
+               rel2.offset: 4 4;
+            }
+         }
+         part { name:  "button_bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               min: 50 20;
+               max: 200 50;
+            }
+            description { state: "hovered" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+            }
+         }
+         part { name: "button_text";
+            type: TEXT;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               color: 70 70 70 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Mouse Event Example";
+               }
+               rel1.to: "button_bg";
+               rel2.to: "button_bg";
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "button_bg";
+            action: STATE_SET "clicked" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_up";
+            signal: "mouse,up,1";
+            source: "button_bg";
+            action: STATE_SET "hovered" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_in";
+            signal: "mouse,in";
+            source: "button_bg";
+            action: STATE_SET "hovered" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_out";
+            signal: "mouse,out";
+            source: "button_bg";
+            action: STATE_SET "default" 0.0;
+            target: "button_bg";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3-templates/Proxy.edc b/data/templates/2.3-templates/Proxy.edc
new file mode 100644 (file)
index 0000000..be768b0
--- /dev/null
@@ -0,0 +1,32 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         part { name: "proxy";
+            type: PROXY;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               aspect: 1 1;
+               aspect_preference: BOTH;
+               source: "logo";
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3-templates/Rect.edc b/data/templates/2.3-templates/Rect.edc
new file mode 100644 (file)
index 0000000..5187a38
--- /dev/null
@@ -0,0 +1,15 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3-templates/Spacer.edc b/data/templates/2.3-templates/Spacer.edc
new file mode 100644 (file)
index 0000000..b2e8961
--- /dev/null
@@ -0,0 +1,39 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "spacer1";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 50 50;
+               fixed: 1 1;
+               align: 0 0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.0 0.0;
+            }
+         }
+         part { name: "spacer2";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 50 50;
+               fixed: 1 1;
+               align: 1 1;
+               rel1.relative: 1.0 1.0;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.to: "spacer1";
+               rel1.relative: 1.0 1.0;
+               rel2.to: "spacer2";
+               rel2.relative: 0.0 0.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3-templates/Text.edc b/data/templates/2.3-templates/Text.edc
new file mode 100644 (file)
index 0000000..3a4da74
--- /dev/null
@@ -0,0 +1,24 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 50;
+                  font: "Sans";
+                  text: "TEXT";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3-templates/Textblock.edc b/data/templates/2.3-templates/Textblock.edc
new file mode 100644 (file)
index 0000000..f16f0c3
--- /dev/null
@@ -0,0 +1,133 @@
+collections {
+   base_scale: 1.0;
+   styles {
+      style { name: "basic_style";
+         base: "font="Sans" font_size=20 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0088AA64 valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { name: "wrap_none_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF0000 valign=0.5 wrap=none align=center";
+      }
+      style { name: "wrap_char_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF5E00 valign=0.5 wrap=char align=center";
+      }
+      style { name: "wrap_word_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FFBB00 valign=0.5 wrap=word align=center";
+      }
+      style { name: "wrap_mixed_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#1DDB16 valign=0.5 wrap=mixed align=center";
+      }
+      style { name: "ellipsis_1_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0054FF valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { name: "ellipsis_0_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#5F00FF valign=0.5 ellipsis=0.0 wrap=none align=center";
+      }
+   }
+   group { name: "main";
+      parts {
+         part { name: "text_block";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  style: "basic_style";
+                  text: "Try resizing view!";
+                  min: 0 1;
+               }
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.1;
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_none";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_block";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.25;
+               text {
+                  style: "wrap_none_style";
+                  text: "[wrap = none] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_char";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_none";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.4;
+               text {
+                  style: "wrap_char_style";
+                  text: "[wrap = char] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_word";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_char";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.55;
+               text {
+                  style: "wrap_word_style";
+                  text: "[wrap = word] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_mixed";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_word";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.7;
+               text {
+                  style: "wrap_mixed_style";
+                  text: "[wrap = mixed] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_ellipsis_1";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_mixed";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.85;
+               text {
+                  style: "ellipsis_1_style";
+                  text: "[ellipsis = 1] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_ellipsis_0";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_ellipsis_1";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 1.0;
+               text {
+                  style: "ellipsis_0_style";
+                  text: "[ellipsis = 0] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3-templates/Transition.edc b/data/templates/2.3-templates/Transition.edc
new file mode 100644 (file)
index 0000000..e924788
--- /dev/null
@@ -0,0 +1,36 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.25 0.25;
+               color: 255 255 0 255;
+            }
+            description { state: "changed" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+      programs {
+         program { name: "anim1";
+            signal: "load";
+            source: "";
+            action: STATE_SET "changed" 0.0;
+            target: "rect";
+            transition: ACCELERATE 1;
+            after: "anim2";
+         }
+         program { name: "anim2";
+            action: STATE_SET "default" 0.0;
+            target: "rect";
+            transition: DECELERATE 2;
+            after: "anim1";
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3-templates/Tween.edc b/data/templates/2.3-templates/Tween.edc
new file mode 100644 (file)
index 0000000..9e39724
--- /dev/null
@@ -0,0 +1,52 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-01.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-02.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-03.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-04.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-05.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-06.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-07.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-08.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-09.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-10.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-11.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-12.png" COMP;
+      }
+      parts {
+         part { name: "image";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_TRIAB-01.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-02.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-03.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-04.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-05.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-06.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-07.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-08.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-09.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-10.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-11.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-12.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+      programs {
+         program { name: "tween_anim";
+            signal: "load";
+            source: "";
+            action: STATE_SET "default" 0.0;
+            transition: LINEAR 1;
+            target: "image";
+            after: "tween_anim";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3-templates/Watchface.edc b/data/templates/2.3-templates/Watchface.edc
new file mode 100644 (file)
index 0000000..6b7e158
--- /dev/null
@@ -0,0 +1,257 @@
+collections {
+   base_scale: 1;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE.png";
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+               fixed: 1 1;
+            }
+         }
+         part { name: "moonphase_moon";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png";
+               rel1.to: "moonphase_cover";
+               rel2.to: "moonphase_cover";
+               fixed: 1 1;
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "moonphase_cover";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png";
+               min: 130 130;
+               align: 0.5 1.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 1;
+               rel2.relative: 0.5 1;
+               fixed: 1 1;
+            }
+         }
+         part { name: "month_stroke";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.15 0.15;
+               rel2.relative: 0.85 0.85;
+               map.on: 1;
+            }
+            description { state: "feb" 0.0;
+               inherit: "default";
+               map.rotation.z: 20;
+            }
+            description { state: "mar" 0.0;
+               inherit: "default";
+               map.rotation.z: 40;
+            }
+            description { state: "apr" 0.0;
+               inherit: "default";
+               map.rotation.z: 60;
+            }
+            description { state: "may" 0.0;
+               inherit: "default";
+               map.rotation.z: 80;
+            }
+            description { state: "jun" 0.0;
+               inherit: "default";
+               map.rotation.z: 100;
+            }
+            description { state: "jul" 0.0;
+               inherit: "default";
+               map.rotation.z: 120;
+            }
+            description { state: "aug" 0.0;
+               inherit: "default";
+               map.rotation.z: 140;
+            }
+            description { state: "sep" 0.0;
+               inherit: "default";
+               map.rotation.z: 160;
+            }
+            description { state: "oct" 0.0;
+               inherit: "default";
+               map.rotation.z: 180;
+            }
+            description { state: "nov" 0.0;
+               inherit: "default";
+               map.rotation.z: 200;
+            }
+            description { state: "dec" 0.0;
+               inherit: "default";
+               map.rotation.z: 220;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+               scale: 1;
+               description { state: "default" 0.0;
+                  color: 0 0 0 255;
+                  fixed: 1 1;
+                  text {
+                     size: 11;
+                     font: "Sans";
+                     text: "18";
+                     align: 0.5 0.5;
+                     min: 0 0;
+                  }
+                  min: 30 30;
+                  align: 0.5 1.0;
+                  fixed: 1 1;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.922 0.545;
+                  rel2.relative: 0.922 0.545;
+               }
+            }
+            part { name: "hour";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 35 0;
+                  fixed: 1 0;
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+            part { name: "minute";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 35 0;
+                  fixed: 1 0;               
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+            part { name: "second";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 25 0;
+                  fixed: 1 0;                 
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+         }
+         programs {
+            program { name: "load";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "moonphase_moon";
+               transition: LINEAR 30;
+               after: "reset";
+            }
+            program { name: "reset";
+               action: STATE_SET "default" 0.0;
+               target: "moonphase_moon";
+               after: "load";
+            }
+            program { name: "hour_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "hour";
+               transition: LINEAR 216000;
+               after: "hour_reset";
+            }
+            program { name: "hour_reset";
+               action: STATE_SET "default" 0.0;
+               target: "hour";
+               after: "hour_begin";
+            }
+            program { name: "minute_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "minute";
+               transition: LINEAR 3600;
+               after: "minute_begin";
+            }
+            program { name: "minute_reset";
+               action: STATE_SET "default" 0.0;
+               target: "minute";
+               after: "minute_begin";
+            }
+            program { name: "second_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "second";
+               transition: LINEAR 60;
+               after: "second_reset";
+            }
+            program { name: "second_reset";
+               action: STATE_SET "default" 0.0;
+               target: "second";
+               after: "second_begin";
+            }
+         }
+      }
+   }
\ No newline at end of file
diff --git a/data/templates/2.3-templates/Watchface2.edc b/data/templates/2.3-templates/Watchface2.edc
new file mode 100644 (file)
index 0000000..ab84421
--- /dev/null
@@ -0,0 +1,206 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 1;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png";
+               //aspect: 1 1;
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 219 219 219 255;
+               fixed: 1 1;
+               text {
+                  size: 13;
+                  font: "Sans";
+                  text: "19";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               min: 30 30;
+               align: 0.5 1.0;
+               fixed: 1 1;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.795 0.545;
+               rel2.relative: 0.795 0.545;
+            }
+         }
+         part { name: "meridiem";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 120 0 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "AM";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.9 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         part { name: "time";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 250 250 250 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "12:00";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.5 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         part { name: "hour";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "minute";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;               
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "second";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;                 
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+      }
+      programs {
+         program { name: "load";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "bg";
+            transition: LINEAR 30;
+            after: "reset";
+         }
+         program { name: "reset";
+            action: STATE_SET "default" 0.0;
+            target: "bg";
+            after: "load";
+         }
+         program { name: "hour_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "hour";
+            transition: LINEAR 216000;
+            after: "hour_reset";
+         }
+         program { name: "hour_reset";
+            action: STATE_SET "default" 0.0;
+            target: "hour";
+            after: "hour_begin";
+         }
+         program { name: "minute_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "minute";
+            transition: LINEAR 3600;
+            after: "minute_begin";
+         }
+         program { name: "minute_reset";
+            action: STATE_SET "default" 0.0;
+            target: "minute";
+            after: "minute_begin";
+         }
+         program { name: "second_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "second";
+            transition: LINEAR 60;
+            after: "second_reset";
+         }
+         program { name: "second_reset";
+            action: STATE_SET "default" 0.0;
+            target: "second";
+            after: "second_begin";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.1-templates/Basic.edc b/data/templates/2.3.1-templates/Basic.edc
new file mode 100644 (file)
index 0000000..4b699e7
--- /dev/null
@@ -0,0 +1,75 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+            description { state: "clicked" 0.0;
+               rel1.relative: 0.65 0.15;
+               rel2.relative: 0.85 0.35;
+               color: 170 136 0 255;
+            }
+         }
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: OUTLINE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 0.5 1.0;
+               color: 0 150 221 255;
+               color2: 0 150 221 155;
+               text {
+                  size: 20;
+                  font: "Sans";
+                  text: "EDC Editor";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+         part { name: "content";
+            type: SWALLOW;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+      /*
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "rect";
+            action: STATE_SET "clicked" 0.0;
+            target: "rect";
+         }
+         program { name: "mouse_up";
+            signal: "mouse,up,1";
+            source: "rect";
+            action: STATE_SET "default" 0.0;
+            target: "rect";
+         }
+      }
+      */
+   }
+}
diff --git a/data/templates/2.3.1-templates/Clip.edc b/data/templates/2.3.1-templates/Clip.edc
new file mode 100644 (file)
index 0000000..822a353
--- /dev/null
@@ -0,0 +1,31 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "clipper";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 1.0;
+               color: 0 136 170 255;
+            }
+         }
+         part { name: "logo";
+            type: IMAGE;
+            clip_to: "clipper";
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.1-templates/CustomButton.edc b/data/templates/2.3.1-templates/CustomButton.edc
new file mode 100644 (file)
index 0000000..db73633
--- /dev/null
@@ -0,0 +1,456 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+#define ICON     1
+#define LABEL    2
+#define MASK     3
+#define DISABLE  4
+#define PRESSED  8
+#define BACKGROUND  16
+      script {
+         public btmode;
+         public eval_mode(m) {
+            new m1 = m & MASK;
+            new d = m & DISABLE;
+            new p = m & PRESSED;
+            new bg = m & BACKGROUND;
+            if (bg) {
+               set_state(PART:"base", "hidden", 0.0);
+               set_state(PART:"elm.swallow.background", "visible", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.background", "default", 0.0);
+               if (!d) {
+                  if (!p)
+                  {
+                     set_state(PART:"base", "default", 0.0);
+                     set_state(PART:"base", "default", 0.0);
+                  }
+                  else {
+                     set_state(PART:"base", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"base", "disabled", 0.0);
+               }
+            }
+            if (m1 == (ICON | LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p) {
+                     set_state(PART:"elm.text", "visible", 0.0);
+                     set_state(PART:"icon_clip", "default", 0.0);
+                  } else {
+                     set_state(PART:"elm.text", "pressed_visible", 0.0);
+                     set_state(PART:"icon_clip", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"elm.text", "disabled_visible", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (ICON)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  else
+                  set_state(PART:"icon_clip", "pressed", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"elm.text", "textonly", 0.0);
+                  else
+                  set_state(PART:"elm.text", "pressed_textonly", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"elm.text", "disabled_textonly", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "base";
+            type: IMAGE;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               image.middle: SOLID;
+               rel1.offset: -1 0;
+               rel2.offset: 0 1;
+               fill.smooth: 0;
+               color_class: "button_bg";
+            }
+            description { state: "hovered" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            description { state: "pressed" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+               color_class: "button_bg_pressed";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               color_class: "button_bg_disabled";
+            }
+            description { state: "hidden" 0.0;
+               inherit: "default";
+               visible: 0;
+            }
+         }
+         part { name: "elm.swallow.background";
+            type: SWALLOW;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "base";
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "icon_clip";
+            type: RECT;
+            description { state: "default" 0.0;
+               color_class: "button_icon";
+            }
+            description { state: "pressed" 0.0;
+               inherit: "default";
+               color_class: "button_icon_pressed";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               color_class: "button_icon_disabled";
+            }
+         }
+         part { name: "elm.swallow.content";
+            type: SWALLOW;
+            mouse_events: 0;
+            clip_to: "icon_clip";
+            description { state: "default" 0.0;
+               fixed: 1 0;
+               align: 0.0 0.5;
+               rel1.offset: 6 5;
+               rel1.to: "base";
+               rel2.relative: 0.0 1.0;
+               rel2.offset: 6 -8;
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               fixed: 1 0;
+               aspect: 1.0 1.0;
+               visible: 1;
+            }
+            description { state: "icononly" 0.0;
+               inherit: "default";
+               fixed: 0 0;
+               align: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               rel2.offset: -7 -8;
+               visible: 1;
+            }
+         }
+         part { name: "sizer.content";
+            type: TEXT;
+            mouse_events: 0;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 0;
+               text {
+                  font: FN;
+                  size: 10;
+                  min: 0 0;
+                  text_class: "button_text";
+               }
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+            description { state: "icononly" 0.0;
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+         }
+         part { name: "elm.text";
+            type: TEXT;
+            mouse_events: 0;
+            effect: SHADOW BOTTOM;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.offset: 0 5;
+               rel1.relative: 1.0 0.0;
+               rel1.to_x: "elm.swallow.content";
+               rel1.to_y: "base";
+               rel2.offset: -8 -8;
+               rel2.to: "base";
+               color_class: "button_text";
+               color3: 255 255 255 255;
+               text {
+                  font: FN;
+                  size: 10;
+                  align: 0.5 0.5;
+                  min: 0 0;
+                  text_class: "button";
+               }
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "pressed_visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            description { state: "textonly" 0.0;
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "pressed_textonly" 0.0;
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            description { state: "disabled_visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "disabled_textonly" 0.0;
+               inherit: "default";
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+         }
+         part { name: "event";
+            type: RECT;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               visible: 0;
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,press" "elm";
+            after: "button_click_anim";
+         }
+         program { name: "button_click_anim";
+            script {
+               new m = get_int(btmode);
+               m |= PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_unclick";
+            signal: "mouse,up,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,unpress" "elm";
+            after: "button_unclick_anim";
+         }
+         program { name: "button_unclick_anim";
+            script {
+               new m = get_int(btmode);
+               m &= ~PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_hover";
+            signal: "mouse,in";
+            source: "event";
+            action: STATE_SET "hovered" 0.0;
+            target: "base";
+         }
+         program { name: "button_unhover";
+            signal: "mouse,out";
+            source: "event";
+            action: STATE_SET "default" 0.0;
+            target: "base";
+         }
+         program { name: "buttonactivate";
+            signal: "elm,anim,activate";
+            source: "elm";
+            action: STATE_SET "pressed" 0.0;
+            target: "base";
+            after: "button_unpressed_anim";
+         }
+         program { name: "button_unpressed_anim";
+            action: STATE_SET "default" 0.0;
+            in: 0.5 0.0;
+            target: "base";
+         }
+         program { name: "mouse_click";
+            signal: "mouse,clicked,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,click" "elm";
+         }
+         program { name: "button_text_visible";
+            signal: "elm,state,text,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_text_hidden";
+            signal: "elm,state,text,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_icon_visible";
+            signal: "elm,state,icon,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_icon_hidden";
+            signal: "elm,state,icon,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_background_visible";
+            signal: "elm,state,background,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_background_hidden";
+            signal: "elm,state,background,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_state_disabled";
+            signal: "elm,state,disabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_state_enabled";
+            signal: "elm,state,enabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+      }
+#undef ICON
+#undef LABEL
+#undef MASK
+#undef DISABLE
+#undef PRESSED
+#undef BACKGROUND
+   }
+}
diff --git a/data/templates/2.3.1-templates/Empty.edc b/data/templates/2.3.1-templates/Empty.edc
new file mode 100644 (file)
index 0000000..7f34dd8
--- /dev/null
@@ -0,0 +1,7 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.1-templates/Group.edc b/data/templates/2.3.1-templates/Group.edc
new file mode 100644 (file)
index 0000000..8853b12
--- /dev/null
@@ -0,0 +1,41 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+         }
+         part { name: "group";
+            type: GROUP;
+            source: "my_group";
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+   }
+   group { name: "my_group";
+      parts {
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            description { state: "default" 0.0;
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 30;
+                  font: "Sans";
+                  text: "My Group";
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.1-templates/Image.edc b/data/templates/2.3.1-templates/Image.edc
new file mode 100644 (file)
index 0000000..73a4d4b
--- /dev/null
@@ -0,0 +1,22 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.1-templates/Listitem.edc b/data/templates/2.3.1-templates/Listitem.edc
new file mode 100644 (file)
index 0000000..8627bf9
--- /dev/null
@@ -0,0 +1,285 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 233 242 242 255;
+               align: 0.5 0.5;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               min: 300 60;
+               max: 99999 60;
+               fixed: 1 1;
+            }
+         }
+         part { name: "point_rect";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 176 137 255;
+               align: 0.0 0.0;
+               rel1.to: "bg";
+               rel1.relative: 0.0 0.0;
+               rel2.to: "bg";
+               min: 5 0;
+               max: 5 99999;
+               fixed: 1 0;
+            }
+         }
+         part { name: "padding_left";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "point_rect";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "point_rect";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "icon_status";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png";
+               align: 0.0 0.5;
+               rel1.to: "padding_left";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_left";
+               rel2.relative: 0.0 0.5;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "icon_user";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "icon_status";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_status";
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "user_name";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 130 130 130 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Lisa";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to: "icon_user";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_user";
+               min: 100 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "message";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 145 145 145 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "How are you? I'm fine, thank you, and you?";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to_x: "padding_left";
+               rel1.to_y: "padding_icon";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "padding_icon";
+               rel2.relative: 0.0 1.0;
+               min: 200 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "padding_right";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "bg";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "bg";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 135 135 135 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "21 Mar.";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.5;
+               min: 40 20;
+               max: 40 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "icon_clip";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png";
+               align: 1.0 0.5;
+               rel1.to: "date";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "date";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png";
+            }
+         }
+         part { name: "icon_badge";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_clip";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_clip";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png";
+            }
+         }
+         part { name: "icon_lock";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_badge";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_badge";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png";
+            }
+         }
+         part { name: "icon_check";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.5;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.9;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "padding_icon";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "icon_check";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_check";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down_lock";
+            signal: "mouse,down,1";
+            source: "icon_lock";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_lock";
+         }
+         program { name: "mouse_up_lock";
+            signal: "mouse,up,1";
+            source: "icon_lock";
+            action: STATE_SET "default" 0.0;
+            target: "icon_lock";
+         }
+         program { name: "mouse_down_badge";
+            signal: "mouse,down,1";
+            source: "icon_badge";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_badge";
+         }
+         program { name: "mouse_up_badge";
+            signal: "mouse,up,1";
+            source: "icon_badge";
+            action: STATE_SET "default" 0.0;
+            target: "icon_badge";
+         }
+         program { name: "mouse_down_clip";
+            signal: "mouse,down,1";
+            source: "icon_clip";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_clip";
+         }
+         program { name: "mouse_up_clip";
+            signal: "mouse,up,1";
+            source: "icon_clip";
+            action: STATE_SET "default" 0.0;
+            target: "icon_clip";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.1-templates/Makefile.am b/data/templates/2.3.1-templates/Makefile.am
new file mode 100644 (file)
index 0000000..d278428
--- /dev/null
@@ -0,0 +1,105 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EDJE_CC = @edje_cc@
+EDJE_FLAGS = -id $(top_srcdir)/data/images -sd $(top_srcdir)/data/sounds
+
+filesdir = $(datadir)/$(PACKAGE)/templates/2.3.1-templates
+files_DATA = Basic.edc \
+             Basic.edj \
+             CustomButton.edc \
+             CustomButton.edj \
+             Clip.edc \
+             Clip.edj \
+             Empty.edc \
+             Empty.edj \
+             Group.edc \
+             Group.edj \
+             Image.edc \
+             Image.edj \
+             Listitem.edc \
+             Listitem.edj \
+             MobileLayout.edc \
+             MobileLayout.edj \
+             MouseEvent.edc \
+             MouseEvent.edj \
+             Proxy.edc \
+             Proxy.edj \
+             Rect.edc \
+             Rect.edj \
+             Spacer.edc \
+             Spacer.edj \
+             Text.edc \
+             Text.edj \
+             Textblock.edc \
+             Textblock.edj \
+             Transition.edc \
+             Transition.edj \
+             Tween.edc \
+             Tween.edj \
+             Watchface.edc \
+             Watchface.edj \
+             Watchface2.edc \
+             Watchface2.edj
+
+EXTRA_DIST = $(files_DATA)
+
+srcdir = $(top_srcdir)/data/templates/2.3.1-templates
+builddir = $(top_builddir)/data/templates/2.3.1-templates
+
+Basic.edj: Makefile Basic.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Basic.edc $(builddir)/Basic.edj
+
+CustomButton.edj: Makefile CustomButton.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/CustomButton.edc $(builddir)/CustomButton.edj
+
+Empty.edj: Makefile Empty.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Empty.edc $(builddir)/Empty.edj
+
+MobileLayout.edj: Makefile MobileLayout.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MobileLayout.edc $(builddir)/MobileLayout.edj
+
+MouseEvent.edj: Makefile MouseEvent.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MouseEvent.edc $(builddir)/MouseEvent.edj
+
+Textblock.edj: Makefile Textblock.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Textblock.edc $(builddir)/Textblock.edj
+
+Transition.edj: Makefile Transition.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Transition.edc $(builddir)/Transition.edj
+
+Tween.edj: Makefile Tween.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Tween.edc $(builddir)/Tween.edj
+
+Rect.edj: Makefile Rect.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Rect.edc $(builddir)/Rect.edj
+
+Group.edj: Makefile Group.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Group.edc $(builddir)/Group.edj
+
+Listitem.edj: Makefile Listitem.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Listitem.edc $(builddir)/Listitem.edj
+
+Image.edj: Makefile Image.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Image.edc $(builddir)/Image.edj
+
+Text.edj: Makefile Text.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Text.edc $(builddir)/Text.edj
+
+Proxy.edj: Makefile Proxy.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Proxy.edc $(builddir)/Proxy.edj
+
+Clip.edj: Makefile Clip.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Clip.edc $(builddir)/Clip.edj
+
+Spacer.edj: Makefile Spacer.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Spacer.edc $(builddir)/Spacer.edj
+
+Watchface.edj: Makefile Watchface.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface.edc $(builddir)/Watchface.edj
+
+Watchface2.edj: Makefile Watchface2.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface2.edc $(builddir)/Watchface2.edj
+
+clean-local:
+       rm -f *.edj
+       rm -f $(datadir)/$(PACKAGE)/templates/2.3.1-templates/*edj
diff --git a/data/templates/2.3.1-templates/MobileLayout.edc b/data/templates/2.3.1-templates/MobileLayout.edc
new file mode 100644 (file)
index 0000000..a2491a5
--- /dev/null
@@ -0,0 +1,509 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png" COMP;
+      }
+      parts {
+         part { name: "base";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 200 300;
+            }
+         }
+         /* Header */
+         part { name: "header";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 200 0 0 255;
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel2.to: "base";
+               rel2.relative: 1.0 0.1;
+               min: 0 40;
+               max: 9999 40;
+               fixed: 0 1;
+            }
+         }
+         part { name: "header_padding";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "header";
+               rel2.to: "header";
+               max: 10 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "header_button_panel_open";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               color: 125 125 125 255;
+            }
+         }
+         part { name: "header_button_panel_close";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "header_title";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "TITLE";
+                  min: 0 0;
+               }
+               rel1.to: "header";
+               rel2.to: "header";
+            }
+         }
+         /* Content */
+         part { name: "content_padding_top";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "header";
+               min: 0 5;
+               fixed: 0 1;
+            }
+         }
+         part { name: "content_main";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 30 46 93 255;
+               align: 0.5 0.0;
+               rel1.to: "content_padding_top";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 5 0;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_main_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add main content";
+                  min: 0 0;
+               }
+               rel1.to: "content_main";
+               rel2.to: "content_main";
+            }
+         }
+         part { name: "content_padding_middle";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel1.relative: 0.0 0.5;
+               rel2.to: "base";
+               max: 0 5;
+            }
+         }
+         part { name: "content_sub_1";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 136 170 255;
+               align: 0.0 0.0;
+               rel1.to: "content_padding_middle";
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 0.5 0.85;
+               rel2.offset: 0 0;
+            }
+         }
+         part { name: "content_sub_1_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 1";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_1";
+               rel2.to: "content_sub_1";
+            }
+         }
+         part { name: "content_sub_2";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 66 118 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.0;
+               rel1.offset: 5 0;
+               rel2.to_x: "base";
+               rel2.to_y: "content_sub_1";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_sub_2_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 2";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_2";
+               rel2.to: "content_sub_2";
+            }
+         }
+         part { name: "content_sub_3";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 83 66 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.5;
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.85;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_sub_3_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 3";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_3";
+               rel2.to: "content_sub_3";
+            }
+         }
+         part { name: "content_bottom";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 95 95 95 255;
+               rel1.to: "content_sub_1";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 0 5;
+               rel2.to: "base";
+               rel2.offset: -5 -5;
+            }
+         }
+         part { name: "content_bottom_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add bottom content";
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "content_bottom";
+               rel2.to: "content_bottom";
+            }
+         }
+         /* Mask */
+         part { name: "mask";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 155;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         /* Panel */
+         part { name: "panel_base";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               rel2.relative: 0.7 1.0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_1";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 94 0 255;
+               rel1.to: "panel_base";
+               rel1.offset: 0 1;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.15;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_1_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Add";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "panel_content_1";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_1";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_2";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 130 36 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.15;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.30;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_2_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Your";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_2";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_2";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_3";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 166 72 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.30;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.45;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_3_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Content";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_3";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_3";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_4";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 202 108 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.45;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.60;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_4_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "in Swallow";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_4";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_4";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_swallow";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 0;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.6;
+               rel1.offset: 5 5;
+               rel2.to: "panel_base";
+               rel2.offset: -5 -5;
+
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+      }
+      programs {
+         program { name: "panel_open";
+            signal: "mouse,down,1";
+            source: "header_button_panel_open";
+            action: STATE_SET "clicked" 0.0;
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+         program { name: "panel_close";
+            signal: "mouse,down,1";
+            source: "header_button_panel_close";
+            action: STATE_SET "default" 0.0;
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.1-templates/MouseEvent.edc b/data/templates/2.3.1-templates/MouseEvent.edc
new file mode 100644 (file)
index 0000000..2516cf9
--- /dev/null
@@ -0,0 +1,84 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+      parts {
+         part { name:  "button_shadow";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 155;
+               rel1.to: "button_bg";
+               rel1.offset: 5 5;
+               rel2.to: "button_bg";
+               rel2.offset: 4 4;
+            }
+         }
+         part { name:  "button_bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               min: 50 20;
+               max: 200 50;
+            }
+            description { state: "hovered" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+            }
+         }
+         part { name: "button_text";
+            type: TEXT;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               color: 70 70 70 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Mouse Event Example";
+               }
+               rel1.to: "button_bg";
+               rel2.to: "button_bg";
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "button_bg";
+            action: STATE_SET "clicked" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_up";
+            signal: "mouse,up,1";
+            source: "button_bg";
+            action: STATE_SET "hovered" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_in";
+            signal: "mouse,in";
+            source: "button_bg";
+            action: STATE_SET "hovered" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_out";
+            signal: "mouse,out";
+            source: "button_bg";
+            action: STATE_SET "default" 0.0;
+            target: "button_bg";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.1-templates/Proxy.edc b/data/templates/2.3.1-templates/Proxy.edc
new file mode 100644 (file)
index 0000000..be768b0
--- /dev/null
@@ -0,0 +1,32 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         part { name: "proxy";
+            type: PROXY;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               aspect: 1 1;
+               aspect_preference: BOTH;
+               source: "logo";
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.1-templates/Rect.edc b/data/templates/2.3.1-templates/Rect.edc
new file mode 100644 (file)
index 0000000..5187a38
--- /dev/null
@@ -0,0 +1,15 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.1-templates/Spacer.edc b/data/templates/2.3.1-templates/Spacer.edc
new file mode 100644 (file)
index 0000000..b2e8961
--- /dev/null
@@ -0,0 +1,39 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "spacer1";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 50 50;
+               fixed: 1 1;
+               align: 0 0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.0 0.0;
+            }
+         }
+         part { name: "spacer2";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 50 50;
+               fixed: 1 1;
+               align: 1 1;
+               rel1.relative: 1.0 1.0;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.to: "spacer1";
+               rel1.relative: 1.0 1.0;
+               rel2.to: "spacer2";
+               rel2.relative: 0.0 0.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.1-templates/Text.edc b/data/templates/2.3.1-templates/Text.edc
new file mode 100644 (file)
index 0000000..3a4da74
--- /dev/null
@@ -0,0 +1,24 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 50;
+                  font: "Sans";
+                  text: "TEXT";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.1-templates/Textblock.edc b/data/templates/2.3.1-templates/Textblock.edc
new file mode 100644 (file)
index 0000000..f16f0c3
--- /dev/null
@@ -0,0 +1,133 @@
+collections {
+   base_scale: 1.0;
+   styles {
+      style { name: "basic_style";
+         base: "font="Sans" font_size=20 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0088AA64 valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { name: "wrap_none_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF0000 valign=0.5 wrap=none align=center";
+      }
+      style { name: "wrap_char_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF5E00 valign=0.5 wrap=char align=center";
+      }
+      style { name: "wrap_word_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FFBB00 valign=0.5 wrap=word align=center";
+      }
+      style { name: "wrap_mixed_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#1DDB16 valign=0.5 wrap=mixed align=center";
+      }
+      style { name: "ellipsis_1_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0054FF valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { name: "ellipsis_0_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#5F00FF valign=0.5 ellipsis=0.0 wrap=none align=center";
+      }
+   }
+   group { name: "main";
+      parts {
+         part { name: "text_block";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  style: "basic_style";
+                  text: "Try resizing view!";
+                  min: 0 1;
+               }
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.1;
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_none";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_block";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.25;
+               text {
+                  style: "wrap_none_style";
+                  text: "[wrap = none] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_char";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_none";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.4;
+               text {
+                  style: "wrap_char_style";
+                  text: "[wrap = char] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_word";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_char";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.55;
+               text {
+                  style: "wrap_word_style";
+                  text: "[wrap = word] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_mixed";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_word";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.7;
+               text {
+                  style: "wrap_mixed_style";
+                  text: "[wrap = mixed] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_ellipsis_1";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_mixed";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.85;
+               text {
+                  style: "ellipsis_1_style";
+                  text: "[ellipsis = 1] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_ellipsis_0";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_ellipsis_1";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 1.0;
+               text {
+                  style: "ellipsis_0_style";
+                  text: "[ellipsis = 0] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.1-templates/Transition.edc b/data/templates/2.3.1-templates/Transition.edc
new file mode 100644 (file)
index 0000000..e924788
--- /dev/null
@@ -0,0 +1,36 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.25 0.25;
+               color: 255 255 0 255;
+            }
+            description { state: "changed" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+      programs {
+         program { name: "anim1";
+            signal: "load";
+            source: "";
+            action: STATE_SET "changed" 0.0;
+            target: "rect";
+            transition: ACCELERATE 1;
+            after: "anim2";
+         }
+         program { name: "anim2";
+            action: STATE_SET "default" 0.0;
+            target: "rect";
+            transition: DECELERATE 2;
+            after: "anim1";
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.1-templates/Tween.edc b/data/templates/2.3.1-templates/Tween.edc
new file mode 100644 (file)
index 0000000..9e39724
--- /dev/null
@@ -0,0 +1,52 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-01.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-02.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-03.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-04.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-05.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-06.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-07.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-08.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-09.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-10.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-11.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-12.png" COMP;
+      }
+      parts {
+         part { name: "image";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_TRIAB-01.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-02.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-03.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-04.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-05.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-06.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-07.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-08.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-09.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-10.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-11.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-12.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+      programs {
+         program { name: "tween_anim";
+            signal: "load";
+            source: "";
+            action: STATE_SET "default" 0.0;
+            transition: LINEAR 1;
+            target: "image";
+            after: "tween_anim";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.1-templates/Watchface.edc b/data/templates/2.3.1-templates/Watchface.edc
new file mode 100644 (file)
index 0000000..6b7e158
--- /dev/null
@@ -0,0 +1,257 @@
+collections {
+   base_scale: 1;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE.png";
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+               fixed: 1 1;
+            }
+         }
+         part { name: "moonphase_moon";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png";
+               rel1.to: "moonphase_cover";
+               rel2.to: "moonphase_cover";
+               fixed: 1 1;
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "moonphase_cover";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png";
+               min: 130 130;
+               align: 0.5 1.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 1;
+               rel2.relative: 0.5 1;
+               fixed: 1 1;
+            }
+         }
+         part { name: "month_stroke";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.15 0.15;
+               rel2.relative: 0.85 0.85;
+               map.on: 1;
+            }
+            description { state: "feb" 0.0;
+               inherit: "default";
+               map.rotation.z: 20;
+            }
+            description { state: "mar" 0.0;
+               inherit: "default";
+               map.rotation.z: 40;
+            }
+            description { state: "apr" 0.0;
+               inherit: "default";
+               map.rotation.z: 60;
+            }
+            description { state: "may" 0.0;
+               inherit: "default";
+               map.rotation.z: 80;
+            }
+            description { state: "jun" 0.0;
+               inherit: "default";
+               map.rotation.z: 100;
+            }
+            description { state: "jul" 0.0;
+               inherit: "default";
+               map.rotation.z: 120;
+            }
+            description { state: "aug" 0.0;
+               inherit: "default";
+               map.rotation.z: 140;
+            }
+            description { state: "sep" 0.0;
+               inherit: "default";
+               map.rotation.z: 160;
+            }
+            description { state: "oct" 0.0;
+               inherit: "default";
+               map.rotation.z: 180;
+            }
+            description { state: "nov" 0.0;
+               inherit: "default";
+               map.rotation.z: 200;
+            }
+            description { state: "dec" 0.0;
+               inherit: "default";
+               map.rotation.z: 220;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+               scale: 1;
+               description { state: "default" 0.0;
+                  color: 0 0 0 255;
+                  fixed: 1 1;
+                  text {
+                     size: 11;
+                     font: "Sans";
+                     text: "18";
+                     align: 0.5 0.5;
+                     min: 0 0;
+                  }
+                  min: 30 30;
+                  align: 0.5 1.0;
+                  fixed: 1 1;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.922 0.545;
+                  rel2.relative: 0.922 0.545;
+               }
+            }
+            part { name: "hour";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 35 0;
+                  fixed: 1 0;
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+            part { name: "minute";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 35 0;
+                  fixed: 1 0;               
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+            part { name: "second";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 25 0;
+                  fixed: 1 0;                 
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+         }
+         programs {
+            program { name: "load";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "moonphase_moon";
+               transition: LINEAR 30;
+               after: "reset";
+            }
+            program { name: "reset";
+               action: STATE_SET "default" 0.0;
+               target: "moonphase_moon";
+               after: "load";
+            }
+            program { name: "hour_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "hour";
+               transition: LINEAR 216000;
+               after: "hour_reset";
+            }
+            program { name: "hour_reset";
+               action: STATE_SET "default" 0.0;
+               target: "hour";
+               after: "hour_begin";
+            }
+            program { name: "minute_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "minute";
+               transition: LINEAR 3600;
+               after: "minute_begin";
+            }
+            program { name: "minute_reset";
+               action: STATE_SET "default" 0.0;
+               target: "minute";
+               after: "minute_begin";
+            }
+            program { name: "second_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "second";
+               transition: LINEAR 60;
+               after: "second_reset";
+            }
+            program { name: "second_reset";
+               action: STATE_SET "default" 0.0;
+               target: "second";
+               after: "second_begin";
+            }
+         }
+      }
+   }
\ No newline at end of file
diff --git a/data/templates/2.3.1-templates/Watchface2.edc b/data/templates/2.3.1-templates/Watchface2.edc
new file mode 100644 (file)
index 0000000..ab84421
--- /dev/null
@@ -0,0 +1,206 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 1;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png";
+               //aspect: 1 1;
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 219 219 219 255;
+               fixed: 1 1;
+               text {
+                  size: 13;
+                  font: "Sans";
+                  text: "19";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               min: 30 30;
+               align: 0.5 1.0;
+               fixed: 1 1;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.795 0.545;
+               rel2.relative: 0.795 0.545;
+            }
+         }
+         part { name: "meridiem";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 120 0 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "AM";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.9 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         part { name: "time";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 250 250 250 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "12:00";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.5 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         part { name: "hour";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "minute";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;               
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "second";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;                 
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+      }
+      programs {
+         program { name: "load";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "bg";
+            transition: LINEAR 30;
+            after: "reset";
+         }
+         program { name: "reset";
+            action: STATE_SET "default" 0.0;
+            target: "bg";
+            after: "load";
+         }
+         program { name: "hour_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "hour";
+            transition: LINEAR 216000;
+            after: "hour_reset";
+         }
+         program { name: "hour_reset";
+            action: STATE_SET "default" 0.0;
+            target: "hour";
+            after: "hour_begin";
+         }
+         program { name: "minute_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "minute";
+            transition: LINEAR 3600;
+            after: "minute_begin";
+         }
+         program { name: "minute_reset";
+            action: STATE_SET "default" 0.0;
+            target: "minute";
+            after: "minute_begin";
+         }
+         program { name: "second_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "second";
+            transition: LINEAR 60;
+            after: "second_reset";
+         }
+         program { name: "second_reset";
+            action: STATE_SET "default" 0.0;
+            target: "second";
+            after: "second_begin";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.2-templates/Basic.edc b/data/templates/2.3.2-templates/Basic.edc
new file mode 100644 (file)
index 0000000..4b699e7
--- /dev/null
@@ -0,0 +1,75 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+            description { state: "clicked" 0.0;
+               rel1.relative: 0.65 0.15;
+               rel2.relative: 0.85 0.35;
+               color: 170 136 0 255;
+            }
+         }
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: OUTLINE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 0.5 1.0;
+               color: 0 150 221 255;
+               color2: 0 150 221 155;
+               text {
+                  size: 20;
+                  font: "Sans";
+                  text: "EDC Editor";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+         part { name: "content";
+            type: SWALLOW;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+      /*
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "rect";
+            action: STATE_SET "clicked" 0.0;
+            target: "rect";
+         }
+         program { name: "mouse_up";
+            signal: "mouse,up,1";
+            source: "rect";
+            action: STATE_SET "default" 0.0;
+            target: "rect";
+         }
+      }
+      */
+   }
+}
diff --git a/data/templates/2.3.2-templates/Clip.edc b/data/templates/2.3.2-templates/Clip.edc
new file mode 100644 (file)
index 0000000..822a353
--- /dev/null
@@ -0,0 +1,31 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "clipper";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 1.0;
+               color: 0 136 170 255;
+            }
+         }
+         part { name: "logo";
+            type: IMAGE;
+            clip_to: "clipper";
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.2-templates/CustomButton.edc b/data/templates/2.3.2-templates/CustomButton.edc
new file mode 100644 (file)
index 0000000..db73633
--- /dev/null
@@ -0,0 +1,456 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+#define ICON     1
+#define LABEL    2
+#define MASK     3
+#define DISABLE  4
+#define PRESSED  8
+#define BACKGROUND  16
+      script {
+         public btmode;
+         public eval_mode(m) {
+            new m1 = m & MASK;
+            new d = m & DISABLE;
+            new p = m & PRESSED;
+            new bg = m & BACKGROUND;
+            if (bg) {
+               set_state(PART:"base", "hidden", 0.0);
+               set_state(PART:"elm.swallow.background", "visible", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.background", "default", 0.0);
+               if (!d) {
+                  if (!p)
+                  {
+                     set_state(PART:"base", "default", 0.0);
+                     set_state(PART:"base", "default", 0.0);
+                  }
+                  else {
+                     set_state(PART:"base", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"base", "disabled", 0.0);
+               }
+            }
+            if (m1 == (ICON | LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p) {
+                     set_state(PART:"elm.text", "visible", 0.0);
+                     set_state(PART:"icon_clip", "default", 0.0);
+                  } else {
+                     set_state(PART:"elm.text", "pressed_visible", 0.0);
+                     set_state(PART:"icon_clip", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"elm.text", "disabled_visible", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (ICON)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  else
+                  set_state(PART:"icon_clip", "pressed", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"elm.text", "textonly", 0.0);
+                  else
+                  set_state(PART:"elm.text", "pressed_textonly", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"elm.text", "disabled_textonly", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "base";
+            type: IMAGE;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               image.middle: SOLID;
+               rel1.offset: -1 0;
+               rel2.offset: 0 1;
+               fill.smooth: 0;
+               color_class: "button_bg";
+            }
+            description { state: "hovered" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            description { state: "pressed" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+               color_class: "button_bg_pressed";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               color_class: "button_bg_disabled";
+            }
+            description { state: "hidden" 0.0;
+               inherit: "default";
+               visible: 0;
+            }
+         }
+         part { name: "elm.swallow.background";
+            type: SWALLOW;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "base";
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "icon_clip";
+            type: RECT;
+            description { state: "default" 0.0;
+               color_class: "button_icon";
+            }
+            description { state: "pressed" 0.0;
+               inherit: "default";
+               color_class: "button_icon_pressed";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               color_class: "button_icon_disabled";
+            }
+         }
+         part { name: "elm.swallow.content";
+            type: SWALLOW;
+            mouse_events: 0;
+            clip_to: "icon_clip";
+            description { state: "default" 0.0;
+               fixed: 1 0;
+               align: 0.0 0.5;
+               rel1.offset: 6 5;
+               rel1.to: "base";
+               rel2.relative: 0.0 1.0;
+               rel2.offset: 6 -8;
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               fixed: 1 0;
+               aspect: 1.0 1.0;
+               visible: 1;
+            }
+            description { state: "icononly" 0.0;
+               inherit: "default";
+               fixed: 0 0;
+               align: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               rel2.offset: -7 -8;
+               visible: 1;
+            }
+         }
+         part { name: "sizer.content";
+            type: TEXT;
+            mouse_events: 0;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 0;
+               text {
+                  font: FN;
+                  size: 10;
+                  min: 0 0;
+                  text_class: "button_text";
+               }
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+            description { state: "icononly" 0.0;
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+         }
+         part { name: "elm.text";
+            type: TEXT;
+            mouse_events: 0;
+            effect: SHADOW BOTTOM;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.offset: 0 5;
+               rel1.relative: 1.0 0.0;
+               rel1.to_x: "elm.swallow.content";
+               rel1.to_y: "base";
+               rel2.offset: -8 -8;
+               rel2.to: "base";
+               color_class: "button_text";
+               color3: 255 255 255 255;
+               text {
+                  font: FN;
+                  size: 10;
+                  align: 0.5 0.5;
+                  min: 0 0;
+                  text_class: "button";
+               }
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "pressed_visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            description { state: "textonly" 0.0;
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "pressed_textonly" 0.0;
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            description { state: "disabled_visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "disabled_textonly" 0.0;
+               inherit: "default";
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+         }
+         part { name: "event";
+            type: RECT;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               visible: 0;
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,press" "elm";
+            after: "button_click_anim";
+         }
+         program { name: "button_click_anim";
+            script {
+               new m = get_int(btmode);
+               m |= PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_unclick";
+            signal: "mouse,up,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,unpress" "elm";
+            after: "button_unclick_anim";
+         }
+         program { name: "button_unclick_anim";
+            script {
+               new m = get_int(btmode);
+               m &= ~PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_hover";
+            signal: "mouse,in";
+            source: "event";
+            action: STATE_SET "hovered" 0.0;
+            target: "base";
+         }
+         program { name: "button_unhover";
+            signal: "mouse,out";
+            source: "event";
+            action: STATE_SET "default" 0.0;
+            target: "base";
+         }
+         program { name: "buttonactivate";
+            signal: "elm,anim,activate";
+            source: "elm";
+            action: STATE_SET "pressed" 0.0;
+            target: "base";
+            after: "button_unpressed_anim";
+         }
+         program { name: "button_unpressed_anim";
+            action: STATE_SET "default" 0.0;
+            in: 0.5 0.0;
+            target: "base";
+         }
+         program { name: "mouse_click";
+            signal: "mouse,clicked,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,click" "elm";
+         }
+         program { name: "button_text_visible";
+            signal: "elm,state,text,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_text_hidden";
+            signal: "elm,state,text,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_icon_visible";
+            signal: "elm,state,icon,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_icon_hidden";
+            signal: "elm,state,icon,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_background_visible";
+            signal: "elm,state,background,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_background_hidden";
+            signal: "elm,state,background,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_state_disabled";
+            signal: "elm,state,disabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_state_enabled";
+            signal: "elm,state,enabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+      }
+#undef ICON
+#undef LABEL
+#undef MASK
+#undef DISABLE
+#undef PRESSED
+#undef BACKGROUND
+   }
+}
diff --git a/data/templates/2.3.2-templates/Empty.edc b/data/templates/2.3.2-templates/Empty.edc
new file mode 100644 (file)
index 0000000..7f34dd8
--- /dev/null
@@ -0,0 +1,7 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.2-templates/Group.edc b/data/templates/2.3.2-templates/Group.edc
new file mode 100644 (file)
index 0000000..8853b12
--- /dev/null
@@ -0,0 +1,41 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+         }
+         part { name: "group";
+            type: GROUP;
+            source: "my_group";
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+   }
+   group { name: "my_group";
+      parts {
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            description { state: "default" 0.0;
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 30;
+                  font: "Sans";
+                  text: "My Group";
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.2-templates/Image.edc b/data/templates/2.3.2-templates/Image.edc
new file mode 100644 (file)
index 0000000..73a4d4b
--- /dev/null
@@ -0,0 +1,22 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.2-templates/Listitem.edc b/data/templates/2.3.2-templates/Listitem.edc
new file mode 100644 (file)
index 0000000..8627bf9
--- /dev/null
@@ -0,0 +1,285 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 233 242 242 255;
+               align: 0.5 0.5;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               min: 300 60;
+               max: 99999 60;
+               fixed: 1 1;
+            }
+         }
+         part { name: "point_rect";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 176 137 255;
+               align: 0.0 0.0;
+               rel1.to: "bg";
+               rel1.relative: 0.0 0.0;
+               rel2.to: "bg";
+               min: 5 0;
+               max: 5 99999;
+               fixed: 1 0;
+            }
+         }
+         part { name: "padding_left";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "point_rect";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "point_rect";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "icon_status";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png";
+               align: 0.0 0.5;
+               rel1.to: "padding_left";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_left";
+               rel2.relative: 0.0 0.5;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "icon_user";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "icon_status";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_status";
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "user_name";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 130 130 130 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Lisa";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to: "icon_user";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_user";
+               min: 100 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "message";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 145 145 145 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "How are you? I'm fine, thank you, and you?";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to_x: "padding_left";
+               rel1.to_y: "padding_icon";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "padding_icon";
+               rel2.relative: 0.0 1.0;
+               min: 200 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "padding_right";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "bg";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "bg";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 135 135 135 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "21 Mar.";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.5;
+               min: 40 20;
+               max: 40 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "icon_clip";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png";
+               align: 1.0 0.5;
+               rel1.to: "date";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "date";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png";
+            }
+         }
+         part { name: "icon_badge";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_clip";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_clip";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png";
+            }
+         }
+         part { name: "icon_lock";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_badge";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_badge";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png";
+            }
+         }
+         part { name: "icon_check";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.5;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.9;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "padding_icon";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "icon_check";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_check";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down_lock";
+            signal: "mouse,down,1";
+            source: "icon_lock";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_lock";
+         }
+         program { name: "mouse_up_lock";
+            signal: "mouse,up,1";
+            source: "icon_lock";
+            action: STATE_SET "default" 0.0;
+            target: "icon_lock";
+         }
+         program { name: "mouse_down_badge";
+            signal: "mouse,down,1";
+            source: "icon_badge";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_badge";
+         }
+         program { name: "mouse_up_badge";
+            signal: "mouse,up,1";
+            source: "icon_badge";
+            action: STATE_SET "default" 0.0;
+            target: "icon_badge";
+         }
+         program { name: "mouse_down_clip";
+            signal: "mouse,down,1";
+            source: "icon_clip";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_clip";
+         }
+         program { name: "mouse_up_clip";
+            signal: "mouse,up,1";
+            source: "icon_clip";
+            action: STATE_SET "default" 0.0;
+            target: "icon_clip";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.2-templates/Makefile.am b/data/templates/2.3.2-templates/Makefile.am
new file mode 100644 (file)
index 0000000..2dc0aa6
--- /dev/null
@@ -0,0 +1,105 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EDJE_CC = @edje_cc@
+EDJE_FLAGS = -id $(top_srcdir)/data/images -sd $(top_srcdir)/data/sounds
+
+filesdir = $(datadir)/$(PACKAGE)/templates/2.3.2-templates
+files_DATA = Basic.edc \
+             Basic.edj \
+             CustomButton.edc \
+             CustomButton.edj \
+             Clip.edc \
+             Clip.edj \
+             Empty.edc \
+             Empty.edj \
+             Group.edc \
+             Group.edj \
+             Image.edc \
+             Image.edj \
+             Listitem.edc \
+             Listitem.edj \
+             MobileLayout.edc \
+             MobileLayout.edj \
+             MouseEvent.edc \
+             MouseEvent.edj \
+             Proxy.edc \
+             Proxy.edj \
+             Rect.edc \
+             Rect.edj \
+             Spacer.edc \
+             Spacer.edj \
+             Text.edc \
+             Text.edj \
+             Textblock.edc \
+             Textblock.edj \
+             Transition.edc \
+             Transition.edj \
+             Tween.edc \
+             Tween.edj \
+             Watchface.edc \
+             Watchface.edj \
+             Watchface2.edc \
+             Watchface2.edj
+
+EXTRA_DIST = $(files_DATA)
+
+srcdir = $(top_srcdir)/data/templates/2.3.2-templates
+builddir = $(top_builddir)/data/templates/2.3.2-templates
+
+Basic.edj: Makefile Basic.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Basic.edc $(builddir)/Basic.edj
+
+CustomButton.edj: Makefile CustomButton.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/CustomButton.edc $(builddir)/CustomButton.edj
+
+Empty.edj: Makefile Empty.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Empty.edc $(builddir)/Empty.edj
+
+MobileLayout.edj: Makefile MobileLayout.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MobileLayout.edc $(builddir)/MobileLayout.edj
+
+MouseEvent.edj: Makefile MouseEvent.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MouseEvent.edc $(builddir)/MouseEvent.edj
+
+Textblock.edj: Makefile Textblock.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Textblock.edc $(builddir)/Textblock.edj
+
+Transition.edj: Makefile Transition.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Transition.edc $(builddir)/Transition.edj
+
+Tween.edj: Makefile Tween.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Tween.edc $(builddir)/Tween.edj
+
+Rect.edj: Makefile Rect.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Rect.edc $(builddir)/Rect.edj
+
+Group.edj: Makefile Group.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Group.edc $(builddir)/Group.edj
+
+Listitem.edj: Makefile Listitem.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Listitem.edc $(builddir)/Listitem.edj
+
+Image.edj: Makefile Image.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Image.edc $(builddir)/Image.edj
+
+Text.edj: Makefile Text.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Text.edc $(builddir)/Text.edj
+
+Proxy.edj: Makefile Proxy.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Proxy.edc $(builddir)/Proxy.edj
+
+Clip.edj: Makefile Clip.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Clip.edc $(builddir)/Clip.edj
+
+Spacer.edj: Makefile Spacer.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Spacer.edc $(builddir)/Spacer.edj
+
+Watchface.edj: Makefile Watchface.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface.edc $(builddir)/Watchface.edj
+
+Watchface2.edj: Makefile Watchface2.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface2.edc $(builddir)/Watchface2.edj
+
+clean-local:
+       rm -f *.edj
+       rm -f $(datadir)/$(PACKAGE)/templates/2.3.2-templates/*edj
diff --git a/data/templates/2.3.2-templates/MobileLayout.edc b/data/templates/2.3.2-templates/MobileLayout.edc
new file mode 100644 (file)
index 0000000..a2491a5
--- /dev/null
@@ -0,0 +1,509 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png" COMP;
+      }
+      parts {
+         part { name: "base";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 200 300;
+            }
+         }
+         /* Header */
+         part { name: "header";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 200 0 0 255;
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel2.to: "base";
+               rel2.relative: 1.0 0.1;
+               min: 0 40;
+               max: 9999 40;
+               fixed: 0 1;
+            }
+         }
+         part { name: "header_padding";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "header";
+               rel2.to: "header";
+               max: 10 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "header_button_panel_open";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               color: 125 125 125 255;
+            }
+         }
+         part { name: "header_button_panel_close";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "header_title";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "TITLE";
+                  min: 0 0;
+               }
+               rel1.to: "header";
+               rel2.to: "header";
+            }
+         }
+         /* Content */
+         part { name: "content_padding_top";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "header";
+               min: 0 5;
+               fixed: 0 1;
+            }
+         }
+         part { name: "content_main";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 30 46 93 255;
+               align: 0.5 0.0;
+               rel1.to: "content_padding_top";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 5 0;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_main_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add main content";
+                  min: 0 0;
+               }
+               rel1.to: "content_main";
+               rel2.to: "content_main";
+            }
+         }
+         part { name: "content_padding_middle";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel1.relative: 0.0 0.5;
+               rel2.to: "base";
+               max: 0 5;
+            }
+         }
+         part { name: "content_sub_1";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 136 170 255;
+               align: 0.0 0.0;
+               rel1.to: "content_padding_middle";
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 0.5 0.85;
+               rel2.offset: 0 0;
+            }
+         }
+         part { name: "content_sub_1_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 1";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_1";
+               rel2.to: "content_sub_1";
+            }
+         }
+         part { name: "content_sub_2";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 66 118 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.0;
+               rel1.offset: 5 0;
+               rel2.to_x: "base";
+               rel2.to_y: "content_sub_1";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_sub_2_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 2";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_2";
+               rel2.to: "content_sub_2";
+            }
+         }
+         part { name: "content_sub_3";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 83 66 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.5;
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.85;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_sub_3_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 3";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_3";
+               rel2.to: "content_sub_3";
+            }
+         }
+         part { name: "content_bottom";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 95 95 95 255;
+               rel1.to: "content_sub_1";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 0 5;
+               rel2.to: "base";
+               rel2.offset: -5 -5;
+            }
+         }
+         part { name: "content_bottom_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add bottom content";
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "content_bottom";
+               rel2.to: "content_bottom";
+            }
+         }
+         /* Mask */
+         part { name: "mask";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 155;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         /* Panel */
+         part { name: "panel_base";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               rel2.relative: 0.7 1.0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_1";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 94 0 255;
+               rel1.to: "panel_base";
+               rel1.offset: 0 1;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.15;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_1_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Add";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "panel_content_1";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_1";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_2";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 130 36 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.15;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.30;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_2_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Your";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_2";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_2";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_3";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 166 72 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.30;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.45;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_3_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Content";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_3";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_3";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_4";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 202 108 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.45;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.60;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_4_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "in Swallow";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_4";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_4";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_swallow";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 0;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.6;
+               rel1.offset: 5 5;
+               rel2.to: "panel_base";
+               rel2.offset: -5 -5;
+
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+      }
+      programs {
+         program { name: "panel_open";
+            signal: "mouse,down,1";
+            source: "header_button_panel_open";
+            action: STATE_SET "clicked" 0.0;
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+         program { name: "panel_close";
+            signal: "mouse,down,1";
+            source: "header_button_panel_close";
+            action: STATE_SET "default" 0.0;
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.2-templates/MouseEvent.edc b/data/templates/2.3.2-templates/MouseEvent.edc
new file mode 100644 (file)
index 0000000..2516cf9
--- /dev/null
@@ -0,0 +1,84 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+      parts {
+         part { name:  "button_shadow";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 155;
+               rel1.to: "button_bg";
+               rel1.offset: 5 5;
+               rel2.to: "button_bg";
+               rel2.offset: 4 4;
+            }
+         }
+         part { name:  "button_bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               min: 50 20;
+               max: 200 50;
+            }
+            description { state: "hovered" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+            }
+         }
+         part { name: "button_text";
+            type: TEXT;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               color: 70 70 70 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Mouse Event Example";
+               }
+               rel1.to: "button_bg";
+               rel2.to: "button_bg";
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "button_bg";
+            action: STATE_SET "clicked" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_up";
+            signal: "mouse,up,1";
+            source: "button_bg";
+            action: STATE_SET "hovered" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_in";
+            signal: "mouse,in";
+            source: "button_bg";
+            action: STATE_SET "hovered" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_out";
+            signal: "mouse,out";
+            source: "button_bg";
+            action: STATE_SET "default" 0.0;
+            target: "button_bg";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.2-templates/Proxy.edc b/data/templates/2.3.2-templates/Proxy.edc
new file mode 100644 (file)
index 0000000..be768b0
--- /dev/null
@@ -0,0 +1,32 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         part { name: "proxy";
+            type: PROXY;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               aspect: 1 1;
+               aspect_preference: BOTH;
+               source: "logo";
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.2-templates/Rect.edc b/data/templates/2.3.2-templates/Rect.edc
new file mode 100644 (file)
index 0000000..5187a38
--- /dev/null
@@ -0,0 +1,15 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.2-templates/Spacer.edc b/data/templates/2.3.2-templates/Spacer.edc
new file mode 100644 (file)
index 0000000..b2e8961
--- /dev/null
@@ -0,0 +1,39 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "spacer1";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 50 50;
+               fixed: 1 1;
+               align: 0 0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.0 0.0;
+            }
+         }
+         part { name: "spacer2";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 50 50;
+               fixed: 1 1;
+               align: 1 1;
+               rel1.relative: 1.0 1.0;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.to: "spacer1";
+               rel1.relative: 1.0 1.0;
+               rel2.to: "spacer2";
+               rel2.relative: 0.0 0.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.2-templates/Text.edc b/data/templates/2.3.2-templates/Text.edc
new file mode 100644 (file)
index 0000000..3a4da74
--- /dev/null
@@ -0,0 +1,24 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 50;
+                  font: "Sans";
+                  text: "TEXT";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.2-templates/Textblock.edc b/data/templates/2.3.2-templates/Textblock.edc
new file mode 100644 (file)
index 0000000..f16f0c3
--- /dev/null
@@ -0,0 +1,133 @@
+collections {
+   base_scale: 1.0;
+   styles {
+      style { name: "basic_style";
+         base: "font="Sans" font_size=20 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0088AA64 valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { name: "wrap_none_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF0000 valign=0.5 wrap=none align=center";
+      }
+      style { name: "wrap_char_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF5E00 valign=0.5 wrap=char align=center";
+      }
+      style { name: "wrap_word_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FFBB00 valign=0.5 wrap=word align=center";
+      }
+      style { name: "wrap_mixed_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#1DDB16 valign=0.5 wrap=mixed align=center";
+      }
+      style { name: "ellipsis_1_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0054FF valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { name: "ellipsis_0_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#5F00FF valign=0.5 ellipsis=0.0 wrap=none align=center";
+      }
+   }
+   group { name: "main";
+      parts {
+         part { name: "text_block";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  style: "basic_style";
+                  text: "Try resizing view!";
+                  min: 0 1;
+               }
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.1;
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_none";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_block";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.25;
+               text {
+                  style: "wrap_none_style";
+                  text: "[wrap = none] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_char";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_none";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.4;
+               text {
+                  style: "wrap_char_style";
+                  text: "[wrap = char] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_word";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_char";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.55;
+               text {
+                  style: "wrap_word_style";
+                  text: "[wrap = word] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_mixed";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_word";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.7;
+               text {
+                  style: "wrap_mixed_style";
+                  text: "[wrap = mixed] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_ellipsis_1";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_mixed";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.85;
+               text {
+                  style: "ellipsis_1_style";
+                  text: "[ellipsis = 1] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_ellipsis_0";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_ellipsis_1";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 1.0;
+               text {
+                  style: "ellipsis_0_style";
+                  text: "[ellipsis = 0] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.2-templates/Transition.edc b/data/templates/2.3.2-templates/Transition.edc
new file mode 100644 (file)
index 0000000..e924788
--- /dev/null
@@ -0,0 +1,36 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.25 0.25;
+               color: 255 255 0 255;
+            }
+            description { state: "changed" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+      programs {
+         program { name: "anim1";
+            signal: "load";
+            source: "";
+            action: STATE_SET "changed" 0.0;
+            target: "rect";
+            transition: ACCELERATE 1;
+            after: "anim2";
+         }
+         program { name: "anim2";
+            action: STATE_SET "default" 0.0;
+            target: "rect";
+            transition: DECELERATE 2;
+            after: "anim1";
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.3.2-templates/Tween.edc b/data/templates/2.3.2-templates/Tween.edc
new file mode 100644 (file)
index 0000000..9e39724
--- /dev/null
@@ -0,0 +1,52 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-01.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-02.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-03.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-04.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-05.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-06.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-07.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-08.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-09.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-10.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-11.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-12.png" COMP;
+      }
+      parts {
+         part { name: "image";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_TRIAB-01.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-02.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-03.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-04.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-05.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-06.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-07.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-08.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-09.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-10.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-11.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-12.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+      programs {
+         program { name: "tween_anim";
+            signal: "load";
+            source: "";
+            action: STATE_SET "default" 0.0;
+            transition: LINEAR 1;
+            target: "image";
+            after: "tween_anim";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.3.2-templates/Watchface.edc b/data/templates/2.3.2-templates/Watchface.edc
new file mode 100644 (file)
index 0000000..6b7e158
--- /dev/null
@@ -0,0 +1,257 @@
+collections {
+   base_scale: 1;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE.png";
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+               fixed: 1 1;
+            }
+         }
+         part { name: "moonphase_moon";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png";
+               rel1.to: "moonphase_cover";
+               rel2.to: "moonphase_cover";
+               fixed: 1 1;
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "moonphase_cover";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png";
+               min: 130 130;
+               align: 0.5 1.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 1;
+               rel2.relative: 0.5 1;
+               fixed: 1 1;
+            }
+         }
+         part { name: "month_stroke";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.15 0.15;
+               rel2.relative: 0.85 0.85;
+               map.on: 1;
+            }
+            description { state: "feb" 0.0;
+               inherit: "default";
+               map.rotation.z: 20;
+            }
+            description { state: "mar" 0.0;
+               inherit: "default";
+               map.rotation.z: 40;
+            }
+            description { state: "apr" 0.0;
+               inherit: "default";
+               map.rotation.z: 60;
+            }
+            description { state: "may" 0.0;
+               inherit: "default";
+               map.rotation.z: 80;
+            }
+            description { state: "jun" 0.0;
+               inherit: "default";
+               map.rotation.z: 100;
+            }
+            description { state: "jul" 0.0;
+               inherit: "default";
+               map.rotation.z: 120;
+            }
+            description { state: "aug" 0.0;
+               inherit: "default";
+               map.rotation.z: 140;
+            }
+            description { state: "sep" 0.0;
+               inherit: "default";
+               map.rotation.z: 160;
+            }
+            description { state: "oct" 0.0;
+               inherit: "default";
+               map.rotation.z: 180;
+            }
+            description { state: "nov" 0.0;
+               inherit: "default";
+               map.rotation.z: 200;
+            }
+            description { state: "dec" 0.0;
+               inherit: "default";
+               map.rotation.z: 220;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+               scale: 1;
+               description { state: "default" 0.0;
+                  color: 0 0 0 255;
+                  fixed: 1 1;
+                  text {
+                     size: 11;
+                     font: "Sans";
+                     text: "18";
+                     align: 0.5 0.5;
+                     min: 0 0;
+                  }
+                  min: 30 30;
+                  align: 0.5 1.0;
+                  fixed: 1 1;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.922 0.545;
+                  rel2.relative: 0.922 0.545;
+               }
+            }
+            part { name: "hour";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 35 0;
+                  fixed: 1 0;
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+            part { name: "minute";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 35 0;
+                  fixed: 1 0;               
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+            part { name: "second";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 25 0;
+                  fixed: 1 0;                 
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+         }
+         programs {
+            program { name: "load";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "moonphase_moon";
+               transition: LINEAR 30;
+               after: "reset";
+            }
+            program { name: "reset";
+               action: STATE_SET "default" 0.0;
+               target: "moonphase_moon";
+               after: "load";
+            }
+            program { name: "hour_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "hour";
+               transition: LINEAR 216000;
+               after: "hour_reset";
+            }
+            program { name: "hour_reset";
+               action: STATE_SET "default" 0.0;
+               target: "hour";
+               after: "hour_begin";
+            }
+            program { name: "minute_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "minute";
+               transition: LINEAR 3600;
+               after: "minute_begin";
+            }
+            program { name: "minute_reset";
+               action: STATE_SET "default" 0.0;
+               target: "minute";
+               after: "minute_begin";
+            }
+            program { name: "second_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "second";
+               transition: LINEAR 60;
+               after: "second_reset";
+            }
+            program { name: "second_reset";
+               action: STATE_SET "default" 0.0;
+               target: "second";
+               after: "second_begin";
+            }
+         }
+      }
+   }
\ No newline at end of file
diff --git a/data/templates/2.3.2-templates/Watchface2.edc b/data/templates/2.3.2-templates/Watchface2.edc
new file mode 100644 (file)
index 0000000..ab84421
--- /dev/null
@@ -0,0 +1,206 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 1;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png";
+               //aspect: 1 1;
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 219 219 219 255;
+               fixed: 1 1;
+               text {
+                  size: 13;
+                  font: "Sans";
+                  text: "19";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               min: 30 30;
+               align: 0.5 1.0;
+               fixed: 1 1;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.795 0.545;
+               rel2.relative: 0.795 0.545;
+            }
+         }
+         part { name: "meridiem";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 120 0 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "AM";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.9 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         part { name: "time";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 250 250 250 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "12:00";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.5 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         part { name: "hour";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "minute";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;               
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "second";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;                 
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+      }
+      programs {
+         program { name: "load";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "bg";
+            transition: LINEAR 30;
+            after: "reset";
+         }
+         program { name: "reset";
+            action: STATE_SET "default" 0.0;
+            target: "bg";
+            after: "load";
+         }
+         program { name: "hour_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "hour";
+            transition: LINEAR 216000;
+            after: "hour_reset";
+         }
+         program { name: "hour_reset";
+            action: STATE_SET "default" 0.0;
+            target: "hour";
+            after: "hour_begin";
+         }
+         program { name: "minute_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "minute";
+            transition: LINEAR 3600;
+            after: "minute_begin";
+         }
+         program { name: "minute_reset";
+            action: STATE_SET "default" 0.0;
+            target: "minute";
+            after: "minute_begin";
+         }
+         program { name: "second_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "second";
+            transition: LINEAR 60;
+            after: "second_reset";
+         }
+         program { name: "second_reset";
+            action: STATE_SET "default" 0.0;
+            target: "second";
+            after: "second_begin";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.4-templates/Basic.edc b/data/templates/2.4-templates/Basic.edc
new file mode 100644 (file)
index 0000000..4b699e7
--- /dev/null
@@ -0,0 +1,75 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+            description { state: "clicked" 0.0;
+               rel1.relative: 0.65 0.15;
+               rel2.relative: 0.85 0.35;
+               color: 170 136 0 255;
+            }
+         }
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: OUTLINE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 0.5 1.0;
+               color: 0 150 221 255;
+               color2: 0 150 221 155;
+               text {
+                  size: 20;
+                  font: "Sans";
+                  text: "EDC Editor";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+         part { name: "content";
+            type: SWALLOW;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+      /*
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "rect";
+            action: STATE_SET "clicked" 0.0;
+            target: "rect";
+         }
+         program { name: "mouse_up";
+            signal: "mouse,up,1";
+            source: "rect";
+            action: STATE_SET "default" 0.0;
+            target: "rect";
+         }
+      }
+      */
+   }
+}
diff --git a/data/templates/2.4-templates/Clip.edc b/data/templates/2.4-templates/Clip.edc
new file mode 100644 (file)
index 0000000..822a353
--- /dev/null
@@ -0,0 +1,31 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "clipper";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 1.0;
+               color: 0 136 170 255;
+            }
+         }
+         part { name: "logo";
+            type: IMAGE;
+            clip_to: "clipper";
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.4-templates/CustomButton.edc b/data/templates/2.4-templates/CustomButton.edc
new file mode 100644 (file)
index 0000000..db73633
--- /dev/null
@@ -0,0 +1,456 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+#define ICON     1
+#define LABEL    2
+#define MASK     3
+#define DISABLE  4
+#define PRESSED  8
+#define BACKGROUND  16
+      script {
+         public btmode;
+         public eval_mode(m) {
+            new m1 = m & MASK;
+            new d = m & DISABLE;
+            new p = m & PRESSED;
+            new bg = m & BACKGROUND;
+            if (bg) {
+               set_state(PART:"base", "hidden", 0.0);
+               set_state(PART:"elm.swallow.background", "visible", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.background", "default", 0.0);
+               if (!d) {
+                  if (!p)
+                  {
+                     set_state(PART:"base", "default", 0.0);
+                     set_state(PART:"base", "default", 0.0);
+                  }
+                  else {
+                     set_state(PART:"base", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"base", "disabled", 0.0);
+               }
+            }
+            if (m1 == (ICON | LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p) {
+                     set_state(PART:"elm.text", "visible", 0.0);
+                     set_state(PART:"icon_clip", "default", 0.0);
+                  } else {
+                     set_state(PART:"elm.text", "pressed_visible", 0.0);
+                     set_state(PART:"icon_clip", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"elm.text", "disabled_visible", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (ICON)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  else
+                  set_state(PART:"icon_clip", "pressed", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"elm.text", "textonly", 0.0);
+                  else
+                  set_state(PART:"elm.text", "pressed_textonly", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"elm.text", "disabled_textonly", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "base";
+            type: IMAGE;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               image.middle: SOLID;
+               rel1.offset: -1 0;
+               rel2.offset: 0 1;
+               fill.smooth: 0;
+               color_class: "button_bg";
+            }
+            description { state: "hovered" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            description { state: "pressed" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+               color_class: "button_bg_pressed";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               color_class: "button_bg_disabled";
+            }
+            description { state: "hidden" 0.0;
+               inherit: "default";
+               visible: 0;
+            }
+         }
+         part { name: "elm.swallow.background";
+            type: SWALLOW;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "base";
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "icon_clip";
+            type: RECT;
+            description { state: "default" 0.0;
+               color_class: "button_icon";
+            }
+            description { state: "pressed" 0.0;
+               inherit: "default";
+               color_class: "button_icon_pressed";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               color_class: "button_icon_disabled";
+            }
+         }
+         part { name: "elm.swallow.content";
+            type: SWALLOW;
+            mouse_events: 0;
+            clip_to: "icon_clip";
+            description { state: "default" 0.0;
+               fixed: 1 0;
+               align: 0.0 0.5;
+               rel1.offset: 6 5;
+               rel1.to: "base";
+               rel2.relative: 0.0 1.0;
+               rel2.offset: 6 -8;
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               fixed: 1 0;
+               aspect: 1.0 1.0;
+               visible: 1;
+            }
+            description { state: "icononly" 0.0;
+               inherit: "default";
+               fixed: 0 0;
+               align: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               rel2.offset: -7 -8;
+               visible: 1;
+            }
+         }
+         part { name: "sizer.content";
+            type: TEXT;
+            mouse_events: 0;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 0;
+               text {
+                  font: FN;
+                  size: 10;
+                  min: 0 0;
+                  text_class: "button_text";
+               }
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+            description { state: "icononly" 0.0;
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+         }
+         part { name: "elm.text";
+            type: TEXT;
+            mouse_events: 0;
+            effect: SHADOW BOTTOM;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.offset: 0 5;
+               rel1.relative: 1.0 0.0;
+               rel1.to_x: "elm.swallow.content";
+               rel1.to_y: "base";
+               rel2.offset: -8 -8;
+               rel2.to: "base";
+               color_class: "button_text";
+               color3: 255 255 255 255;
+               text {
+                  font: FN;
+                  size: 10;
+                  align: 0.5 0.5;
+                  min: 0 0;
+                  text_class: "button";
+               }
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "pressed_visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            description { state: "textonly" 0.0;
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "pressed_textonly" 0.0;
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            description { state: "disabled_visible" 0.0;
+               inherit: "default";
+               rel1.offset: 2 5;
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            description { state: "disabled_textonly" 0.0;
+               inherit: "default";
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+         }
+         part { name: "event";
+            type: RECT;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               visible: 0;
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,press" "elm";
+            after: "button_click_anim";
+         }
+         program { name: "button_click_anim";
+            script {
+               new m = get_int(btmode);
+               m |= PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_unclick";
+            signal: "mouse,up,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,unpress" "elm";
+            after: "button_unclick_anim";
+         }
+         program { name: "button_unclick_anim";
+            script {
+               new m = get_int(btmode);
+               m &= ~PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_hover";
+            signal: "mouse,in";
+            source: "event";
+            action: STATE_SET "hovered" 0.0;
+            target: "base";
+         }
+         program { name: "button_unhover";
+            signal: "mouse,out";
+            source: "event";
+            action: STATE_SET "default" 0.0;
+            target: "base";
+         }
+         program { name: "buttonactivate";
+            signal: "elm,anim,activate";
+            source: "elm";
+            action: STATE_SET "pressed" 0.0;
+            target: "base";
+            after: "button_unpressed_anim";
+         }
+         program { name: "button_unpressed_anim";
+            action: STATE_SET "default" 0.0;
+            in: 0.5 0.0;
+            target: "base";
+         }
+         program { name: "mouse_click";
+            signal: "mouse,clicked,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,click" "elm";
+         }
+         program { name: "button_text_visible";
+            signal: "elm,state,text,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_text_hidden";
+            signal: "elm,state,text,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_icon_visible";
+            signal: "elm,state,icon,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_icon_hidden";
+            signal: "elm,state,icon,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_background_visible";
+            signal: "elm,state,background,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_background_hidden";
+            signal: "elm,state,background,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_state_disabled";
+            signal: "elm,state,disabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { name: "button_state_enabled";
+            signal: "elm,state,enabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+      }
+#undef ICON
+#undef LABEL
+#undef MASK
+#undef DISABLE
+#undef PRESSED
+#undef BACKGROUND
+   }
+}
diff --git a/data/templates/2.4-templates/Empty.edc b/data/templates/2.4-templates/Empty.edc
new file mode 100644 (file)
index 0000000..7f34dd8
--- /dev/null
@@ -0,0 +1,7 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.4-templates/Group.edc b/data/templates/2.4-templates/Group.edc
new file mode 100644 (file)
index 0000000..8853b12
--- /dev/null
@@ -0,0 +1,41 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+         }
+         part { name: "group";
+            type: GROUP;
+            source: "my_group";
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+   }
+   group { name: "my_group";
+      parts {
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            description { state: "default" 0.0;
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 30;
+                  font: "Sans";
+                  text: "My Group";
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.4-templates/Image.edc b/data/templates/2.4-templates/Image.edc
new file mode 100644 (file)
index 0000000..73a4d4b
--- /dev/null
@@ -0,0 +1,22 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.4-templates/Listitem.edc b/data/templates/2.4-templates/Listitem.edc
new file mode 100644 (file)
index 0000000..8627bf9
--- /dev/null
@@ -0,0 +1,285 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 233 242 242 255;
+               align: 0.5 0.5;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               min: 300 60;
+               max: 99999 60;
+               fixed: 1 1;
+            }
+         }
+         part { name: "point_rect";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 176 137 255;
+               align: 0.0 0.0;
+               rel1.to: "bg";
+               rel1.relative: 0.0 0.0;
+               rel2.to: "bg";
+               min: 5 0;
+               max: 5 99999;
+               fixed: 1 0;
+            }
+         }
+         part { name: "padding_left";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "point_rect";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "point_rect";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "icon_status";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png";
+               align: 0.0 0.5;
+               rel1.to: "padding_left";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_left";
+               rel2.relative: 0.0 0.5;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "icon_user";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "icon_status";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_status";
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "user_name";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 130 130 130 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Lisa";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to: "icon_user";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_user";
+               min: 100 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "message";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 145 145 145 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "How are you? I'm fine, thank you, and you?";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to_x: "padding_left";
+               rel1.to_y: "padding_icon";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "padding_icon";
+               rel2.relative: 0.0 1.0;
+               min: 200 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "padding_right";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "bg";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "bg";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 135 135 135 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "21 Mar.";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.5;
+               min: 40 20;
+               max: 40 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "icon_clip";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png";
+               align: 1.0 0.5;
+               rel1.to: "date";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "date";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png";
+            }
+         }
+         part { name: "icon_badge";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_clip";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_clip";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png";
+            }
+         }
+         part { name: "icon_lock";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_badge";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_badge";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png";
+            }
+         }
+         part { name: "icon_check";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.5;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.9;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "padding_icon";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1.to: "icon_check";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_check";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down_lock";
+            signal: "mouse,down,1";
+            source: "icon_lock";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_lock";
+         }
+         program { name: "mouse_up_lock";
+            signal: "mouse,up,1";
+            source: "icon_lock";
+            action: STATE_SET "default" 0.0;
+            target: "icon_lock";
+         }
+         program { name: "mouse_down_badge";
+            signal: "mouse,down,1";
+            source: "icon_badge";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_badge";
+         }
+         program { name: "mouse_up_badge";
+            signal: "mouse,up,1";
+            source: "icon_badge";
+            action: STATE_SET "default" 0.0;
+            target: "icon_badge";
+         }
+         program { name: "mouse_down_clip";
+            signal: "mouse,down,1";
+            source: "icon_clip";
+            action: STATE_SET "clicked" 0.0;
+            target: "icon_clip";
+         }
+         program { name: "mouse_up_clip";
+            signal: "mouse,up,1";
+            source: "icon_clip";
+            action: STATE_SET "default" 0.0;
+            target: "icon_clip";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.4-templates/Makefile.am b/data/templates/2.4-templates/Makefile.am
new file mode 100644 (file)
index 0000000..bee1013
--- /dev/null
@@ -0,0 +1,110 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EDJE_CC = @edje_cc@
+EDJE_FLAGS = -id $(top_srcdir)/data/images -sd $(top_srcdir)/data/sounds
+
+filesdir = $(datadir)/$(PACKAGE)/templates/2.4-templates
+files_DATA = Basic.edc \
+             Basic.edj \
+             CustomButton.edc \
+             CustomButton.edj \
+             Clip.edc \
+             Clip.edj \
+             Empty.edc \
+             Empty.edj \
+             Group.edc \
+             Group.edj \
+             Image.edc \
+             Image.edj \
+             Listitem.edc \
+             Listitem.edj \
+             Map.edc \
+             Map.edj \
+             MobileLayout.edc \
+             MobileLayout.edj \
+             MouseEvent.edc \
+             MouseEvent.edj \
+             Proxy.edc \
+             Proxy.edj \
+             Rect.edc \
+             Rect.edj \
+             Spacer.edc \
+             Spacer.edj \
+             Text.edc \
+             Text.edj \
+             Textblock.edc \
+             Textblock.edj \
+             Transition.edc \
+             Transition.edj \
+             Tween.edc \
+             Tween.edj \
+             Watchface.edc \
+             Watchface.edj \
+             Watchface2.edc \
+             Watchface2.edj
+
+EXTRA_DIST = $(files_DATA)
+
+srcdir = $(top_srcdir)/data/templates/2.4-templates
+builddir = $(top_builddir)/data/templates/2.4-templates
+
+Basic.edj: Makefile Basic.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Basic.edc $(builddir)/Basic.edj
+
+CustomButton.edj: Makefile CustomButton.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/CustomButton.edc $(builddir)/CustomButton.edj
+
+Empty.edj: Makefile Empty.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Empty.edc $(builddir)/Empty.edj
+
+Map.edj: Makefile Map.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Map.edc $(builddir)/Map.edj
+
+MobileLayout.edj: Makefile MobileLayout.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MobileLayout.edc $(builddir)/MobileLayout.edj
+
+MouseEvent.edj: Makefile MouseEvent.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MouseEvent.edc $(builddir)/MouseEvent.edj
+
+Textblock.edj: Makefile Textblock.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Textblock.edc $(builddir)/Textblock.edj
+
+Transition.edj: Makefile Transition.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Transition.edc $(builddir)/Transition.edj
+
+Tween.edj: Makefile Tween.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Tween.edc $(builddir)/Tween.edj
+
+Rect.edj: Makefile Rect.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Rect.edc $(builddir)/Rect.edj
+
+Group.edj: Makefile Group.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Group.edc $(builddir)/Group.edj
+
+Listitem.edj: Makefile Listitem.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Listitem.edc $(builddir)/Listitem.edj
+
+Image.edj: Makefile Image.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Image.edc $(builddir)/Image.edj
+
+Text.edj: Makefile Text.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Text.edc $(builddir)/Text.edj
+
+Proxy.edj: Makefile Proxy.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Proxy.edc $(builddir)/Proxy.edj
+
+Clip.edj: Makefile Clip.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Clip.edc $(builddir)/Clip.edj
+
+Spacer.edj: Makefile Spacer.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Spacer.edc $(builddir)/Spacer.edj
+
+Watchface.edj: Makefile Watchface.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface.edc $(builddir)/Watchface.edj
+
+Watchface2.edj: Makefile Watchface2.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface2.edc $(builddir)/Watchface2.edj
+
+clean-local:
+       rm -f *.edj
+       rm -f $(datadir)/$(PACKAGE)/templates/2.4-templates/*edj
diff --git a/data/templates/2.4-templates/Map.edc b/data/templates/2.4-templates/Map.edc
new file mode 100644 (file)
index 0000000..e50226a
--- /dev/null
@@ -0,0 +1,79 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+               map.on: 1;
+               map.color[2]: 0 0 0 0;
+               map.color[3]: 0 0 0 0;
+            }
+         }
+         part { name: "perps_point";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.6 0.1;
+               rel2.relative: 0.9 0.4;
+               visible: 0;
+            }
+         }
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+               map {
+                  on: 1;
+                  rotation.y: 45;
+                  perspective_on: 1;
+                  perspective: "perps_point";
+                  backface_cull: 1;
+               }
+            }
+         }
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: OUTLINE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 0.5 1.0;
+               color: 0 150 221 255;
+               color2: 0 150 221 155;
+               text {
+                  size: 20;
+                  font: "Sans";
+                  text: "EDC Editor";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+         part { name: "rect2";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.55 0.55;
+               rel2.relative: 0.95 0.95;
+               map {
+                  on: 1;
+                  color[0]: 255 0 0 255;
+                  color[1]: 0 255 0 255;
+                  color[2]: 0 0 255 255;
+                  color[3]: 255 255 255 255;
+               }
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.4-templates/MobileLayout.edc b/data/templates/2.4-templates/MobileLayout.edc
new file mode 100644 (file)
index 0000000..a2491a5
--- /dev/null
@@ -0,0 +1,509 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png" COMP;
+      }
+      parts {
+         part { name: "base";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 200 300;
+            }
+         }
+         /* Header */
+         part { name: "header";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 200 0 0 255;
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel2.to: "base";
+               rel2.relative: 1.0 0.1;
+               min: 0 40;
+               max: 9999 40;
+               fixed: 0 1;
+            }
+         }
+         part { name: "header_padding";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.5;
+               rel1.to: "header";
+               rel2.to: "header";
+               max: 10 20;
+               fixed: 1 1;
+            }
+         }
+         part { name: "header_button_panel_open";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               color: 125 125 125 255;
+            }
+         }
+         part { name: "header_button_panel_close";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "header_title";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "TITLE";
+                  min: 0 0;
+               }
+               rel1.to: "header";
+               rel2.to: "header";
+            }
+         }
+         /* Content */
+         part { name: "content_padding_top";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "header";
+               min: 0 5;
+               fixed: 0 1;
+            }
+         }
+         part { name: "content_main";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 30 46 93 255;
+               align: 0.5 0.0;
+               rel1.to: "content_padding_top";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 5 0;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_main_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add main content";
+                  min: 0 0;
+               }
+               rel1.to: "content_main";
+               rel2.to: "content_main";
+            }
+         }
+         part { name: "content_padding_middle";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel1.relative: 0.0 0.5;
+               rel2.to: "base";
+               max: 0 5;
+            }
+         }
+         part { name: "content_sub_1";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 136 170 255;
+               align: 0.0 0.0;
+               rel1.to: "content_padding_middle";
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 0.5 0.85;
+               rel2.offset: 0 0;
+            }
+         }
+         part { name: "content_sub_1_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 1";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_1";
+               rel2.to: "content_sub_1";
+            }
+         }
+         part { name: "content_sub_2";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 66 118 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.0;
+               rel1.offset: 5 0;
+               rel2.to_x: "base";
+               rel2.to_y: "content_sub_1";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_sub_2_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 2";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_2";
+               rel2.to: "content_sub_2";
+            }
+         }
+         part { name: "content_sub_3";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 83 66 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.5;
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.85;
+               rel2.offset: -5 0;
+            }
+         }
+         part { name: "content_sub_3_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 3";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_3";
+               rel2.to: "content_sub_3";
+            }
+         }
+         part { name: "content_bottom";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 95 95 95 255;
+               rel1.to: "content_sub_1";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 0 5;
+               rel2.to: "base";
+               rel2.offset: -5 -5;
+            }
+         }
+         part { name: "content_bottom_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add bottom content";
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "content_bottom";
+               rel2.to: "content_bottom";
+            }
+         }
+         /* Mask */
+         part { name: "mask";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 155;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         /* Panel */
+         part { name: "panel_base";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               rel2.relative: 0.7 1.0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_1";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 94 0 255;
+               rel1.to: "panel_base";
+               rel1.offset: 0 1;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.15;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_1_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Add";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "panel_content_1";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_1";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_2";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 130 36 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.15;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.30;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_2_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Your";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_2";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_2";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_3";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 166 72 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.30;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.45;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_3_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Content";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_3";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_3";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_4";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 202 108 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.45;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.60;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_content_4_text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "in Swallow";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_4";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_4";
+               visible: 0;
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         part { name: "panel_swallow";
+            type: SWALLOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 0;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.6;
+               rel1.offset: 5 5;
+               rel2.to: "panel_base";
+               rel2.offset: -5 -5;
+
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               visible: 1;
+            }
+         }
+      }
+      programs {
+         program { name: "panel_open";
+            signal: "mouse,down,1";
+            source: "header_button_panel_open";
+            action: STATE_SET "clicked" 0.0;
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+         program { name: "panel_close";
+            signal: "mouse,down,1";
+            source: "header_button_panel_close";
+            action: STATE_SET "default" 0.0;
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.4-templates/MouseEvent.edc b/data/templates/2.4-templates/MouseEvent.edc
new file mode 100644 (file)
index 0000000..2516cf9
--- /dev/null
@@ -0,0 +1,84 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+      parts {
+         part { name:  "button_shadow";
+            type: RECT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 155;
+               rel1.to: "button_bg";
+               rel1.offset: 5 5;
+               rel2.to: "button_bg";
+               rel2.offset: 4 4;
+            }
+         }
+         part { name:  "button_bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               min: 50 20;
+               max: 200 50;
+            }
+            description { state: "hovered" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+            }
+         }
+         part { name: "button_text";
+            type: TEXT;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               color: 70 70 70 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Mouse Event Example";
+               }
+               rel1.to: "button_bg";
+               rel2.to: "button_bg";
+            }
+         }
+      }
+      programs {
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "button_bg";
+            action: STATE_SET "clicked" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_up";
+            signal: "mouse,up,1";
+            source: "button_bg";
+            action: STATE_SET "hovered" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_in";
+            signal: "mouse,in";
+            source: "button_bg";
+            action: STATE_SET "hovered" 0.0;
+            target: "button_bg";
+         }
+         program { name: "mouse_out";
+            signal: "mouse,out";
+            source: "button_bg";
+            action: STATE_SET "default" 0.0;
+            target: "button_bg";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.4-templates/Proxy.edc b/data/templates/2.4-templates/Proxy.edc
new file mode 100644 (file)
index 0000000..be768b0
--- /dev/null
@@ -0,0 +1,32 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         part { name: "logo";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         part { name: "proxy";
+            type: PROXY;
+            description { state: "default" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               aspect: 1 1;
+               aspect_preference: BOTH;
+               source: "logo";
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.4-templates/Rect.edc b/data/templates/2.4-templates/Rect.edc
new file mode 100644 (file)
index 0000000..5187a38
--- /dev/null
@@ -0,0 +1,15 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.4-templates/Spacer.edc b/data/templates/2.4-templates/Spacer.edc
new file mode 100644 (file)
index 0000000..b2e8961
--- /dev/null
@@ -0,0 +1,39 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "spacer1";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 50 50;
+               fixed: 1 1;
+               align: 0 0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.0 0.0;
+            }
+         }
+         part { name: "spacer2";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 50 50;
+               fixed: 1 1;
+               align: 1 1;
+               rel1.relative: 1.0 1.0;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.to: "spacer1";
+               rel1.relative: 1.0 1.0;
+               rel2.to: "spacer2";
+               rel2.relative: 0.0 0.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.4-templates/Text.edc b/data/templates/2.4-templates/Text.edc
new file mode 100644 (file)
index 0000000..3a4da74
--- /dev/null
@@ -0,0 +1,24 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "text";
+            type: TEXT;
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 50;
+                  font: "Sans";
+                  text: "TEXT";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.4-templates/Textblock.edc b/data/templates/2.4-templates/Textblock.edc
new file mode 100644 (file)
index 0000000..f16f0c3
--- /dev/null
@@ -0,0 +1,133 @@
+collections {
+   base_scale: 1.0;
+   styles {
+      style { name: "basic_style";
+         base: "font="Sans" font_size=20 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0088AA64 valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { name: "wrap_none_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF0000 valign=0.5 wrap=none align=center";
+      }
+      style { name: "wrap_char_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF5E00 valign=0.5 wrap=char align=center";
+      }
+      style { name: "wrap_word_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FFBB00 valign=0.5 wrap=word align=center";
+      }
+      style { name: "wrap_mixed_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#1DDB16 valign=0.5 wrap=mixed align=center";
+      }
+      style { name: "ellipsis_1_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0054FF valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { name: "ellipsis_0_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#5F00FF valign=0.5 ellipsis=0.0 wrap=none align=center";
+      }
+   }
+   group { name: "main";
+      parts {
+         part { name: "text_block";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               text {
+                  style: "basic_style";
+                  text: "Try resizing view!";
+                  min: 0 1;
+               }
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.1;
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_none";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_block";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.25;
+               text {
+                  style: "wrap_none_style";
+                  text: "[wrap = none] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_char";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_none";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.4;
+               text {
+                  style: "wrap_char_style";
+                  text: "[wrap = char] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_word";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_char";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.55;
+               text {
+                  style: "wrap_word_style";
+                  text: "[wrap = word] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_wrap_mixed";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_word";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.7;
+               text {
+                  style: "wrap_mixed_style";
+                  text: "[wrap = mixed] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_ellipsis_1";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_wrap_mixed";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.85;
+               text {
+                  style: "ellipsis_1_style";
+                  text: "[ellipsis = 1] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         part { name: "text_ellipsis_0";
+            type: TEXTBLOCK;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "text_ellipsis_1";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 1.0;
+               text {
+                  style: "ellipsis_0_style";
+                  text: "[ellipsis = 0] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/2.4-templates/Transition.edc b/data/templates/2.4-templates/Transition.edc
new file mode 100644 (file)
index 0000000..e924788
--- /dev/null
@@ -0,0 +1,36 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      parts {
+         part { name: "rect";
+            type: RECT;
+            description { state: "default" 0.0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.25 0.25;
+               color: 255 255 0 255;
+            }
+            description { state: "changed" 0.0;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+      programs {
+         program { name: "anim1";
+            signal: "load";
+            source: "";
+            action: STATE_SET "changed" 0.0;
+            target: "rect";
+            transition: ACCELERATE 1;
+            after: "anim2";
+         }
+         program { name: "anim2";
+            action: STATE_SET "default" 0.0;
+            target: "rect";
+            transition: DECELERATE 2;
+            after: "anim1";
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/2.4-templates/Tween.edc b/data/templates/2.4-templates/Tween.edc
new file mode 100644 (file)
index 0000000..9e39724
--- /dev/null
@@ -0,0 +1,52 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-01.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-02.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-03.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-04.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-05.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-06.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-07.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-08.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-09.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-10.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-11.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-12.png" COMP;
+      }
+      parts {
+         part { name: "image";
+            type: IMAGE;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_TRIAB-01.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-02.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-03.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-04.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-05.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-06.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-07.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-08.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-09.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-10.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-11.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-12.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+      programs {
+         program { name: "tween_anim";
+            signal: "load";
+            source: "";
+            action: STATE_SET "default" 0.0;
+            transition: LINEAR 1;
+            target: "image";
+            after: "tween_anim";
+         }
+      }
+   }
+}
diff --git a/data/templates/2.4-templates/Watchface.edc b/data/templates/2.4-templates/Watchface.edc
new file mode 100644 (file)
index 0000000..6b7e158
--- /dev/null
@@ -0,0 +1,257 @@
+collections {
+   base_scale: 1;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE.png";
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+               fixed: 1 1;
+            }
+         }
+         part { name: "moonphase_moon";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png";
+               rel1.to: "moonphase_cover";
+               rel2.to: "moonphase_cover";
+               fixed: 1 1;
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "moonphase_cover";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png";
+               min: 130 130;
+               align: 0.5 1.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 1;
+               rel2.relative: 0.5 1;
+               fixed: 1 1;
+            }
+         }
+         part { name: "month_stroke";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.15 0.15;
+               rel2.relative: 0.85 0.85;
+               map.on: 1;
+            }
+            description { state: "feb" 0.0;
+               inherit: "default";
+               map.rotation.z: 20;
+            }
+            description { state: "mar" 0.0;
+               inherit: "default";
+               map.rotation.z: 40;
+            }
+            description { state: "apr" 0.0;
+               inherit: "default";
+               map.rotation.z: 60;
+            }
+            description { state: "may" 0.0;
+               inherit: "default";
+               map.rotation.z: 80;
+            }
+            description { state: "jun" 0.0;
+               inherit: "default";
+               map.rotation.z: 100;
+            }
+            description { state: "jul" 0.0;
+               inherit: "default";
+               map.rotation.z: 120;
+            }
+            description { state: "aug" 0.0;
+               inherit: "default";
+               map.rotation.z: 140;
+            }
+            description { state: "sep" 0.0;
+               inherit: "default";
+               map.rotation.z: 160;
+            }
+            description { state: "oct" 0.0;
+               inherit: "default";
+               map.rotation.z: 180;
+            }
+            description { state: "nov" 0.0;
+               inherit: "default";
+               map.rotation.z: 200;
+            }
+            description { state: "dec" 0.0;
+               inherit: "default";
+               map.rotation.z: 220;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+               scale: 1;
+               description { state: "default" 0.0;
+                  color: 0 0 0 255;
+                  fixed: 1 1;
+                  text {
+                     size: 11;
+                     font: "Sans";
+                     text: "18";
+                     align: 0.5 0.5;
+                     min: 0 0;
+                  }
+                  min: 30 30;
+                  align: 0.5 1.0;
+                  fixed: 1 1;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.922 0.545;
+                  rel2.relative: 0.922 0.545;
+               }
+            }
+            part { name: "hour";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 35 0;
+                  fixed: 1 0;
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+            part { name: "minute";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 35 0;
+                  fixed: 1 0;               
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+            part { name: "second";
+               type: IMAGE;
+               scale: 1;
+               mouse_events: 0;;
+               description { state: "default" 0.0;
+                  rel1.to: "bg";
+                  rel2.to: "bg";
+                  rel1.relative: 0.5 0.0;
+                  rel2.relative: 0.5 1.0;
+                  min: 25 0;
+                  fixed: 1 0;                 
+                  /* TODO: Please replace embedded image files to your application image files. */
+                  image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png";
+                  map.on: 1;
+                  map.rotation.z: 0;
+               }
+               description { state: "rotated" 0.0;
+                  inherit: "default";
+                  map.rotation.z: 360;
+               }
+            }
+         }
+         programs {
+            program { name: "load";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "moonphase_moon";
+               transition: LINEAR 30;
+               after: "reset";
+            }
+            program { name: "reset";
+               action: STATE_SET "default" 0.0;
+               target: "moonphase_moon";
+               after: "load";
+            }
+            program { name: "hour_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "hour";
+               transition: LINEAR 216000;
+               after: "hour_reset";
+            }
+            program { name: "hour_reset";
+               action: STATE_SET "default" 0.0;
+               target: "hour";
+               after: "hour_begin";
+            }
+            program { name: "minute_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "minute";
+               transition: LINEAR 3600;
+               after: "minute_begin";
+            }
+            program { name: "minute_reset";
+               action: STATE_SET "default" 0.0;
+               target: "minute";
+               after: "minute_begin";
+            }
+            program { name: "second_begin";
+               signal: "load";
+               source: "";
+               action: STATE_SET "rotated" 0.0;
+               target: "second";
+               transition: LINEAR 60;
+               after: "second_reset";
+            }
+            program { name: "second_reset";
+               action: STATE_SET "default" 0.0;
+               target: "second";
+               after: "second_begin";
+            }
+         }
+      }
+   }
\ No newline at end of file
diff --git a/data/templates/2.4-templates/Watchface2.edc b/data/templates/2.4-templates/Watchface2.edc
new file mode 100644 (file)
index 0000000..ab84421
--- /dev/null
@@ -0,0 +1,206 @@
+collections {
+   base_scale: 1.0;
+   group { name: "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            type: IMAGE;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 1;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png";
+               //aspect: 1 1;
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+            }
+         }
+         part { name: "date";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 219 219 219 255;
+               fixed: 1 1;
+               text {
+                  size: 13;
+                  font: "Sans";
+                  text: "19";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               min: 30 30;
+               align: 0.5 1.0;
+               fixed: 1 1;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.795 0.545;
+               rel2.relative: 0.795 0.545;
+            }
+         }
+         part { name: "meridiem";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 255 120 0 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "AM";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.9 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         part { name: "time";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 250 250 250 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "12:00";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.5 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         part { name: "hour";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "minute";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;               
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         part { name: "second";
+            type: IMAGE;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;                 
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            description { state: "rotated" 0.0;
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+      }
+      programs {
+         program { name: "load";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "bg";
+            transition: LINEAR 30;
+            after: "reset";
+         }
+         program { name: "reset";
+            action: STATE_SET "default" 0.0;
+            target: "bg";
+            after: "load";
+         }
+         program { name: "hour_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "hour";
+            transition: LINEAR 216000;
+            after: "hour_reset";
+         }
+         program { name: "hour_reset";
+            action: STATE_SET "default" 0.0;
+            target: "hour";
+            after: "hour_begin";
+         }
+         program { name: "minute_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "minute";
+            transition: LINEAR 3600;
+            after: "minute_begin";
+         }
+         program { name: "minute_reset";
+            action: STATE_SET "default" 0.0;
+            target: "minute";
+            after: "minute_begin";
+         }
+         program { name: "second_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated" 0.0;
+            target: "second";
+            transition: LINEAR 60;
+            after: "second_reset";
+         }
+         program { name: "second_reset";
+            action: STATE_SET "default" 0.0;
+            target: "second";
+            after: "second_begin";
+         }
+      }
+   }
+}
diff --git a/data/templates/3.0-templates/Basic.edc b/data/templates/3.0-templates/Basic.edc
new file mode 100644 (file)
index 0000000..482689d
--- /dev/null
@@ -0,0 +1,71 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         image { "logo";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         rect { "rect";
+            desc { "default";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+            desc { "clicked";
+               rel1.relative: 0.65 0.15;
+               rel2.relative: 0.85 0.35;
+               color: 170 136 0 255;
+            }
+         }
+         text { "text";
+            scale: 1;
+            effect: OUTLINE;
+            desc { "default";
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 0.5 1.0;
+               color: 0 150 221 255;
+               color2: 0 150 221 155;
+               text {
+                  size: 20;
+                  font: "Sans";
+                  text: "EDC Editor";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+         swallow { "content";
+            desc { "default";
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+      /*
+      programs {
+         program { "mouse_down";
+            signal: "mouse,down,1";
+            source: "rect";
+            action: STATE_SET "clicked";
+            target: "rect";
+         }
+         program { "mouse_up";
+            signal: "mouse,up,1";
+            source: "rect";
+            action: STATE_SET "default";
+            target: "rect";
+         }
+      }
+      */
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Clip.edc b/data/templates/3.0-templates/Clip.edc
new file mode 100644 (file)
index 0000000..d467fe4
--- /dev/null
@@ -0,0 +1,29 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         rect { "clipper";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 1.0;
+               color: 0 136 170 255;
+            }
+         }
+         image { "logo";
+            clip_to: "clipper";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/CustomButton.edc b/data/templates/3.0-templates/CustomButton.edc
new file mode 100644 (file)
index 0000000..8955c66
--- /dev/null
@@ -0,0 +1,449 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+#define ICON     1
+#define LABEL    2
+#define MASK     3
+#define DISABLE  4
+#define PRESSED  8
+#define BACKGROUND  16
+      script {
+         public btmode;
+         public eval_mode(m) {
+            new m1 = m & MASK;
+            new d = m & DISABLE;
+            new p = m & PRESSED;
+            new bg = m & BACKGROUND;
+            if (bg) {
+               set_state(PART:"base", "hidden", 0.0);
+               set_state(PART:"elm.swallow.background", "visible", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.background", "default", 0.0);
+               if (!d) {
+                  if (!p)
+                  {
+                     set_state(PART:"base", "default", 0.0);
+                     set_state(PART:"base", "default", 0.0);
+                  }
+                  else {
+                     set_state(PART:"base", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"base", "disabled", 0.0);
+               }
+            }
+            if (m1 == (ICON | LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p) {
+                     set_state(PART:"elm.text", "visible", 0.0);
+                     set_state(PART:"icon_clip", "default", 0.0);
+                  } else {
+                     set_state(PART:"elm.text", "pressed_visible", 0.0);
+                     set_state(PART:"icon_clip", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"elm.text", "disabled_visible", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (ICON)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  else
+                  set_state(PART:"icon_clip", "pressed", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"elm.text", "textonly", 0.0);
+                  else
+                  set_state(PART:"elm.text", "pressed_textonly", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"elm.text", "disabled_textonly", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            }
+         }
+      }
+      parts {
+         image { "base";
+            nomouse;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               image.middle: SOLID;
+               rel1.offset: -1 0;
+               rel2.offset: 0 1;
+               fill.smooth: 0;
+               color_class: "button_bg";
+            }
+            desc { "hovered";
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            desc { "pressed";
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+               color_class: "button_bg_pressed";
+            }
+            desc { "disabled";
+               inherit: "default";
+               color_class: "button_bg_disabled";
+            }
+            desc { "hidden";
+               inherit: "default";
+               visible: 0;
+            }
+         }
+         swallow { "elm.swallow.background";
+            nomouse;
+            desc { "default";
+               rel1.to: "base";
+               rel2.to: "base";
+               visible: 0;
+            }
+            desc { "visible";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         rect { "icon_clip";
+            desc { "default";
+               color_class: "button_icon";
+            }
+            desc { "pressed";
+               inherit: "default";
+               color_class: "button_icon_pressed";
+            }
+            desc { "disabled";
+               inherit: "default";
+               color_class: "button_icon_disabled";
+            }
+         }
+         swallow { "elm.swallow.content";
+            nomouse;
+            clip_to: "icon_clip";
+            desc { "default";
+               fixed: 1 0;
+               align: 0.0 0.5;
+               rel1.offset: 6 5;
+               rel1.to: "base";
+               rel2.relative: 0.0 1.0;
+               rel2.offset: 6 -8;
+               rel2.to: "base";
+               visible: 0;
+            }
+            desc { "visible";
+               inherit: "default";
+               fixed: 1 0;
+               aspect: 1.0 1.0;
+               visible: 1;
+            }
+            desc { "icononly";
+               inherit: "default";
+               fixed: 0 0;
+               align: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               rel2.offset: -7 -8;
+               visible: 1;
+            }
+         }
+         text { "sizer.content";
+            nomouse;
+            scale: 1;
+            desc { "default";
+               visible: 0;
+               text {
+                  font: FN;
+                  size: 10;
+                  min: 0 0;
+                  text_class: "button_text";
+               }
+            }
+            desc { "visible";
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+            desc { "icononly";
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+         }
+         text { "elm.text";
+            nomouse;
+            effect: SHADOW BOTTOM;
+            scale: 1;
+            desc { "default";
+               rel1.offset: 0 5;
+               rel1.relative: 1.0 0.0;
+               rel1.to_x: "elm.swallow.content";
+               rel1.to_y: "base";
+               rel2.offset: -8 -8;
+               rel2.to: "base";
+               color_class: "button_text";
+               color3: 255 255 255 255;
+               text {
+                  font: FN;
+                  size: 10;
+                  align: 0.5 0.5;
+                  min: 0 0;
+                  text_class: "button";
+               }
+               visible: 0;
+               fixed: 1 1;
+            }
+            desc { "visible";
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            desc { "pressed_visible";
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            desc { "textonly";
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            desc { "pressed_textonly";
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            desc { "disabled_visible";
+               inherit: "default";
+               rel1.offset: 2 5;
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            desc { "disabled_textonly";
+               inherit: "default";
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+         }
+         rect { "event";
+            desc { "default";
+               color: 0 0 0 0;
+            }
+            desc { "disabled";
+               inherit: "default";
+               visible: 0;
+            }
+         }
+      }
+      programs {
+         program {
+            signal: "mouse,down,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,press" "elm";
+            after: "button_click_anim";
+         }
+         program { "button_click_anim";
+            script {
+               new m = get_int(btmode);
+               m |= PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_unclick";
+            signal: "mouse,up,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,unpress" "elm";
+            after: "button_unclick_anim";
+         }
+         program { "button_unclick_anim";
+            script {
+               new m = get_int(btmode);
+               m &= ~PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_hover";
+            signal: "mouse,in";
+            source: "event";
+            action: STATE_SET "hovered";
+            target: "base";
+         }
+         program { "button_unhover";
+            signal: "mouse,out";
+            source: "event";
+            action: STATE_SET "default";
+            target: "base";
+         }
+         program { "buttonactivate";
+            signal: "elm,anim,activate";
+            source: "elm";
+            action: STATE_SET "pressed" 0.0;
+            target: "base";
+            after: "button_unpressed_anim";
+         }
+         program { "button_unpressed_anim";
+            action: STATE_SET "default" 0.0;
+            in: 0.5 0.0;
+            target: "base";
+         }
+         program {
+            signal: "mouse,clicked,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,click" "elm";
+         }
+         program { "button_text_visible";
+            signal: "elm,state,text,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_text_hidden";
+            signal: "elm,state,text,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_icon_visible";
+            signal: "elm,state,icon,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_icon_hidden";
+            signal: "elm,state,icon,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_background_visible";
+            signal: "elm,state,background,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_background_hidden";
+            signal: "elm,state,background,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_state_disabled";
+            signal: "elm,state,disabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_state_enabled";
+            signal: "elm,state,enabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+      }
+#undef ICON
+#undef LABEL
+#undef MASK
+#undef DISABLE
+#undef PRESSED
+#undef BACKGROUND
+   }
+}
diff --git a/data/templates/3.0-templates/Empty.edc b/data/templates/3.0-templates/Empty.edc
new file mode 100644 (file)
index 0000000..e94245a
--- /dev/null
@@ -0,0 +1,7 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Group.edc b/data/templates/3.0-templates/Group.edc
new file mode 100644 (file)
index 0000000..b3c8e0b
--- /dev/null
@@ -0,0 +1,38 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+         rect { "rect";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+         }
+         group { "group";
+            source: "my_group";
+            desc { "default";
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+   }
+   group { "my_group";
+      parts {
+         text { "text";
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            desc { "default";
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 30;
+                  font: "Sans";
+                  text: "My Group";
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Image.edc b/data/templates/3.0-templates/Image.edc
new file mode 100644 (file)
index 0000000..d8a9da8
--- /dev/null
@@ -0,0 +1,21 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         image { "logo";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Listitem.edc b/data/templates/3.0-templates/Listitem.edc
new file mode 100644 (file)
index 0000000..0dcb9fa
--- /dev/null
@@ -0,0 +1,271 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png" COMP;
+      }
+      parts {
+         rect { "bg";
+            scale: 1;
+            desc { "default";
+               color: 233 242 242 255;
+               align: 0.5 0.5;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               min: 300 60;
+               max: 99999 60;
+               fixed: 1 1;
+            }
+         }
+         rect { "point_rect";
+            scale: 1;
+            desc { "default";
+               color: 0 176 137 255;
+               align: 0.0 0.0;
+               rel1.to: "bg";
+               rel1.relative: 0.0 0.0;
+               rel2.to: "bg";
+               min: 5 0;
+               max: 5 99999;
+               fixed: 1 0;
+            }
+         }
+         spacer { "padding_left";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.5;
+               rel1.to: "point_rect";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "point_rect";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         image { "icon_status";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png";
+               align: 0.0 0.5;
+               rel1.to: "padding_left";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_left";
+               rel2.relative: 0.0 0.5;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         swallow { "icon_user";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.5;
+               rel1.to: "icon_status";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_status";
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+         text { "user_name";
+            scale: 1;
+            desc { "default";
+               color: 130 130 130 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Lisa";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to: "icon_user";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_user";
+               min: 100 0;
+               fixed: 1 0;
+            }
+         }
+         text { "message";
+            scale: 1;
+            desc { "default";
+               color: 145 145 145 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "How are you? I'm fine, thank you, and you?";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to_x: "padding_left";
+               rel1.to_y: "padding_icon";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "padding_icon";
+               rel2.relative: 0.0 1.0;
+               min: 200 0;
+               fixed: 1 0;
+            }
+         }
+         spacer { "padding_right";
+            scale: 1;
+            desc { "default";
+               align: 1.0 0.5;
+               rel1.to: "bg";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "bg";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         text { "date";
+            scale: 1;
+            desc { "default";
+               color: 135 135 135 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "21 Mar.";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.5;
+               min: 40 20;
+               max: 40 20;
+               fixed: 1 1;
+            }
+         }
+         image { "icon_clip";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png";
+               align: 1.0 0.5;
+               rel1.to: "date";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "date";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png";
+            }
+         }
+         image { "icon_badge";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_clip";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_clip";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png";
+            }
+         }
+         image { "icon_lock";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_badge";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_badge";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png";
+            }
+         }
+         swallow { "icon_check";
+            scale: 1;
+            desc { "default";
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.5;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.9;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         spacer { "padding_icon";
+            scale: 1;
+            desc { "default";
+               align: 1.0 0.5;
+               rel1.to: "icon_check";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_check";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+      }
+      programs {
+         program { "mouse_down_lock";
+            signal: "mouse,down,1";
+            source: "icon_lock";
+            action: STATE_SET "clicked";
+            target: "icon_lock";
+         }
+         program { "mouse_up_lock";
+            signal: "mouse,up,1";
+            source: "icon_lock";
+            action: STATE_SET "default";
+            target: "icon_lock";
+         }
+         program { "mouse_down_badge";
+            signal: "mouse,down,1";
+            source: "icon_badge";
+            action: STATE_SET "clicked";
+            target: "icon_badge";
+         }
+         program { "mouse_up_badge";
+            signal: "mouse,up,1";
+            source: "icon_badge";
+            action: STATE_SET "default";
+            target: "icon_badge";
+         }
+         program { "mouse_down_clip";
+            signal: "mouse,down,1";
+            source: "icon_clip";
+            action: STATE_SET "clicked";
+            target: "icon_clip";
+         }
+         program { "mouse_up_clip";
+            signal: "mouse,up,1";
+            source: "icon_clip";
+            action: STATE_SET "default";
+            target: "icon_clip";
+         }
+      }
+   }
+}
diff --git a/data/templates/3.0-templates/Makefile.am b/data/templates/3.0-templates/Makefile.am
new file mode 100644 (file)
index 0000000..8684d85
--- /dev/null
@@ -0,0 +1,110 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EDJE_CC = @edje_cc@
+EDJE_FLAGS = -id $(top_srcdir)/data/images -sd $(top_srcdir)/data/sounds
+
+filesdir = $(datadir)/$(PACKAGE)/templates/3.0-templates
+files_DATA = Basic.edc \
+             Basic.edj \
+             CustomButton.edc \
+             CustomButton.edj \
+             Clip.edc \
+             Clip.edj \
+             Empty.edc \
+             Empty.edj \
+             Group.edc \
+             Group.edj \
+             Image.edc \
+             Image.edj \
+             Listitem.edc \
+             Listitem.edj \
+             Map.edc \
+             Map.edj \
+             MobileLayout.edc \
+             MobileLayout.edj \
+             MouseEvent.edc \
+             MouseEvent.edj \
+             Proxy.edc \
+             Proxy.edj \
+             Rect.edc \
+             Rect.edj \
+             Spacer.edc \
+             Spacer.edj \
+             Text.edc \
+             Text.edj \
+             Textblock.edc \
+             Textblock.edj \
+             Transition.edc \
+             Transition.edj \
+             Tween.edc \
+             Tween.edj \
+             Watchface.edc \
+             Watchface.edj \
+             Watchface2.edc \
+             Watchface2.edj
+
+EXTRA_DIST = $(files_DATA)
+
+srcdir = $(top_srcdir)/data/templates/3.0-templates
+builddir = $(top_builddir)/data/templates/3.0-templates
+
+Basic.edj: Makefile Basic.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Basic.edc $(builddir)/Basic.edj
+
+CustomButton.edj: Makefile CustomButton.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/CustomButton.edc $(builddir)/CustomButton.edj
+
+Empty.edj: Makefile Empty.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Empty.edc $(builddir)/Empty.edj
+
+Map.edj: Makefile Map.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Map.edc $(builddir)/Map.edj
+
+MobileLayout.edj: Makefile MobileLayout.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MobileLayout.edc $(builddir)/MobileLayout.edj
+
+MouseEvent.edj: Makefile MouseEvent.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MouseEvent.edc $(builddir)/MouseEvent.edj
+
+Textblock.edj: Makefile Textblock.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Textblock.edc $(builddir)/Textblock.edj
+
+Transition.edj: Makefile Transition.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Transition.edc $(builddir)/Transition.edj
+
+Tween.edj: Makefile Tween.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Tween.edc $(builddir)/Tween.edj
+
+Rect.edj: Makefile Rect.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Rect.edc $(builddir)/Rect.edj
+
+Group.edj: Makefile Group.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Group.edc $(builddir)/Group.edj
+
+Listitem.edj: Makefile Listitem.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Listitem.edc $(builddir)/Listitem.edj
+
+Image.edj: Makefile Image.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Image.edc $(builddir)/Image.edj
+
+Text.edj: Makefile Text.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Text.edc $(builddir)/Text.edj
+
+Proxy.edj: Makefile Proxy.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Proxy.edc $(builddir)/Proxy.edj
+
+Clip.edj: Makefile Clip.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Clip.edc $(builddir)/Clip.edj
+
+Spacer.edj: Makefile Spacer.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Spacer.edc $(builddir)/Spacer.edj
+
+Watchface.edj: Makefile Watchface.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface.edc $(builddir)/Watchface.edj
+
+Watchface2.edj: Makefile Watchface2.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface2.edc $(builddir)/Watchface2.edj
+
+clean-local:
+       rm -f *.edj
+       rm -f $(datadir)/$(PACKAGE)/templates/3.0-templates/*edj
diff --git a/data/templates/3.0-templates/Map.edc b/data/templates/3.0-templates/Map.edc
new file mode 100644 (file)
index 0000000..630706b
--- /dev/null
@@ -0,0 +1,74 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         image { "logo";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+               map.on: 1;
+               map.color[2]: 0 0 0 0;
+               map.color[3]: 0 0 0 0;
+            }
+         }
+         rect { "perps_point";
+            desc { "default";
+               rel1.relative: 0.6 0.1;
+               rel2.relative: 0.9 0.4;
+               visible: 0;
+            }
+         }
+         rect { "rect";
+            desc { "default";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+               map {
+                  on: 1;
+                  rotation.y: 45;
+                  perspective_on: 1;
+                  perspective: "perps_point";
+                  backface_cull: 1;
+               }
+            }
+         }
+         text { "text";
+            scale: 1;
+            effect: OUTLINE;
+            desc { "default";
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 0.5 1.0;
+               color: 0 150 221 255;
+               color2: 0 150 221 155;
+               text {
+                  size: 20;
+                  font: "Sans";
+                  text: "EDC Editor";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+         rect { "rect2";
+            desc { "default";
+               rel1.relative: 0.55 0.55;
+               rel2.relative: 0.95 0.95;
+               map {
+                  on: 1;
+                  color[0]: 255 0 0 255;
+                  color[1]: 0 255 0 255;
+                  color[2]: 0 0 255 255;
+                  color[3]: 255 255 255 255;
+               }
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/3.0-templates/MobileLayout.edc b/data/templates/3.0-templates/MobileLayout.edc
new file mode 100644 (file)
index 0000000..ecb74e6
--- /dev/null
@@ -0,0 +1,480 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png" COMP;
+      }
+      parts {
+         rect { "base";
+            scale: 1;
+            desc { "default";
+               min: 200 300;
+            }
+         }
+         /* Header */
+         rect { "header";
+            scale: 1;
+            desc { "default";
+               color: 200 0 0 255;
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel2.to: "base";
+               rel2.relative: 1.0 0.1;
+               min: 0 40;
+               max: 9999 40;
+               fixed: 0 1;
+            }
+         }
+         spacer { "header_padding";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.5;
+               rel1.to: "header";
+               rel2.to: "header";
+               max: 10 20;
+               fixed: 1 1;
+            }
+         }
+         image { "header_button_panel_open";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+            }
+            desc { "clicked";
+               inherit: "default";
+               color: 125 125 125 255;
+            }
+         }
+         image { "header_button_panel_close";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         text { "header_title";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "TITLE";
+                  min: 0 0;
+               }
+               rel1.to: "header";
+               rel2.to: "header";
+            }
+         }
+         /* Content */
+         spacer { "content_padding_top";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "header";
+               min: 0 5;
+               fixed: 0 1;
+            }
+         }
+         rect { "content_main";
+            scale: 1;
+            desc { "default";
+               color: 30 46 93 255;
+               align: 0.5 0.0;
+               rel1.to: "content_padding_top";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 5 0;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         text { "content_main_text";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add main content";
+                  min: 0 0;
+               }
+               rel1.to: "content_main";
+               rel2.to: "content_main";
+            }
+         }
+         spacer { "content_padding_middle";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel1.relative: 0.0 0.5;
+               rel2.to: "base";
+               max: 0 5;
+            }
+         }
+         rect { "content_sub_1";
+            scale: 1;
+            desc { "default";
+               color: 0 136 170 255;
+               align: 0.0 0.0;
+               rel1.to: "content_padding_middle";
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 0.5 0.85;
+               rel2.offset: 0 0;
+            }
+         }
+         text { "content_sub_1_text";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 1";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_1";
+               rel2.to: "content_sub_1";
+            }
+         }
+         rect { "content_sub_2";
+            scale: 1;
+            desc { "default";
+               color: 66 118 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.0;
+               rel1.offset: 5 0;
+               rel2.to_x: "base";
+               rel2.to_y: "content_sub_1";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         text { "content_sub_2_text";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 2";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_2";
+               rel2.to: "content_sub_2";
+            }
+         }
+         rect { "content_sub_3";
+            scale: 1;
+            desc { "default";
+               color: 83 66 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.5;
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.85;
+               rel2.offset: -5 0;
+            }
+         }
+         text { "content_sub_3_text";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 3";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_3";
+               rel2.to: "content_sub_3";
+            }
+         }
+         rect { "content_bottom";
+            scale: 1;
+            desc { "default";
+               color: 95 95 95 255;
+               rel1.to: "content_sub_1";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 0 5;
+               rel2.to: "base";
+               rel2.offset: -5 -5;
+            }
+         }
+         text { "content_bottom_text";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add bottom content";
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "content_bottom";
+               rel2.to: "content_bottom";
+            }
+         }
+         /* Mask */
+         rect { "mask";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 155;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         /* Panel */
+         rect { "panel_base";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               rel2.relative: 0.7 1.0;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         rect { "panel_content_1";
+            scale: 1;
+            desc { "default";
+               color: 255 94 0 255;
+               rel1.to: "panel_base";
+               rel1.offset: 0 1;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.15;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         text { "panel_content_1_text";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Add";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "panel_content_1";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_1";
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         rect { "panel_content_2";
+            scale: 1;
+            desc { "default";
+               color: 255 130 36 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.15;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.30;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         text { "panel_content_2_text";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Your";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_2";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_2";
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         rect { "panel_content_3";
+            scale: 1;
+            desc { "default";
+               color: 255 166 72 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.30;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.45;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         text { "panel_content_3_text";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Content";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_3";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_3";
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         rect { "panel_content_4";
+            scale: 1;
+            desc { "default";
+               color: 255 202 108 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.45;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.60;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         text { "panel_content_4_text";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "in Swallow";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_4";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_4";
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         swallow { "panel_swallow";
+            scale: 1;
+            desc { "default";
+               visible: 0;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.6;
+               rel1.offset: 5 5;
+               rel2.to: "panel_base";
+               rel2.offset: -5 -5;
+
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+      }
+      programs {
+         program { "panel_open";
+            signal: "mouse,down,1";
+            source: "header_button_panel_open";
+            action: STATE_SET "clicked";
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+         program { "panel_close";
+            signal: "mouse,down,1";
+            source: "header_button_panel_close";
+            action: STATE_SET "default";
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+      }
+   }
+}
diff --git a/data/templates/3.0-templates/MouseEvent.edc b/data/templates/3.0-templates/MouseEvent.edc
new file mode 100644 (file)
index 0000000..e2cb8f5
--- /dev/null
@@ -0,0 +1,81 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+      parts {
+         rect { "button_shadow";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 155;
+               rel1.to: "button_bg";
+               rel1.offset: 5 5;
+               rel2.to: "button_bg";
+               rel2.offset: 4 4;
+            }
+         }
+         image { "button_bg";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               min: 50 20;
+               max: 200 50;
+            }
+            desc { "hovered";
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            desc { "clicked";
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+            }
+         }
+         text { "button_text";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               color: 70 70 70 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Mouse Event Example";
+               }
+               rel1.to: "button_bg";
+               rel2.to: "button_bg";
+            }
+         }
+      }
+      programs {
+         program { "mouse_down";
+            signal: "mouse,down,1";
+            source: "button_bg";
+            action: STATE_SET "clicked";
+            target: "button_bg";
+         }
+         program { "mouse_up";
+            signal: "mouse,up,1";
+            source: "button_bg";
+            action: STATE_SET "hovered";
+            target: "button_bg";
+         }
+         program { "mouse_in";
+            signal: "mouse,in";
+            source: "button_bg";
+            action: STATE_SET "hovered";
+            target: "button_bg";
+         }
+         program { "mouse_out";
+            signal: "mouse,out";
+            source: "button_bg";
+            action: STATE_SET "default";
+            target: "button_bg";
+         }
+      }
+   }
+}
diff --git a/data/templates/3.0-templates/Proxy.edc b/data/templates/3.0-templates/Proxy.edc
new file mode 100644 (file)
index 0000000..f5e3225
--- /dev/null
@@ -0,0 +1,30 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         image { "logo";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         proxy { "proxy";
+            desc { "default";
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               aspect: 1 1;
+               aspect_preference: BOTH;
+               source: "logo";
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Rect.edc b/data/templates/3.0-templates/Rect.edc
new file mode 100644 (file)
index 0000000..f6b162f
--- /dev/null
@@ -0,0 +1,14 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+         rect { "rect";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Spacer.edc b/data/templates/3.0-templates/Spacer.edc
new file mode 100644 (file)
index 0000000..e2a6366
--- /dev/null
@@ -0,0 +1,36 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+         spacer { "spacer1";
+            scale: 1;
+            desc { "default";
+               min: 50 50;
+               fixed: 1 1;
+               align: 0 0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.0 0.0;
+            }
+         }
+         spacer { "spacer2";
+            scale: 1;
+            desc { "default";
+               min: 50 50;
+               fixed: 1 1;
+               align: 1 1;
+               rel1.relative: 1.0 1.0;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+         rect { "rect";
+            desc { "default";
+               rel1.to: "spacer1";
+               rel1.relative: 1.0 1.0;
+               rel2.to: "spacer2";
+               rel2.relative: 0.0 0.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Text.edc b/data/templates/3.0-templates/Text.edc
new file mode 100644 (file)
index 0000000..4b7c917
--- /dev/null
@@ -0,0 +1,23 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+         text { "text";
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 50;
+                  font: "Sans";
+                  text: "TEXT";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Textblock.edc b/data/templates/3.0-templates/Textblock.edc
new file mode 100644 (file)
index 0000000..efd5d69
--- /dev/null
@@ -0,0 +1,126 @@
+collections {
+   base_scale: 1.0;
+   styles {
+      style { "basic_style";
+         base: "font="Sans" font_size=20 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0088AA64 valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { "wrap_none_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF0000 valign=0.5 wrap=none align=center";
+      }
+      style { "wrap_char_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF5E00 valign=0.5 wrap=char align=center";
+      }
+      style { "wrap_word_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FFBB00 valign=0.5 wrap=word align=center";
+      }
+      style { "wrap_mixed_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#1DDB16 valign=0.5 wrap=mixed align=center";
+      }
+      style { "ellipsis_1_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0054FF valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { "ellipsis_0_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#5F00FF valign=0.5 ellipsis=0.0 wrap=none align=center";
+      }
+   }
+   group { "main";
+      parts {
+         textblock { "text_block";
+            scale: 1;
+            desc { "default";
+               text {
+                  style: "basic_style";
+                  text: "Try resizing view!";
+                  min: 0 1;
+               }
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.1;
+            }
+         }
+      }
+      parts {
+         textblock { "text_wrap_none";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_block";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.25;
+               text {
+                  style: "wrap_none_style";
+                  text: "[wrap = none] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         textblock { "text_wrap_char";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_wrap_none";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.4;
+               text {
+                  style: "wrap_char_style";
+                  text: "[wrap = char] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         textblock { "text_wrap_word";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_wrap_char";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.55;
+               text {
+                  style: "wrap_word_style";
+                  text: "[wrap = word] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         textblock { "text_wrap_mixed";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_wrap_word";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.7;
+               text {
+                  style: "wrap_mixed_style";
+                  text: "[wrap = mixed] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         textblock { "text_ellipsis_1";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_wrap_mixed";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.85;
+               text {
+                  style: "ellipsis_1_style";
+                  text: "[ellipsis = 1] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         textblock { "text_ellipsis_0";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_ellipsis_1";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 1.0;
+               text {
+                  style: "ellipsis_0_style";
+                  text: "[ellipsis = 0] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/3.0-templates/Transition.edc b/data/templates/3.0-templates/Transition.edc
new file mode 100644 (file)
index 0000000..66b3a69
--- /dev/null
@@ -0,0 +1,34 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+         rect { "rect";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.25 0.25;
+               color: 255 255 0 255;
+            }
+            desc { "changed";
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+      programs {
+         program { "anim1";
+            signal: "load";
+            action: STATE_SET "changed";
+            target: "rect";
+            transition: ACCELERATE 1;
+            after: "anim2";
+         }
+         program { "anim2";
+            action: STATE_SET "default";
+            target: "rect";
+            transition: DECELERATE 2;
+            after: "anim1";
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Tween.edc b/data/templates/3.0-templates/Tween.edc
new file mode 100644 (file)
index 0000000..d6e5ccc
--- /dev/null
@@ -0,0 +1,50 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-01.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-02.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-03.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-04.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-05.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-06.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-07.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-08.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-09.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-10.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-11.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-12.png" COMP;
+      }
+      parts {
+         image { "image";
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_TRIAB-01.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-02.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-03.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-04.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-05.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-06.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-07.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-08.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-09.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-10.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-11.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-12.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+      programs {
+         program { "tween_anim";
+            signal: "load";
+            action: STATE_SET "default";
+            transition: LINEAR 1;
+            target: "image";
+            after: "tween_anim";
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Watchface.edc b/data/templates/3.0-templates/Watchface.edc
new file mode 100644 (file)
index 0000000..798c8e0
--- /dev/null
@@ -0,0 +1,249 @@
+collections {
+   base_scale: 1;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png" COMP;
+      }
+      parts {
+         image { "bg";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE.png";
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+               fixed: 1 1;
+            }
+         }
+         image { "moonphase_moon";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png";
+               rel1.to: "moonphase_cover";
+               rel2.to: "moonphase_cover";
+               fixed: 1 1;
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         image { "moonphase_cover";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png";
+               min: 130 130;
+               align: 0.5 1.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 1;
+               rel2.relative: 0.5 1;
+               fixed: 1 1;
+            }
+         }
+         image { "month_stroke";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.15 0.15;
+               rel2.relative: 0.85 0.85;
+               map.on: 1;
+            }
+            desc { "feb";
+               inherit: "default";
+               map.rotation.z: 20;
+            }
+            desc { "mar";
+               inherit: "default";
+               map.rotation.z: 40;
+            }
+            desc { "apr";
+               inherit: "default";
+               map.rotation.z: 60;
+            }
+            desc { "may";
+               inherit: "default";
+               map.rotation.z: 80;
+            }
+            desc { "jun";
+               inherit: "default";
+               map.rotation.z: 100;
+            }
+            desc { "jul";
+               inherit: "default";
+               map.rotation.z: 120;
+            }
+            desc { "aug";
+               inherit: "default";
+               map.rotation.z: 140;
+            }
+            desc { "sep";
+               inherit: "default";
+               map.rotation.z: 160;
+            }
+            desc { "oct";
+               inherit: "default";
+               map.rotation.z: 180;
+            }
+            desc { "nov";
+               inherit: "default";
+               map.rotation.z: 200;
+            }
+            desc { "dec";
+               inherit: "default";
+               map.rotation.z: 220;
+            }
+         }
+         text { "date";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 255;
+               fixed: 1 1;
+               text {
+                  size: 11;
+                  font: "Sans";
+                  text: "18";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               min: 30 30;
+               align: 0.5 1.0;
+               fixed: 1 1;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.922 0.545;
+               rel2.relative: 0.922 0.545;
+            }
+         }
+         image { "hour";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 35 0;
+               fixed: 1 0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         image { "minute";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 35 0;
+               fixed: 1 0;               
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         image { "second";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 25 0;
+               fixed: 1 0;                 
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+      }
+      programs {
+         program { "load";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "moonphase_moon";
+            transition: LINEAR 30;
+            after: "reset";
+         }
+         program { "reset";
+            action: STATE_SET "default";
+            target: "moonphase_moon";
+            after: "load";
+         }
+         program { "hour_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "hour";
+            transition: LINEAR 216000;
+            after: "hour_reset";
+         }
+         program { "hour_reset";
+            action: STATE_SET "default";
+            target: "hour";
+            after: "hour_begin";
+         }
+         program { "minute_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "minute";
+            transition: LINEAR 3600;
+            after: "minute_begin";
+         }
+         program { "minute_reset";
+            action: STATE_SET "default";
+            target: "minute";
+            after: "minute_begin";
+         }
+         program { "second_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "second";
+            transition: LINEAR 60;
+            after: "second_reset";
+         }
+         program { "second_reset";
+            action: STATE_SET "default";
+            target: "second";
+            after: "second_begin";
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/3.0-templates/Watchface2.edc b/data/templates/3.0-templates/Watchface2.edc
new file mode 100644 (file)
index 0000000..21521a2
--- /dev/null
@@ -0,0 +1,199 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png" COMP;
+      }
+      parts {
+         image { "bg";
+            scale: 1;
+            desc { "default";
+               visible: 1;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png";
+               //aspect: 1 1;
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+            }
+         }
+         text { "date";
+            scale: 1;
+            desc { "default";
+               color: 219 219 219 255;
+               fixed: 1 1;
+               text {
+                  size: 13;
+                  font: "Sans";
+                  text: "19";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               min: 30 30;
+               align: 0.5 1.0;
+               fixed: 1 1;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.795 0.545;
+               rel2.relative: 0.795 0.545;
+            }
+         }
+         text { "meridiem";
+            scale: 1;
+            desc { "default";
+               color: 255 120 0 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "AM";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.9 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         text { "time";
+            scale: 1;
+            desc { "default";
+               color: 250 250 250 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "12:00";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.5 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         image { "hour";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         image { "minute";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;               
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         image { "second";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;                 
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+      }
+      programs {
+         program { "load";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "bg";
+            transition: LINEAR 30;
+            after: "reset";
+         }
+         program { "reset";
+            action: STATE_SET "default";
+            target: "bg";
+            after: "load";
+         }
+         program { "hour_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "hour";
+            transition: LINEAR 216000;
+            after: "hour_reset";
+         }
+         program { "hour_reset";
+            action: STATE_SET "default";
+            target: "hour";
+            after: "hour_begin";
+         }
+         program { "minute_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "minute";
+            transition: LINEAR 3600;
+            after: "minute_begin";
+         }
+         program { "minute_reset";
+            action: STATE_SET "default";
+            target: "minute";
+            after: "minute_begin";
+         }
+         program { "second_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "second";
+            transition: LINEAR 60;
+            after: "second_reset";
+         }
+         program { "second_reset";
+            action: STATE_SET "default";
+            target: "second";
+            after: "second_begin";
+         }
+      }
+   }
+}
diff --git a/data/templates/Basic.edc b/data/templates/Basic.edc
new file mode 100644 (file)
index 0000000..482689d
--- /dev/null
@@ -0,0 +1,71 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         image { "logo";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         rect { "rect";
+            desc { "default";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+            desc { "clicked";
+               rel1.relative: 0.65 0.15;
+               rel2.relative: 0.85 0.35;
+               color: 170 136 0 255;
+            }
+         }
+         text { "text";
+            scale: 1;
+            effect: OUTLINE;
+            desc { "default";
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 0.5 1.0;
+               color: 0 150 221 255;
+               color2: 0 150 221 155;
+               text {
+                  size: 20;
+                  font: "Sans";
+                  text: "EDC Editor";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+         swallow { "content";
+            desc { "default";
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+      /*
+      programs {
+         program { "mouse_down";
+            signal: "mouse,down,1";
+            source: "rect";
+            action: STATE_SET "clicked";
+            target: "rect";
+         }
+         program { "mouse_up";
+            signal: "mouse,up,1";
+            source: "rect";
+            action: STATE_SET "default";
+            target: "rect";
+         }
+      }
+      */
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Clip.edc b/data/templates/Clip.edc
new file mode 100644 (file)
index 0000000..d467fe4
--- /dev/null
@@ -0,0 +1,29 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         rect { "clipper";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 1.0;
+               color: 0 136 170 255;
+            }
+         }
+         image { "logo";
+            clip_to: "clipper";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/CustomButton.edc b/data/templates/CustomButton.edc
new file mode 100644 (file)
index 0000000..8955c66
--- /dev/null
@@ -0,0 +1,449 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+#define ICON     1
+#define LABEL    2
+#define MASK     3
+#define DISABLE  4
+#define PRESSED  8
+#define BACKGROUND  16
+      script {
+         public btmode;
+         public eval_mode(m) {
+            new m1 = m & MASK;
+            new d = m & DISABLE;
+            new p = m & PRESSED;
+            new bg = m & BACKGROUND;
+            if (bg) {
+               set_state(PART:"base", "hidden", 0.0);
+               set_state(PART:"elm.swallow.background", "visible", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.background", "default", 0.0);
+               if (!d) {
+                  if (!p)
+                  {
+                     set_state(PART:"base", "default", 0.0);
+                     set_state(PART:"base", "default", 0.0);
+                  }
+                  else {
+                     set_state(PART:"base", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"base", "disabled", 0.0);
+               }
+            }
+            if (m1 == (ICON | LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p) {
+                     set_state(PART:"elm.text", "visible", 0.0);
+                     set_state(PART:"icon_clip", "default", 0.0);
+                  } else {
+                     set_state(PART:"elm.text", "pressed_visible", 0.0);
+                     set_state(PART:"icon_clip", "pressed", 0.0);
+                  }
+               } else {
+                  set_state(PART:"elm.swallow.content", "visible", 0.0);
+                  set_state(PART:"sizer.content", "visible", 0.0);
+                  set_state(PART:"elm.text", "disabled_visible", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (ICON)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  else
+                  set_state(PART:"icon_clip", "pressed", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "icononly", 0.0);
+                  set_state(PART:"sizer.content", "icononly", 0.0);
+                  set_state(PART:"elm.text", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else if (m1 == (LABEL)) {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+                  if (!p)
+                  set_state(PART:"elm.text", "textonly", 0.0);
+                  else
+                  set_state(PART:"elm.text", "pressed_textonly", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"elm.text", "disabled_textonly", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            } else {
+               if (!d) {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "default", 0.0);
+                  set_state(PART:"event", "default", 0.0);
+               } else {
+                  set_state(PART:"elm.swallow.content", "default", 0.0);
+                  set_state(PART:"sizer.content", "default", 0.0);
+                  set_state(PART:"icon_clip", "disabled", 0.0);
+                  set_state(PART:"event", "disabled", 0.0);
+               }
+            }
+         }
+      }
+      parts {
+         image { "base";
+            nomouse;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               image.middle: SOLID;
+               rel1.offset: -1 0;
+               rel2.offset: 0 1;
+               fill.smooth: 0;
+               color_class: "button_bg";
+            }
+            desc { "hovered";
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            desc { "pressed";
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+               color_class: "button_bg_pressed";
+            }
+            desc { "disabled";
+               inherit: "default";
+               color_class: "button_bg_disabled";
+            }
+            desc { "hidden";
+               inherit: "default";
+               visible: 0;
+            }
+         }
+         swallow { "elm.swallow.background";
+            nomouse;
+            desc { "default";
+               rel1.to: "base";
+               rel2.to: "base";
+               visible: 0;
+            }
+            desc { "visible";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         rect { "icon_clip";
+            desc { "default";
+               color_class: "button_icon";
+            }
+            desc { "pressed";
+               inherit: "default";
+               color_class: "button_icon_pressed";
+            }
+            desc { "disabled";
+               inherit: "default";
+               color_class: "button_icon_disabled";
+            }
+         }
+         swallow { "elm.swallow.content";
+            nomouse;
+            clip_to: "icon_clip";
+            desc { "default";
+               fixed: 1 0;
+               align: 0.0 0.5;
+               rel1.offset: 6 5;
+               rel1.to: "base";
+               rel2.relative: 0.0 1.0;
+               rel2.offset: 6 -8;
+               rel2.to: "base";
+               visible: 0;
+            }
+            desc { "visible";
+               inherit: "default";
+               fixed: 1 0;
+               aspect: 1.0 1.0;
+               visible: 1;
+            }
+            desc { "icononly";
+               inherit: "default";
+               fixed: 0 0;
+               align: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               rel2.offset: -7 -8;
+               visible: 1;
+            }
+         }
+         text { "sizer.content";
+            nomouse;
+            scale: 1;
+            desc { "default";
+               visible: 0;
+               text {
+                  font: FN;
+                  size: 10;
+                  min: 0 0;
+                  text_class: "button_text";
+               }
+            }
+            desc { "visible";
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+            desc { "icononly";
+               inherit: "default";
+               rel1.to: "elm.swallow.content";
+               rel2.to: "elm.swallow.content";
+               text {
+                  min: 1 1;
+                  ellipsis: -1;
+                  text: "M";
+               }
+            }
+         }
+         text { "elm.text";
+            nomouse;
+            effect: SHADOW BOTTOM;
+            scale: 1;
+            desc { "default";
+               rel1.offset: 0 5;
+               rel1.relative: 1.0 0.0;
+               rel1.to_x: "elm.swallow.content";
+               rel1.to_y: "base";
+               rel2.offset: -8 -8;
+               rel2.to: "base";
+               color_class: "button_text";
+               color3: 255 255 255 255;
+               text {
+                  font: FN;
+                  size: 10;
+                  align: 0.5 0.5;
+                  min: 0 0;
+                  text_class: "button";
+               }
+               visible: 0;
+               fixed: 1 1;
+            }
+            desc { "visible";
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            desc { "pressed_visible";
+               inherit: "default";
+               rel1.offset: 2 5;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            desc { "textonly";
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            desc { "pressed_textonly";
+               inherit: "default";
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+               color_class: "button_text_pressed";
+            }
+            desc { "disabled_visible";
+               inherit: "default";
+               rel1.offset: 2 5;
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+            desc { "disabled_textonly";
+               inherit: "default";
+               color_class: "button_text_disabled";
+               color3: 255 255 255 255;
+               text.min: 1 1;
+               text.ellipsis: -1;
+               visible: 1;
+               fixed: 0 0;
+            }
+         }
+         rect { "event";
+            desc { "default";
+               color: 0 0 0 0;
+            }
+            desc { "disabled";
+               inherit: "default";
+               visible: 0;
+            }
+         }
+      }
+      programs {
+         program {
+            signal: "mouse,down,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,press" "elm";
+            after: "button_click_anim";
+         }
+         program { "button_click_anim";
+            script {
+               new m = get_int(btmode);
+               m |= PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_unclick";
+            signal: "mouse,up,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,unpress" "elm";
+            after: "button_unclick_anim";
+         }
+         program { "button_unclick_anim";
+            script {
+               new m = get_int(btmode);
+               m &= ~PRESSED; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_hover";
+            signal: "mouse,in";
+            source: "event";
+            action: STATE_SET "hovered";
+            target: "base";
+         }
+         program { "button_unhover";
+            signal: "mouse,out";
+            source: "event";
+            action: STATE_SET "default";
+            target: "base";
+         }
+         program { "buttonactivate";
+            signal: "elm,anim,activate";
+            source: "elm";
+            action: STATE_SET "pressed" 0.0;
+            target: "base";
+            after: "button_unpressed_anim";
+         }
+         program { "button_unpressed_anim";
+            action: STATE_SET "default" 0.0;
+            in: 0.5 0.0;
+            target: "base";
+         }
+         program {
+            signal: "mouse,clicked,1";
+            source: "event";
+            action: SIGNAL_EMIT "elm,action,click" "elm";
+         }
+         program { "button_text_visible";
+            signal: "elm,state,text,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_text_hidden";
+            signal: "elm,state,text,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~LABEL; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_icon_visible";
+            signal: "elm,state,icon,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_icon_hidden";
+            signal: "elm,state,icon,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~ICON; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_background_visible";
+            signal: "elm,state,background,visible";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_background_hidden";
+            signal: "elm,state,background,hidden";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~BACKGROUND; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_state_disabled";
+            signal: "elm,state,disabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m |= DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+         program { "button_state_enabled";
+            signal: "elm,state,enabled";
+            source: "elm";
+            script {
+               new m = get_int(btmode);
+               m &= ~DISABLE; set_int(btmode, m);
+               eval_mode(m);
+            }
+         }
+      }
+#undef ICON
+#undef LABEL
+#undef MASK
+#undef DISABLE
+#undef PRESSED
+#undef BACKGROUND
+   }
+}
diff --git a/data/templates/Empty.edc b/data/templates/Empty.edc
new file mode 100644 (file)
index 0000000..e94245a
--- /dev/null
@@ -0,0 +1,7 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Group.edc b/data/templates/Group.edc
new file mode 100644 (file)
index 0000000..b3c8e0b
--- /dev/null
@@ -0,0 +1,38 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+         rect { "rect";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+            }
+         }
+         group { "group";
+            source: "my_group";
+            desc { "default";
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+   }
+   group { "my_group";
+      parts {
+         text { "text";
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            desc { "default";
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 30;
+                  font: "Sans";
+                  text: "My Group";
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Image.edc b/data/templates/Image.edc
new file mode 100644 (file)
index 0000000..d8a9da8
--- /dev/null
@@ -0,0 +1,21 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         image { "logo";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Listitem.edc b/data/templates/Listitem.edc
new file mode 100644 (file)
index 0000000..0dcb9fa
--- /dev/null
@@ -0,0 +1,271 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png" COMP;
+      }
+      parts {
+         rect { "bg";
+            scale: 1;
+            desc { "default";
+               color: 233 242 242 255;
+               align: 0.5 0.5;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               min: 300 60;
+               max: 99999 60;
+               fixed: 1 1;
+            }
+         }
+         rect { "point_rect";
+            scale: 1;
+            desc { "default";
+               color: 0 176 137 255;
+               align: 0.0 0.0;
+               rel1.to: "bg";
+               rel1.relative: 0.0 0.0;
+               rel2.to: "bg";
+               min: 5 0;
+               max: 5 99999;
+               fixed: 1 0;
+            }
+         }
+         spacer { "padding_left";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.5;
+               rel1.to: "point_rect";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "point_rect";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         image { "icon_status";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_ARROW.png";
+               align: 0.0 0.5;
+               rel1.to: "padding_left";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_left";
+               rel2.relative: 0.0 0.5;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         swallow { "icon_user";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.5;
+               rel1.to: "icon_status";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_status";
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+         text { "user_name";
+            scale: 1;
+            desc { "default";
+               color: 130 130 130 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Lisa";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to: "icon_user";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_user";
+               min: 100 0;
+               fixed: 1 0;
+            }
+         }
+         text { "message";
+            scale: 1;
+            desc { "default";
+               color: 145 145 145 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "How are you? I'm fine, thank you, and you?";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.0 0.5;
+               rel1.to_x: "padding_left";
+               rel1.to_y: "padding_icon";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "padding_icon";
+               rel2.relative: 0.0 1.0;
+               min: 200 0;
+               fixed: 1 0;
+            }
+         }
+         spacer { "padding_right";
+            scale: 1;
+            desc { "default";
+               align: 1.0 0.5;
+               rel1.to: "bg";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "bg";
+               min: 15 0;
+               fixed: 1 0;
+            }
+         }
+         text { "date";
+            scale: 1;
+            desc { "default";
+               color: 135 135 135 255;
+               text {
+                  size: 10;
+                  font: "Sans";
+                  text: "21 Mar.";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.1;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.5;
+               min: 40 20;
+               max: 40 20;
+               fixed: 1 1;
+            }
+         }
+         image { "icon_clip";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP.png";
+               align: 1.0 0.5;
+               rel1.to: "date";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "date";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_CLIP_DOWN.png";
+            }
+         }
+         image { "icon_badge";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_clip";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_clip";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_BADGE_DOWN.png";
+            }
+         }
+         image { "icon_lock";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK.png";
+               align: 1.0 0.5;
+               rel1.to: "icon_badge";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_badge";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_LOCK_DOWN.png";
+            }
+         }
+         swallow { "icon_check";
+            scale: 1;
+            desc { "default";
+               align: 1.0 0.5;
+               rel1.to: "padding_right";
+               rel1.relative: 1.0 0.5;
+               rel2.to: "padding_right";
+               rel2.relative: 0.0 0.9;
+               min: 20 20;
+               max: 20 20;
+               fixed: 1 1;
+            }
+         }
+         spacer { "padding_icon";
+            scale: 1;
+            desc { "default";
+               align: 1.0 0.5;
+               rel1.to: "icon_check";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "icon_check";
+               rel2.relative: 0.0 1.0;
+               min: 20 0;
+               fixed: 1 0;
+            }
+         }
+      }
+      programs {
+         program { "mouse_down_lock";
+            signal: "mouse,down,1";
+            source: "icon_lock";
+            action: STATE_SET "clicked";
+            target: "icon_lock";
+         }
+         program { "mouse_up_lock";
+            signal: "mouse,up,1";
+            source: "icon_lock";
+            action: STATE_SET "default";
+            target: "icon_lock";
+         }
+         program { "mouse_down_badge";
+            signal: "mouse,down,1";
+            source: "icon_badge";
+            action: STATE_SET "clicked";
+            target: "icon_badge";
+         }
+         program { "mouse_up_badge";
+            signal: "mouse,up,1";
+            source: "icon_badge";
+            action: STATE_SET "default";
+            target: "icon_badge";
+         }
+         program { "mouse_down_clip";
+            signal: "mouse,down,1";
+            source: "icon_clip";
+            action: STATE_SET "clicked";
+            target: "icon_clip";
+         }
+         program { "mouse_up_clip";
+            signal: "mouse,up,1";
+            source: "icon_clip";
+            action: STATE_SET "default";
+            target: "icon_clip";
+         }
+      }
+   }
+}
diff --git a/data/templates/Makefile.am b/data/templates/Makefile.am
new file mode 100644 (file)
index 0000000..f3bd083
--- /dev/null
@@ -0,0 +1,112 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = 2.3-templates 2.3.1-templates 2.3.2-templates 2.4-templates 3.0-templates
+
+EDJE_CC = @edje_cc@
+EDJE_FLAGS = -id $(top_srcdir)/data/images -sd $(top_srcdir)/data/sounds
+
+filesdir = $(datadir)/$(PACKAGE)/templates
+files_DATA = Basic.edc \
+             Basic.edj \
+             CustomButton.edc \
+             CustomButton.edj \
+             Clip.edc \
+             Clip.edj \
+             Empty.edc \
+             Empty.edj \
+             Group.edc \
+             Group.edj \
+             Image.edc \
+             Image.edj \
+             Listitem.edc \
+             Listitem.edj \
+             Map.edc \
+             Map.edj \
+             MobileLayout.edc \
+             MobileLayout.edj \
+             MouseEvent.edc \
+             MouseEvent.edj \
+             Proxy.edc \
+             Proxy.edj \
+             Rect.edc \
+             Rect.edj \
+             Spacer.edc \
+             Spacer.edj \
+             Text.edc \
+             Text.edj \
+             Textblock.edc \
+             Textblock.edj \
+             Transition.edc \
+             Transition.edj \
+             Tween.edc \
+             Tween.edj \
+             Watchface.edc \
+             Watchface.edj \
+             Watchface2.edc \
+             Watchface2.edj
+
+EXTRA_DIST = $(files_DATA)
+
+srcdir = $(top_srcdir)/data/templates
+builddir = $(top_builddir)/data/templates
+
+Basic.edj: Makefile Basic.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Basic.edc $(builddir)/Basic.edj
+
+CustomButton.edj: Makefile CustomButton.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/CustomButton.edc $(builddir)/CustomButton.edj
+
+Empty.edj: Makefile Empty.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Empty.edc $(builddir)/Empty.edj
+
+Map.edj: Makefile Map.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Map.edc $(builddir)/Map.edj
+
+MobileLayout.edj: Makefile MobileLayout.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MobileLayout.edc $(builddir)/MobileLayout.edj
+
+MouseEvent.edj: Makefile MouseEvent.edc
+               $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/MouseEvent.edc $(builddir)/MouseEvent.edj
+
+Textblock.edj: Makefile Textblock.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Textblock.edc $(builddir)/Textblock.edj
+
+Transition.edj: Makefile Transition.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Transition.edc $(builddir)/Transition.edj
+
+Tween.edj: Makefile Tween.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Tween.edc $(builddir)/Tween.edj
+
+Rect.edj: Makefile Rect.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Rect.edc $(builddir)/Rect.edj
+
+Group.edj: Makefile Group.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Group.edc $(builddir)/Group.edj
+
+Listitem.edj: Makefile Listitem.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Listitem.edc $(builddir)/Listitem.edj
+
+Image.edj: Makefile Image.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Image.edc $(builddir)/Image.edj
+
+Text.edj: Makefile Text.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Text.edc $(builddir)/Text.edj
+
+Proxy.edj: Makefile Proxy.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Proxy.edc $(builddir)/Proxy.edj
+
+Clip.edj: Makefile Clip.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Clip.edc $(builddir)/Clip.edj
+
+Spacer.edj: Makefile Spacer.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Spacer.edc $(builddir)/Spacer.edj
+
+Watchface.edj: Makefile Watchface.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface.edc $(builddir)/Watchface.edj
+
+Watchface2.edj: Makefile Watchface2.edc
+       $(EDJE_CC) $(EDJE_FLAGS) $(srcdir)/Watchface2.edc $(builddir)/Watchface2.edj
+
+clean-local:
+       rm -f *.edj
+       rm -f $(datadir)/$(PACKAGE)/templates/*edj
diff --git a/data/templates/Map.edc b/data/templates/Map.edc
new file mode 100644 (file)
index 0000000..630706b
--- /dev/null
@@ -0,0 +1,74 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         image { "logo";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+               map.on: 1;
+               map.color[2]: 0 0 0 0;
+               map.color[3]: 0 0 0 0;
+            }
+         }
+         rect { "perps_point";
+            desc { "default";
+               rel1.relative: 0.6 0.1;
+               rel2.relative: 0.9 0.4;
+               visible: 0;
+            }
+         }
+         rect { "rect";
+            desc { "default";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 1.0 0.5;
+               color: 0 136 170 255;
+               map {
+                  on: 1;
+                  rotation.y: 45;
+                  perspective_on: 1;
+                  perspective: "perps_point";
+                  backface_cull: 1;
+               }
+            }
+         }
+         text { "text";
+            scale: 1;
+            effect: OUTLINE;
+            desc { "default";
+               rel1.relative: 0.0 0.5;
+               rel2.relative: 0.5 1.0;
+               color: 0 150 221 255;
+               color2: 0 150 221 155;
+               text {
+                  size: 20;
+                  font: "Sans";
+                  text: "EDC Editor";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+         rect { "rect2";
+            desc { "default";
+               rel1.relative: 0.55 0.55;
+               rel2.relative: 0.95 0.95;
+               map {
+                  on: 1;
+                  color[0]: 255 0 0 255;
+                  color[1]: 0 255 0 255;
+                  color[2]: 0 0 255 255;
+                  color[3]: 255 255 255 255;
+               }
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/MobileLayout.edc b/data/templates/MobileLayout.edc
new file mode 100644 (file)
index 0000000..ecb74e6
--- /dev/null
@@ -0,0 +1,480 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png" COMP;
+      }
+      parts {
+         rect { "base";
+            scale: 1;
+            desc { "default";
+               min: 200 300;
+            }
+         }
+         /* Header */
+         rect { "header";
+            scale: 1;
+            desc { "default";
+               color: 200 0 0 255;
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel2.to: "base";
+               rel2.relative: 1.0 0.1;
+               min: 0 40;
+               max: 9999 40;
+               fixed: 0 1;
+            }
+         }
+         spacer { "header_padding";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.5;
+               rel1.to: "header";
+               rel2.to: "header";
+               max: 10 20;
+               fixed: 1 1;
+            }
+         }
+         image { "header_button_panel_open";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+            }
+            desc { "clicked";
+               inherit: "default";
+               color: 125 125 125 255;
+            }
+         }
+         image { "header_button_panel_close";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_ICON_DOCK_DOWN.png";
+               //aspect: 1 1;
+               align: 0.0 0.5;
+               rel1.to: "header_padding";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "header_padding";
+               min: 20 20;
+               fixed: 1 1;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         text { "header_title";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "TITLE";
+                  min: 0 0;
+               }
+               rel1.to: "header";
+               rel2.to: "header";
+            }
+         }
+         /* Content */
+         spacer { "content_padding_top";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "header";
+               min: 0 5;
+               fixed: 0 1;
+            }
+         }
+         rect { "content_main";
+            scale: 1;
+            desc { "default";
+               color: 30 46 93 255;
+               align: 0.5 0.0;
+               rel1.to: "content_padding_top";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 5 0;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         text { "content_main_text";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add main content";
+                  min: 0 0;
+               }
+               rel1.to: "content_main";
+               rel2.to: "content_main";
+            }
+         }
+         spacer { "content_padding_middle";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.0;
+               rel1.to: "base";
+               rel1.relative: 0.0 0.5;
+               rel2.to: "base";
+               max: 0 5;
+            }
+         }
+         rect { "content_sub_1";
+            scale: 1;
+            desc { "default";
+               color: 0 136 170 255;
+               align: 0.0 0.0;
+               rel1.to: "content_padding_middle";
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 0.5 0.85;
+               rel2.offset: 0 0;
+            }
+         }
+         text { "content_sub_1_text";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 1";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_1";
+               rel2.to: "content_sub_1";
+            }
+         }
+         rect { "content_sub_2";
+            scale: 1;
+            desc { "default";
+               color: 66 118 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.0;
+               rel1.offset: 5 0;
+               rel2.to_x: "base";
+               rel2.to_y: "content_sub_1";
+               rel2.relative: 1.0 0.5;
+               rel2.offset: -5 0;
+            }
+         }
+         text { "content_sub_2_text";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 2";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_2";
+               rel2.to: "content_sub_2";
+            }
+         }
+         rect { "content_sub_3";
+            scale: 1;
+            desc { "default";
+               color: 83 66 189 255;
+               align: 0.0 0.5;
+               rel1.to: "content_sub_1";
+               rel1.relative: 1.0 0.5;
+               rel1.offset: 5 5;
+               rel2.to: "base";
+               rel2.relative: 1.0 0.85;
+               rel2.offset: -5 0;
+            }
+         }
+         text { "content_sub_3_text";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "sub 3";
+                  min: 0 0;
+               }
+               rel1.to: "content_sub_3";
+               rel2.to: "content_sub_3";
+            }
+         }
+         rect { "content_bottom";
+            scale: 1;
+            desc { "default";
+               color: 95 95 95 255;
+               rel1.to: "content_sub_1";
+               rel1.relative: 0.0 1.0;
+               rel1.offset: 0 5;
+               rel2.to: "base";
+               rel2.offset: -5 -5;
+            }
+         }
+         text { "content_bottom_text";
+            scale: 1;
+            desc { "default";
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "add bottom content";
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "content_bottom";
+               rel2.to: "content_bottom";
+            }
+         }
+         /* Mask */
+         rect { "mask";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 155;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         /* Panel */
+         rect { "panel_base";
+            scale: 1;
+            desc { "default";
+               align: 0.0 0.0;
+               rel1.to: "header";
+               rel1.relative: 0.0 1.0;
+               rel2.to: "base";
+               rel2.relative: 0.7 1.0;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         rect { "panel_content_1";
+            scale: 1;
+            desc { "default";
+               color: 255 94 0 255;
+               rel1.to: "panel_base";
+               rel1.offset: 0 1;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.15;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         text { "panel_content_1_text";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Add";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               align: 0.5 0.5;
+               rel1.to: "panel_content_1";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_1";
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         rect { "panel_content_2";
+            scale: 1;
+            desc { "default";
+               color: 255 130 36 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.15;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.30;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         text { "panel_content_2_text";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Your";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_2";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_2";
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         rect { "panel_content_3";
+            scale: 1;
+            desc { "default";
+               color: 255 166 72 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.30;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.45;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         text { "panel_content_3_text";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "Content";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_3";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_3";
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         rect { "panel_content_4";
+            scale: 1;
+            desc { "default";
+               color: 255 202 108 255;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.45;
+               rel1.offset: 0 2;
+               rel2.to: "panel_base";
+               rel2.relative: 1.0 0.60;
+               rel2.offset: -2 0;
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         text { "panel_content_4_text";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 255;
+               text {
+                  size: 14;
+                  font: "Sans";
+                  text: "in Swallow";
+                  align: 0.0 0.5;
+                  min: 0 0;
+               }
+               rel1.to: "panel_content_4";
+               rel1.relative: 0.1 0.0;
+               rel2.to: "panel_content_4";
+               visible: 0;
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+         swallow { "panel_swallow";
+            scale: 1;
+            desc { "default";
+               visible: 0;
+               rel1.to: "panel_base";
+               rel1.relative: 0.0 0.6;
+               rel1.offset: 5 5;
+               rel2.to: "panel_base";
+               rel2.offset: -5 -5;
+
+            }
+            desc { "clicked";
+               inherit: "default";
+               visible: 1;
+            }
+         }
+      }
+      programs {
+         program { "panel_open";
+            signal: "mouse,down,1";
+            source: "header_button_panel_open";
+            action: STATE_SET "clicked";
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+         program { "panel_close";
+            signal: "mouse,down,1";
+            source: "header_button_panel_close";
+            action: STATE_SET "default";
+            target: "header_button_panel_open";
+            target: "header_button_panel_close";
+            target: "mask";
+            target: "panel_base";
+            target: "panel_content_1";
+            target: "panel_content_1_text";
+            target: "panel_content_2";
+            target: "panel_content_2_text";
+            target: "panel_content_3";
+            target: "panel_content_3_text";
+            target: "panel_content_4";
+            target: "panel_content_4_text";
+            target: "panel_swallow";
+         }
+      }
+   }
+}
diff --git a/data/templates/MouseEvent.edc b/data/templates/MouseEvent.edc
new file mode 100644 (file)
index 0000000..e2cb8f5
--- /dev/null
@@ -0,0 +1,81 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png" COMP;
+      }
+      parts {
+         rect { "button_shadow";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 155;
+               rel1.to: "button_bg";
+               rel1.offset: 5 5;
+               rel2.to: "button_bg";
+               rel2.offset: 4 4;
+            }
+         }
+         image { "button_bg";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG.png";
+               image.border: 3 3 3 3;
+               min: 50 20;
+               max: 200 50;
+            }
+            desc { "hovered";
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_HOVER.png";
+            }
+            desc { "clicked";
+               inherit: "default";
+               image.normal: "EDC_EDITOR_EMBEDDED_BUTTON_BG_DOWN.png";
+            }
+         }
+         text { "button_text";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               color: 70 70 70 255;
+               text {
+                  size: 15;
+                  font: "Sans";
+                  text: "Mouse Event Example";
+               }
+               rel1.to: "button_bg";
+               rel2.to: "button_bg";
+            }
+         }
+      }
+      programs {
+         program { "mouse_down";
+            signal: "mouse,down,1";
+            source: "button_bg";
+            action: STATE_SET "clicked";
+            target: "button_bg";
+         }
+         program { "mouse_up";
+            signal: "mouse,up,1";
+            source: "button_bg";
+            action: STATE_SET "hovered";
+            target: "button_bg";
+         }
+         program { "mouse_in";
+            signal: "mouse,in";
+            source: "button_bg";
+            action: STATE_SET "hovered";
+            target: "button_bg";
+         }
+         program { "mouse_out";
+            signal: "mouse,out";
+            source: "button_bg";
+            action: STATE_SET "default";
+            target: "button_bg";
+         }
+      }
+   }
+}
diff --git a/data/templates/Proxy.edc b/data/templates/Proxy.edc
new file mode 100644 (file)
index 0000000..f5e3225
--- /dev/null
@@ -0,0 +1,30 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_IMAGE.png" COMP;
+      }
+      parts {
+         image { "logo";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.5 0.5;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_IMAGE.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+         proxy { "proxy";
+            desc { "default";
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               aspect: 1 1;
+               aspect_preference: BOTH;
+               source: "logo";
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Rect.edc b/data/templates/Rect.edc
new file mode 100644 (file)
index 0000000..f6b162f
--- /dev/null
@@ -0,0 +1,14 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+         rect { "rect";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Spacer.edc b/data/templates/Spacer.edc
new file mode 100644 (file)
index 0000000..e2a6366
--- /dev/null
@@ -0,0 +1,36 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+         spacer { "spacer1";
+            scale: 1;
+            desc { "default";
+               min: 50 50;
+               fixed: 1 1;
+               align: 0 0;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.0 0.0;
+            }
+         }
+         spacer { "spacer2";
+            scale: 1;
+            desc { "default";
+               min: 50 50;
+               fixed: 1 1;
+               align: 1 1;
+               rel1.relative: 1.0 1.0;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+         rect { "rect";
+            desc { "default";
+               rel1.to: "spacer1";
+               rel1.relative: 1.0 1.0;
+               rel2.to: "spacer2";
+               rel2.relative: 0.0 0.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Text.edc b/data/templates/Text.edc
new file mode 100644 (file)
index 0000000..4b7c917
--- /dev/null
@@ -0,0 +1,23 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+         text { "text";
+            scale: 1;
+            effect: SOFT_OUTLINE;
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+               color: 255 255 255 255;
+               color2: 0 136 170 100;
+               text {
+                  size: 50;
+                  font: "Sans";
+                  text: "TEXT";
+                  align: 0.5 0.5;
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Textblock.edc b/data/templates/Textblock.edc
new file mode 100644 (file)
index 0000000..efd5d69
--- /dev/null
@@ -0,0 +1,126 @@
+collections {
+   base_scale: 1.0;
+   styles {
+      style { "basic_style";
+         base: "font="Sans" font_size=20 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0088AA64 valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { "wrap_none_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF0000 valign=0.5 wrap=none align=center";
+      }
+      style { "wrap_char_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FF5E00 valign=0.5 wrap=char align=center";
+      }
+      style { "wrap_word_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#FFBB00 valign=0.5 wrap=word align=center";
+      }
+      style { "wrap_mixed_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=outline outline_color=#1DDB16 valign=0.5 wrap=mixed align=center";
+      }
+      style { "ellipsis_1_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0054FF valign=0.5 ellipsis=1.0 wrap=none align=center";
+      }
+      style { "ellipsis_0_style";
+         base: "font="Sans" font_size=15 text_class=entry color=#FFFFFF style=soft_outline outline_color=#5F00FF valign=0.5 ellipsis=0.0 wrap=none align=center";
+      }
+   }
+   group { "main";
+      parts {
+         textblock { "text_block";
+            scale: 1;
+            desc { "default";
+               text {
+                  style: "basic_style";
+                  text: "Try resizing view!";
+                  min: 0 1;
+               }
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.1;
+            }
+         }
+      }
+      parts {
+         textblock { "text_wrap_none";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_block";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.25;
+               text {
+                  style: "wrap_none_style";
+                  text: "[wrap = none] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         textblock { "text_wrap_char";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_wrap_none";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.4;
+               text {
+                  style: "wrap_char_style";
+                  text: "[wrap = char] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         textblock { "text_wrap_word";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_wrap_char";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.55;
+               text {
+                  style: "wrap_word_style";
+                  text: "[wrap = word] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         textblock { "text_wrap_mixed";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_wrap_word";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.7;
+               text {
+                  style: "wrap_mixed_style";
+                  text: "[wrap = mixed] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         textblock { "text_ellipsis_1";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_wrap_mixed";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 0.85;
+               text {
+                  style: "ellipsis_1_style";
+                  text: "[ellipsis = 1] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+      parts {
+         textblock { "text_ellipsis_0";
+            scale: 1;
+            desc { "default";
+               rel1.to: "text_ellipsis_1";
+               rel1.relative: 0.0 1.0;
+               rel2.relative: 1.0 1.0;
+               text {
+                  style: "ellipsis_0_style";
+                  text: "[ellipsis = 0] https://www.enlightenment.org/";
+               }
+            }
+         }
+      }
+   }
+}
diff --git a/data/templates/Transition.edc b/data/templates/Transition.edc
new file mode 100644 (file)
index 0000000..66b3a69
--- /dev/null
@@ -0,0 +1,34 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      parts {
+         rect { "rect";
+            desc { "default";
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.25 0.25;
+               color: 255 255 0 255;
+            }
+            desc { "changed";
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 1.0 1.0;
+               color: 0 136 170 255;
+            }
+         }
+      }
+      programs {
+         program { "anim1";
+            signal: "load";
+            action: STATE_SET "changed";
+            target: "rect";
+            transition: ACCELERATE 1;
+            after: "anim2";
+         }
+         program { "anim2";
+            action: STATE_SET "default";
+            target: "rect";
+            transition: DECELERATE 2;
+            after: "anim1";
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Tween.edc b/data/templates/Tween.edc
new file mode 100644 (file)
index 0000000..d6e5ccc
--- /dev/null
@@ -0,0 +1,50 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-01.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-02.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-03.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-04.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-05.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-06.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-07.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-08.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-09.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-10.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-11.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_TRIAB-12.png" COMP;
+      }
+      parts {
+         image { "image";
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_TRIAB-01.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-02.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-03.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-04.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-05.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-06.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-07.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-08.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-09.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-10.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-11.png";
+               image.tween: "EDC_EDITOR_EMBEDDED_TRIAB-12.png";
+               aspect: 1 1;
+               aspect_preference: BOTH;
+            }
+         }
+      }
+      programs {
+         program { "tween_anim";
+            signal: "load";
+            action: STATE_SET "default";
+            transition: LINEAR 1;
+            target: "image";
+            after: "tween_anim";
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Watchface.edc b/data/templates/Watchface.edc
new file mode 100644 (file)
index 0000000..798c8e0
--- /dev/null
@@ -0,0 +1,249 @@
+collections {
+   base_scale: 1;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png" COMP;
+      }
+      parts {
+         image { "bg";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE.png";
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+               fixed: 1 1;
+            }
+         }
+         image { "moonphase_moon";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_MOON.png";
+               rel1.to: "moonphase_cover";
+               rel2.to: "moonphase_cover";
+               fixed: 1 1;
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         image { "moonphase_cover";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MOONPHASE_COVER.png";
+               min: 130 130;
+               align: 0.5 1.0;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 1;
+               rel2.relative: 0.5 1;
+               fixed: 1 1;
+            }
+         }
+         image { "month_stroke";
+            scale: 1;
+            desc { "default";
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_MONTH_STROKE.png";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.15 0.15;
+               rel2.relative: 0.85 0.85;
+               map.on: 1;
+            }
+            desc { "feb";
+               inherit: "default";
+               map.rotation.z: 20;
+            }
+            desc { "mar";
+               inherit: "default";
+               map.rotation.z: 40;
+            }
+            desc { "apr";
+               inherit: "default";
+               map.rotation.z: 60;
+            }
+            desc { "may";
+               inherit: "default";
+               map.rotation.z: 80;
+            }
+            desc { "jun";
+               inherit: "default";
+               map.rotation.z: 100;
+            }
+            desc { "jul";
+               inherit: "default";
+               map.rotation.z: 120;
+            }
+            desc { "aug";
+               inherit: "default";
+               map.rotation.z: 140;
+            }
+            desc { "sep";
+               inherit: "default";
+               map.rotation.z: 160;
+            }
+            desc { "oct";
+               inherit: "default";
+               map.rotation.z: 180;
+            }
+            desc { "nov";
+               inherit: "default";
+               map.rotation.z: 200;
+            }
+            desc { "dec";
+               inherit: "default";
+               map.rotation.z: 220;
+            }
+         }
+         text { "date";
+            scale: 1;
+            desc { "default";
+               color: 0 0 0 255;
+               fixed: 1 1;
+               text {
+                  size: 11;
+                  font: "Sans";
+                  text: "18";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               min: 30 30;
+               align: 0.5 1.0;
+               fixed: 1 1;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.922 0.545;
+               rel2.relative: 0.922 0.545;
+            }
+         }
+         image { "hour";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 35 0;
+               fixed: 1 0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         image { "minute";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 35 0;
+               fixed: 1 0;               
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         image { "second";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 25 0;
+               fixed: 1 0;                 
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+      }
+      programs {
+         program { "load";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "moonphase_moon";
+            transition: LINEAR 30;
+            after: "reset";
+         }
+         program { "reset";
+            action: STATE_SET "default";
+            target: "moonphase_moon";
+            after: "load";
+         }
+         program { "hour_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "hour";
+            transition: LINEAR 216000;
+            after: "hour_reset";
+         }
+         program { "hour_reset";
+            action: STATE_SET "default";
+            target: "hour";
+            after: "hour_begin";
+         }
+         program { "minute_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "minute";
+            transition: LINEAR 3600;
+            after: "minute_begin";
+         }
+         program { "minute_reset";
+            action: STATE_SET "default";
+            target: "minute";
+            after: "minute_begin";
+         }
+         program { "second_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "second";
+            transition: LINEAR 60;
+            after: "second_reset";
+         }
+         program { "second_reset";
+            action: STATE_SET "default";
+            target: "second";
+            after: "second_begin";
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/data/templates/Watchface2.edc b/data/templates/Watchface2.edc
new file mode 100644 (file)
index 0000000..21521a2
--- /dev/null
@@ -0,0 +1,199 @@
+collections {
+   base_scale: 1.0;
+   group { "main";
+      /* TODO: Please replace embedded image files to your application image files. */
+      images {
+         image: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png" COMP;
+         image: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png" COMP;
+      }
+      parts {
+         image { "bg";
+            scale: 1;
+            desc { "default";
+               visible: 1;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_WATCHFACE_RECT.png";
+               //aspect: 1 1;
+               min: 300 300;
+               rel1.relative: 0.5 0.5;
+               rel2.relative: 0.5 0.5;
+            }
+         }
+         text { "date";
+            scale: 1;
+            desc { "default";
+               color: 219 219 219 255;
+               fixed: 1 1;
+               text {
+                  size: 13;
+                  font: "Sans";
+                  text: "19";
+                  align: 0.5 0.5;
+                  min: 0 0;
+               }
+               min: 30 30;
+               align: 0.5 1.0;
+               fixed: 1 1;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.795 0.545;
+               rel2.relative: 0.795 0.545;
+            }
+         }
+         text { "meridiem";
+            scale: 1;
+            desc { "default";
+               color: 255 120 0 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "AM";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.9 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         text { "time";
+            scale: 1;
+            desc { "default";
+               color: 250 250 250 255;
+               fixed: 1 1;
+               text {
+                  size: 20;
+                  font: "Mono";
+                  text: "12:00";                  
+               }
+               min: 150 0;
+               fixed: 1 0;
+               align: 0.5 0.5;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.69;
+               rel2.relative: 0.5 0.69;
+            }
+         }
+         image { "hour";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_HOUR_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         image { "minute";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;               
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_MINUTE_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+         image { "second";
+            scale: 1;
+            nomouse;
+            desc { "default";
+               rel1.to: "bg";
+               rel2.to: "bg";
+               rel1.relative: 0.5 0.0;
+               rel2.relative: 0.5 1.0;
+               min: 30 0;
+               fixed: 1 0;                 
+               /* TODO: Please replace embedded image files to your application image files. */
+               image.normal: "EDC_EDITOR_EMBEDDED_NEEDLE_SECOND_RECT.png";
+               map.on: 1;
+               map.rotation.z: 0;
+            }
+            desc { "rotated";
+               inherit: "default";
+               map.rotation.z: 360;
+            }
+         }
+      }
+      programs {
+         program { "load";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "bg";
+            transition: LINEAR 30;
+            after: "reset";
+         }
+         program { "reset";
+            action: STATE_SET "default";
+            target: "bg";
+            after: "load";
+         }
+         program { "hour_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "hour";
+            transition: LINEAR 216000;
+            after: "hour_reset";
+         }
+         program { "hour_reset";
+            action: STATE_SET "default";
+            target: "hour";
+            after: "hour_begin";
+         }
+         program { "minute_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "minute";
+            transition: LINEAR 3600;
+            after: "minute_begin";
+         }
+         program { "minute_reset";
+            action: STATE_SET "default";
+            target: "minute";
+            after: "minute_begin";
+         }
+         program { "second_begin";
+            signal: "load";
+            source: "";
+            action: STATE_SET "rotated";
+            target: "second";
+            transition: LINEAR 60;
+            after: "second_reset";
+         }
+         program { "second_reset";
+            action: STATE_SET "default";
+            target: "second";
+            after: "second_begin";
+         }
+      }
+   }
+}
diff --git a/data/themes/Makefile.am b/data/themes/Makefile.am
new file mode 100644 (file)
index 0000000..f0b8be0
--- /dev/null
@@ -0,0 +1,3 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = default elm
diff --git a/data/themes/default/Makefile.am b/data/themes/default/Makefile.am
new file mode 100644 (file)
index 0000000..fc8cc8e
--- /dev/null
@@ -0,0 +1,27 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = images sounds fonts
+
+EDJE_CC = @edje_cc@
+EDJE_FLAGS = -id $(top_srcdir)/data/themes/default/images \
+                        -sd $(top_srcdir)/data/themes/default/sounds \
+                        -fd $(top_srcdir)/data/themes/default/fonts
+
+filesdir = $(datadir)/$(PACKAGE)/themes
+files_DATA = enventor.edj
+
+EXTRA_DIST = enventor.edc \
+             content.edc \
+             images.edc \
+             layout_common.edc \
+             layout_setting.edc \
+             theme_ext.edc \
+             live_edit.edc
+
+enventor.edj: Makefile $(EXTRA_DIST)
+       $(EDJE_CC) $(EDJE_FLAGS) \
+       $(top_srcdir)/data/themes/default/enventor.edc \
+       $(top_builddir)/data/themes/default/enventor.edj
+
+clean-local:
+       rm -f *.edj
diff --git a/data/themes/default/content.edc b/data/themes/default/content.edc
new file mode 100644 (file)
index 0000000..29403c6
--- /dev/null
@@ -0,0 +1,142 @@
+images {
+   image: "part_highlight.png" COMP;
+   image: "preview_swallow.png" COMP;
+   image: "live_spacer.png" COMP;
+   image: "wireframes.png" COMP;
+}
+
+group { "swallow";
+   parts {
+      image { "img";
+         desc { "default";
+            image.normal: "preview_swallow.png";
+            aspect: 1 1;
+            aspect_preference: BOTH;
+         }
+      }
+   }
+}
+
+group { "spacer";
+   parts {
+      image { "img";
+         desc {
+            image.normal: "live_spacer.png";
+            image.border: 1 1 1 1;
+            fill.smooth: 0;
+            color: 255 255 255 125;
+         }
+      }
+   }
+}
+
+group { "part_highlight";
+   parts {
+      image { "base";
+         nomouse;
+         desc { "default";
+            image.normal: "part_highlight.png";
+            image.border: 4 4 4 4;
+            image.border_scale: 1;
+         }
+      }
+   }
+}
+
+group { "wireframes";
+   parts {
+      image { "img";
+         repeat_events: 1;
+         desc {
+            image.normal: "wireframes.png";
+            image.border: 3 3 2 4;
+            fill.smooth: 0;
+         }
+      }
+   }
+}
+
+group { "ctrl_pt";
+   parts {
+      rect { "clipper";
+         desc { "default";
+         }
+         desc { "hide";
+            inherit: "default";
+            color: 255 255 255 0;
+         }
+      }
+      rect { "base";
+         clip_to: "clipper";
+         desc { "default";
+         }
+         desc { "anim";
+            inherit: "default";
+            color: COL_HI_S;
+         }
+      }
+      rect { "highlight";
+         clip_to: "clipper";
+         desc { "default";
+            color: 236 81 81 255;
+            visible: 0;
+         }
+         desc { "show";
+            inherit: "default";
+            visible: 1;
+         }
+      }
+   }
+   programs {
+      program { "load";
+         signal: "load";
+         after: "anim";
+      }
+      program { "anim";
+         action: STATE_SET "anim";
+         target: "base";
+         transition: LINEAR 0.5;
+         after: "anim2";
+      }
+      program { "anim2";
+         action: STATE_SET "default";
+         target: "base";
+         transition: LINEAR 0.5;
+         after: "anim";
+      }
+      program { "show";
+         signal: "elm,state,show";
+         source: "";
+         action: STATE_SET "default";
+         target: "clipper";
+         transition: LINEAR 0.125;
+      }
+      program { "hide";
+         signal: "elm,state,hide";
+         source: "";
+         action: STATE_SET "hide";
+         target: "clipper";
+         transition: LINEAR 0.125;
+      }
+      program { "hide,instance";
+         signal: "elm,state,hide,instance";
+         source: "";
+         action: STATE_SET "hide";
+         target: "clipper";
+      }
+      program { "show_highlight";
+         signal: "elm,state,show,highlight";
+         source: "";
+         action: STATE_SET "show";
+         target: "highlight";
+         transition: LINEAR 0.125;
+      }
+      program { "hide_highlight";
+         signal: "elm,state,hide,highlight";
+         source: "";
+         action: STATE_SET "default";
+         target: "highlight";
+         transition: LINEAR 0.125;
+      }
+   }
+}
diff --git a/data/themes/default/enventor.edc b/data/themes/default/enventor.edc
new file mode 100644 (file)
index 0000000..0d730f3
--- /dev/null
@@ -0,0 +1,22 @@
+#define FN "Tizen"
+#define FNBD "Tizen_Bold"
+
+#define COL_HI 0 103 244 255
+#define COL_HI_S 51 153 255 255
+#define COL_NM 41 41 41 255
+
+data.item: "version" "110";
+
+fonts {
+   font: "BreezeSans.ttf" "Tizen";
+   font: "BreezeSans-Bold.ttf" "Tizen_Bold";
+}
+
+collections {
+   #include "content.edc"
+   #include "images.edc"
+   #include "theme_ext.edc"
+   #include "layout_common.edc"
+   #include "layout_setting.edc"
+   #include "live_edit.edc"
+}
diff --git a/data/themes/default/fonts/BreezeSans-Bold.ttf b/data/themes/default/fonts/BreezeSans-Bold.ttf
new file mode 100644 (file)
index 0000000..cd41488
Binary files /dev/null and b/data/themes/default/fonts/BreezeSans-Bold.ttf differ
diff --git a/data/themes/default/fonts/BreezeSans.ttf b/data/themes/default/fonts/BreezeSans.ttf
new file mode 100644 (file)
index 0000000..60e3e61
Binary files /dev/null and b/data/themes/default/fonts/BreezeSans.ttf differ
diff --git a/data/themes/default/fonts/Makefile.am b/data/themes/default/fonts/Makefile.am
new file mode 100644 (file)
index 0000000..7c62a7b
--- /dev/null
@@ -0,0 +1,4 @@
+MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST = \
+   BreezeSans.ttf \
+       BreezeSans-Bold.ttf
diff --git a/data/themes/default/images.edc b/data/themes/default/images.edc
new file mode 100644 (file)
index 0000000..dc281b3
--- /dev/null
@@ -0,0 +1,311 @@
+images {
+   image: "icon_close.png" COMP;
+   image: "icon_file.png" COMP;
+   image: "icon_folder.png" COMP;
+   image: "expand.png" COMP;
+   image: "expand_clicked.png" COMP;
+   image: "expand_hover.png" COMP;
+   image: "invert.png" COMP;
+   image: "invert_clicked.png" COMP;
+   image: "invert_hover.png" COMP;
+   image: "navi_group.png" COMP;
+   image: "navi_rect.png" COMP;
+   image: "navi_image.png" COMP;
+   image: "navi_swallow.png" COMP;
+   image: "navi_text.png" COMP;
+   image: "navi_textblock.png" COMP;
+   image: "navi_spacer.png" COMP;
+   image: "navi_state.png" COMP;
+   image: "navi_program.png" COMP;
+   image: "navi_unknown.png" COMP;
+   image: "navi_play.png" COMP;
+   image: "navi_stop.png" COMP;
+   image: "refresh.png" COMP;
+   image: "refresh_hover.png" COMP;
+   image: "refresh_clicked.png" COMP;
+   image: "icon_file_selected.png" COMP;
+   image: "icon_folder_selected.png" COMP;
+   image: "icon_close_tab.png" COMP;
+   image: "navi_group_selected.png" COMP;
+   image: "navi_rect_selected.png" COMP;
+   image: "navi_image_selected.png" COMP;
+   image: "navi_swallow_selected.png" COMP;
+   image: "navi_text_selected.png" COMP;
+   image: "navi_textblock_selected.png" COMP;
+   image: "navi_spacer_selected.png" COMP;
+   image: "navi_state_selected.png" COMP;
+   image: "navi_program_selected.png" COMP;
+   image: "navi_unknown_selected.png" COMP;
+   image: "highlight.png" COMP;
+   image: "highlight_hover.png" COMP;
+   image: "highlight_clicked.png" COMP;
+   image: "find.png" COMP;
+   image: "find_hover.png" COMP;
+   image: "find_clicked.png" COMP;
+   image: "lines.png" COMP;
+   image: "lines_hover.png" COMP;
+   image: "lines_clicked.png" COMP;
+   image: "console.png" COMP;
+   image: "console_hover.png" COMP;
+   image: "console_clicked.png" COMP;
+   image: "status.png" COMP;
+   image: "status_hover.png" COMP;
+   image: "status_clicked.png" COMP;
+   image: "sizebox_icon.png" COMP;
+   image: "dummy.png" COMP;
+   image: "dummy_hover.png" COMP;
+   image: "dummy_clicked.png" COMP;
+   image: "wireframes_icon.png" COMP;
+   image: "wireframes_icon_hover.png" COMP;
+   image: "wireframes_icon_clicked.png" COMP;
+   image: "mirror.png" COMP;
+   image: "mirror_hover.png" COMP;
+   image: "mirror_clicked.png" COMP;
+   image: "goto.png" COMP;
+   image: "goto_hover.png" COMP;
+   image: "goto_clicked.png" COMP;
+   image: "save.png" COMP;
+   image: "save_hover.png" COMP;
+   image: "save_clicked.png" COMP;
+   image: "redo.png" COMP;
+   image: "redo_hover.png" COMP;
+   image: "redo_clicked.png" COMP;
+   image: "undo.png" COMP;
+   image: "undo_hover.png" COMP;
+   image: "undo_clicked.png" COMP;
+   image: "live_image.png" COMP;
+   image: "live_image_hover.png" COMP;
+   image: "live_image_clicked.png" COMP;
+   image: "live_rectangle.png" COMP;
+   image: "live_rectangle_hover.png" COMP;
+   image: "live_rectangle_clicked.png" COMP;
+   image: "live_swallow.png" COMP;
+   image: "live_swallow_hover.png" COMP;
+   image: "live_swallow_clicked.png" COMP;
+   image: "live_spacer_icon.png" COMP;
+   image: "live_spacer_icon_hover.png" COMP;
+   image: "live_spacer_icon_clicked.png" COMP;
+   image: "live_text.png" COMP;
+   image: "live_text_hover.png" COMP;
+   image: "live_text_clicked.png" COMP;
+   image: "live_textblock.png" COMP;
+   image: "live_textblock_hover.png" COMP;
+   image: "live_textblock_clicked.png" COMP;
+   image: "file_browser.png" COMP;
+   image: "file_browser_hover.png" COMP;
+   image: "file_browser_clicked.png" COMP;
+   image: "edc_navigator.png" COMP;
+   image: "edc_navigator_hover.png" COMP;
+   image: "edc_navigator_clicked.png" COMP;
+   image: "setting.png" COMP;
+   image: "setting_hover.png" COMP;
+   image: "setting_clicked.png" COMP;
+   image: "about.png" COMP;
+   image: "about_hover.png" COMP;
+   image: "about_clicked.png" COMP;
+   image: "template.png" COMP;
+   image: "template_hover.png" COMP;
+   image: "template_clicked.png" COMP;
+}
+
+#define ICON_GROUP(_group_name, _image_path) \
+   group { name: _group_name; \
+      parts { \
+         part { name: "img"; \
+            desc { \
+               image.normal: _image_path; \
+            } \
+         } \
+      } \
+   }
+
+#define ICON_GROUP2(_group_name, _image_path, _image_path2, _image_path3) \
+   group { _group_name; \
+      script { \
+         public hover_state; \
+         public highlight_state; \
+      } \
+      parts { \
+         image { "base"; \
+            nomouse; \
+            desc { "default"; \
+               image.normal: _image_path; \
+            } \
+            desc { "clicked"; \
+               inherit: "default"; \
+               visible: 0; \
+            } \
+            desc { "hover"; \
+               inherit: "clicked"; \
+            } \
+         } \
+         image { "clicked"; \
+            nomouse; \
+            desc { "default"; \
+               image.normal: _image_path2; \
+               visible: 0; \
+            } \
+            desc { "clicked"; \
+               inherit: "default"; \
+               visible: 1; \
+            } \
+            desc { "hover"; \
+               inherit: "default"; \
+            } \
+         } \
+         image { "hover"; \
+            nomouse; \
+            desc { "default"; \
+               image.normal: _image_path3; \
+               visible: 0; \
+            } \
+            desc { "clicked"; \
+               inherit: "default"; \
+            } \
+            desc { "hover"; \
+               inherit: "default"; \
+               visible: 1; \
+            } \
+         } \
+         rect { "event"; \
+            repeat_events: 1; \
+            desc { "default"; \
+               color: 0 0 0 0; \
+            } \
+         } \
+      } \
+      programs { \
+         program { "icon_highlight_enabled"; \
+            signal: "icon,highlight,enabled"; \
+            source: ""; \
+            script { \
+               set_int(highlight_state, 1); \
+               set_state(PART:"hover", "clicked", 0.0); \
+               set_state(PART:"base", "clicked", 0.0); \
+               set_state(PART:"clicked", "clicked", 0.0); \
+            } \
+         } \
+         program { "icon_highlight_disabled"; \
+            signal: "icon,highlight,disabled"; \
+            source: ""; \
+            script { \
+               set_int(highlight_state, 0); \
+               set_state(PART:"hover", "default", 0.0); \
+               set_state(PART:"base", "default", 0.0); \
+               set_state(PART:"clicked", "default", 0.0); \
+            } \
+         } \
+         program { "mouse_pressed"; \
+            signal: "mouse,down,1"; \
+            source: "event"; \
+            action: STATE_SET "clicked"; \
+            target: "clicked"; \
+            target: "base"; \
+            target: "hover"; \
+         } \
+         program { "mouse_unpressed"; \
+            signal: "mouse,up,1"; \
+            source: "event"; \
+            action: STATE_SET "default"; \
+            target: "clicked"; \
+            target: "base"; \
+            script { \
+               if (get_int(highlight_state) == 0) { \
+                  if (get_int(hover_state) == 1) { \
+                     set_state(PART:"hover", "hover", 0.0); \
+                     set_state(PART:"base", "hover", 0.0); \
+                     set_state(PART:"clicked", "hover", 0.0); \
+                  } \
+                  else { \
+                     set_state(PART:"hover", "default", 0.0); \
+                     set_state(PART:"base", "default", 0.0); \
+                     set_state(PART:"clicked", "default", 0.0); \
+                  } \
+               } \
+            } \
+         } \
+         program { "mouse_in"; \
+            signal: "mouse,in"; \
+            source: "event"; \
+            script { \
+               if (get_int(highlight_state) == 0) { \
+                  set_int(hover_state, 1); \
+                  set_state(PART:"hover", "hover", 0.0); \
+                  set_state(PART:"clicked", "hover", 0.0); \
+                 set_state(PART:"base", "hover", 0.0); \
+               } \
+            } \
+         } \
+         program { "mouse_out"; \
+            signal: "mouse,out"; \
+            source: "event"; \
+            script { \
+               if (get_int(highlight_state) == 0) { \
+                  set_int(hover_state, 0); \
+                  set_state(PART:"hover", "default", 0.0); \
+                  set_state(PART:"clicked", "default", 0.0); \
+                  set_state(PART:"base", "default", 0.0); \
+               } \
+            } \
+         } \
+      } \
+   }
+
+ICON_GROUP("file", "icon_file.png")
+ICON_GROUP("folder", "icon_folder.png")
+ICON_GROUP("close", "icon_close.png")
+ICON_GROUP("navi_group", "navi_group.png")
+ICON_GROUP("navi_image", "navi_image.png")
+ICON_GROUP("navi_rect", "navi_rect.png")
+ICON_GROUP("navi_swallow", "navi_swallow.png")
+ICON_GROUP("navi_text", "navi_text.png")
+ICON_GROUP("navi_textblock", "navi_textblock.png")
+ICON_GROUP("navi_spacer", "navi_spacer.png")
+ICON_GROUP("navi_state", "navi_state.png")
+ICON_GROUP("navi_program", "navi_program.png")
+ICON_GROUP("navi_unknown", "navi_unknown.png")
+ICON_GROUP("navi_play", "navi_play.png")
+ICON_GROUP("navi_stop", "navi_stop.png")
+ICON_GROUP("navi_group_selected", "navi_group_selected.png")
+ICON_GROUP("navi_image_selected", "navi_image_selected.png")
+ICON_GROUP("navi_rect_selected", "navi_rect_selected.png")
+ICON_GROUP("navi_swallow_selected", "navi_swallow_selected.png")
+ICON_GROUP("navi_text_selected", "navi_text_selected.png")
+ICON_GROUP("navi_textblock_selected", "navi_textblock_selected.png")
+ICON_GROUP("navi_spacer_selected", "navi_spacer_selected.png")
+ICON_GROUP("navi_state_selected", "navi_state_selected.png")
+ICON_GROUP("navi_program_selected", "navi_program_selected.png")
+ICON_GROUP("navi_unknown_selected", "navi_unknown_selected.png")
+ICON_GROUP("sizebox_icon", "sizebox_icon.png")
+ICON_GROUP("file_selected", "icon_file_selected.png")
+ICON_GROUP("folder_selected", "icon_folder_selected.png")
+ICON_GROUP("close_tab", "icon_close_tab.png")
+
+#undef ICON_GROUP
+
+ICON_GROUP2("expand", "expand.png", "expand_clicked.png", "expand_hover.png")
+ICON_GROUP2("invert", "invert.png", "invert_clicked.png", "invert_hover.png")
+ICON_GROUP2("highlight", "highlight.png", "highlight_clicked.png", "highlight_hover.png")
+ICON_GROUP2("goto", "goto.png", "goto_clicked.png", "goto_hover.png")
+ICON_GROUP2("find", "find.png", "find_clicked.png", "find_hover.png")
+ICON_GROUP2("lines", "lines.png", "lines_clicked.png", "lines_hover.png")
+ICON_GROUP2("console", "console.png", "console_clicked.png", "console_hover.png")
+ICON_GROUP2("filetab", "status.png", "status_clicked.png", "status_hover.png")
+ICON_GROUP2("dummy", "dummy.png", "dummy_clicked.png", "dummy_hover.png")
+ICON_GROUP2("mirror", "mirror.png", "mirror_clicked.png", "mirror_hover.png")
+ICON_GROUP2("wireframes_icon", "wireframes_icon.png", "wireframes_icon_clicked.png", "wireframes_icon_hover.png")
+ICON_GROUP2("save", "save.png", "save_clicked.png", "save_hover.png")
+ICON_GROUP2("undo", "undo.png", "undo_clicked.png", "undo_hover.png")
+ICON_GROUP2("redo", "redo.png", "redo_clicked.png", "redo_hover.png")
+ICON_GROUP2("Image", "live_image.png", "live_image_clicked.png", "live_image_hover.png")
+ICON_GROUP2("Rect", "live_rectangle.png", "live_rectangle_clicked.png", "live_rectangle_hover.png")
+ICON_GROUP2("Spacer_Icon", "live_spacer_icon.png", "live_spacer_icon_clicked.png", "live_spacer_icon_hover.png")
+ICON_GROUP2("Swallow", "live_swallow.png", "live_swallow_clicked.png", "live_swallow_hover.png")
+ICON_GROUP2("Text", "live_text.png", "live_text_clicked.png", "live_text_hover.png")
+ICON_GROUP2("Textblock", "live_textblock.png", "live_textblock_clicked.png", "live_textblock_hover.png")
+ICON_GROUP2("file_browser", "file_browser.png", "file_browser_clicked.png", "file_browser_hover.png")
+ICON_GROUP2("edc_navigator", "edc_navigator.png", "edc_navigator_clicked.png", "edc_navigator_hover.png")
+ICON_GROUP2("setting", "setting.png", "setting_clicked.png", "setting_hover.png")
+ICON_GROUP2("about", "about.png", "about_clicked.png", "about_hover.png")
+ICON_GROUP2("template", "template.png", "template_clicked.png", "template_hover.png")
+ICON_GROUP2("refresh", "refresh.png", "refresh_clicked.png", "refresh_hover.png")
diff --git a/data/themes/default/images/Makefile.am b/data/themes/default/images/Makefile.am
new file mode 100644 (file)
index 0000000..7df6f15
--- /dev/null
@@ -0,0 +1,204 @@
+MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST = \
+   help_bg.png \
+   bevel_in.png \
+   bevel_out.png \
+   bg_glow_in.png \
+   bt_base1.png \
+   bt_base2.png \
+   bt_dis_base.png \
+   bt_dis_hilight.png \
+   bt_glow.png \
+   bt_hilight.png \
+   bt_shine.png \
+   glow_small.png \
+   holes_tiny_glow_horiz.png \
+   holes_tiny_glow_vert.png \
+   holes_tiny_horiz.png \
+   holes_tiny_vert.png \
+   inset_shadow.png \
+   full_logo.png \
+   window_title_bg.png \
+   slider_minus.png \
+   slider_minus_hover.png \
+   slider_minus_push.png \
+   part_highlight.png \
+   runner_glow_horiz.png \
+   runner_glow_vert.png \
+   runner_horiz.png \
+   runner_vert.png \
+   shadow_square_tiny.png \
+   slider_plus.png \
+   slider_plus_hover.png \
+   slider_plus_push.png \
+   preview_swallow.png \
+   sym_down_glow_normal.png \
+   sym_down_light_normal.png \
+   sym_left_glow_normal.png \
+   sym_left_light_normal.png \
+   sym_right_glow_normal.png \
+   sym_right_light_normal.png \
+   sym_up_glow_normal.png \
+   sym_up_light_normal.png \
+   vgrad_med_lighter.png \
+   warning_icon.png \
+   canvas_pattern.png \
+   menu.png \
+   find.png \
+   find_hover.png \
+   find_clicked.png \
+   highlight.png \
+   highlight_hover.png \
+   highlight_clicked.png \
+   lines.png \
+   lines_hover.png \
+   lines_clicked.png \
+   setting_icon.png \
+   console.png \
+   console_hover.png \
+   console_clicked.png \
+   status.png \
+   status_hover.png \
+   status_clicked.png \
+   dummy.png \
+   dummy_hover.png \
+   dummy_clicked.png \
+   mirror.png \
+   wireframes_icon.png \
+   wireframes_icon_hover.png \
+   wireframes_icon_clicked.png \
+   goto.png \
+   goto_hover.png \
+   goto_clicked.png \
+   downlight_glow_left.png \
+   downlight_glow_right.png \
+   window_scale_controller.png \
+   window_scale_controller_push.png \
+   window_scale_controller_hover.png \
+   window_scale_controller_top.png \
+   window_scale_controller_top_push.png \
+   window_scale_controller_top_hover.png \
+   window_scale_controller_bottom.png \
+   window_scale_controller_bottom_push.png \
+   window_scale_controller_bottom_hover.png \
+   disabler.png \
+   info_topleft.png \
+   info_rightbottom.png \
+   info_window.png \
+   live_bg_glow_in.png \
+   live_bg_glow_in_24.png \
+   live_image.png \
+   live_image_hover.png \
+   live_image_clicked.png \
+   live_rectangle.png \
+   live_rectangle_hover.png \
+   live_rectangle_clicked.png \
+   live_swallow.png \
+   live_swallow_hover.png \
+   live_swallow_clicked.png \
+   live_spacer.png \
+   live_spacer_icon.png \
+   live_spacer_icon_hover.png \
+   live_spacer_icon_clicked.png \
+   live_text.png \
+   live_text_hover.png \
+   live_text_clicked.png \
+   live_textblock.png \
+   live_textblock_hover.png \
+   live_textblock_clicked.png \
+   spacer.png \
+   edceditor_icon.png \
+   slider_up.png \
+   slider_down.png \
+   save.png \
+   save_hover.png \
+   save_clicked.png \
+   redo.png \
+   redo_hover.png \
+   redo_clicked.png \
+   undo.png \
+   undo_hover.png \
+   undo_clicked.png \
+   white_bar_vert_glow.png \
+   horizontal_separated_bar_small_glow.png \
+   expand.png \
+   expand_clicked.png \
+   expand_hover.png \
+   invert.png \
+   invert_clicked.png \
+   invert_hover.png \
+   icon_close.png \
+   icon_close_tab.png \
+   icon_file.png \
+   icon_file_selected.png \
+   icon_file2.png \
+   icon_folder.png \
+   icon_folder_selected.png \
+   file_browser.png \
+   file_browser_hover.png \
+   file_browser_clicked.png \
+   edc_navigator.png \
+   edc_navigator_hover.png \
+   edc_navigator_clicked.png \
+   cursor_arrow.png \
+   navi_group.png \
+   navi_image.png \
+   navi_rect.png \
+   navi_swallow.png \
+   navi_text.png \
+   navi_textblock.png \
+   navi_spacer.png \
+   navi_unknown.png \
+   navi_state.png \
+   navi_program.png \
+   navi_play.png \
+   navi_stop.png \
+   navi_group_selected.png \
+   navi_image_selected.png \
+   navi_rect_selected.png \
+   navi_swallow_selected.png \
+   navi_text_selected.png \
+   navi_textblock_selected.png \
+   navi_spacer_selected.png \
+   navi_state_selected.png \
+   navi_unknown_selected.png \
+   navi_program_selected.png \
+   preview_bg.png \
+   refresh.png \
+   refresh_hover.png \
+   refresh_clicked.png \
+   template.png \
+   template_hover.png \
+   template_clicked.png \
+   statsu_bg.png \
+   setting_icon_data.png \
+   setting_icon_font.png \
+   setting_icon_img.png \
+   setting_icon_sound.png \
+   setting.png \
+   setting_hover.png \
+   setting_clicked.png \
+   sizebox_icon.png \
+   about.png \
+   about_hover.png \
+   about_clicked.png \
+   candidates_list_bg.png \
+   candidates_list_arrow_left.png \
+   candidates_list_arrow_right.png \
+   candidates_list_arrow_up.png \
+   candidates_list_arrow_down.png \
+   icon_close.png \
+   tool_percent_nor.png \
+   tool_zoom_in_mv.png \
+   tool_zoom_in_nor.png \
+   tool_zoom_out_mv.png \
+   tool_zoom_out_nor.png \
+   popup_shadow.png \
+   filetab.png \
+   bevel_curved_vert_out.png \
+   shadow_rounded_vert.png \
+   wireframes.png \
+   list_h_item_normal_bg.png \
+   list_h_item_hovered_bg.png \
+   list_h_item_selected_bg.png \
+   preview_image.png
diff --git a/data/themes/default/images/about.png b/data/themes/default/images/about.png
new file mode 100644 (file)
index 0000000..7217364
Binary files /dev/null and b/data/themes/default/images/about.png differ
diff --git a/data/themes/default/images/about_clicked.png b/data/themes/default/images/about_clicked.png
new file mode 100644 (file)
index 0000000..7d9675c
Binary files /dev/null and b/data/themes/default/images/about_clicked.png differ
diff --git a/data/themes/default/images/about_hover.png b/data/themes/default/images/about_hover.png
new file mode 100644 (file)
index 0000000..023ef8c
Binary files /dev/null and b/data/themes/default/images/about_hover.png differ
diff --git a/data/themes/default/images/bevel_curved_vert_out.png b/data/themes/default/images/bevel_curved_vert_out.png
new file mode 100644 (file)
index 0000000..a8b44dc
Binary files /dev/null and b/data/themes/default/images/bevel_curved_vert_out.png differ
diff --git a/data/themes/default/images/bevel_in.png b/data/themes/default/images/bevel_in.png
new file mode 100644 (file)
index 0000000..152e5ac
Binary files /dev/null and b/data/themes/default/images/bevel_in.png differ
diff --git a/data/themes/default/images/bevel_out.png b/data/themes/default/images/bevel_out.png
new file mode 100644 (file)
index 0000000..7b9c2e4
Binary files /dev/null and b/data/themes/default/images/bevel_out.png differ
diff --git a/data/themes/default/images/bg_glow_in.png b/data/themes/default/images/bg_glow_in.png
new file mode 100644 (file)
index 0000000..0cb68af
Binary files /dev/null and b/data/themes/default/images/bg_glow_in.png differ
diff --git a/data/themes/default/images/bt_base1.png b/data/themes/default/images/bt_base1.png
new file mode 100644 (file)
index 0000000..2d1f179
Binary files /dev/null and b/data/themes/default/images/bt_base1.png differ
diff --git a/data/themes/default/images/bt_base2.png b/data/themes/default/images/bt_base2.png
new file mode 100644 (file)
index 0000000..dd3e3ce
Binary files /dev/null and b/data/themes/default/images/bt_base2.png differ
diff --git a/data/themes/default/images/bt_dis_base.png b/data/themes/default/images/bt_dis_base.png
new file mode 100644 (file)
index 0000000..06f3dd5
Binary files /dev/null and b/data/themes/default/images/bt_dis_base.png differ
diff --git a/data/themes/default/images/bt_dis_hilight.png b/data/themes/default/images/bt_dis_hilight.png
new file mode 100644 (file)
index 0000000..e5cf7d3
Binary files /dev/null and b/data/themes/default/images/bt_dis_hilight.png differ
diff --git a/data/themes/default/images/bt_glow.png b/data/themes/default/images/bt_glow.png
new file mode 100644 (file)
index 0000000..e995ff1
Binary files /dev/null and b/data/themes/default/images/bt_glow.png differ
diff --git a/data/themes/default/images/bt_hilight.png b/data/themes/default/images/bt_hilight.png
new file mode 100644 (file)
index 0000000..3b7fe5b
Binary files /dev/null and b/data/themes/default/images/bt_hilight.png differ
diff --git a/data/themes/default/images/bt_shine.png b/data/themes/default/images/bt_shine.png
new file mode 100644 (file)
index 0000000..a58bdee
Binary files /dev/null and b/data/themes/default/images/bt_shine.png differ
diff --git a/data/themes/default/images/candidates_list_arrow_down.png b/data/themes/default/images/candidates_list_arrow_down.png
new file mode 100644 (file)
index 0000000..6cdd251
Binary files /dev/null and b/data/themes/default/images/candidates_list_arrow_down.png differ
diff --git a/data/themes/default/images/candidates_list_arrow_left.png b/data/themes/default/images/candidates_list_arrow_left.png
new file mode 100644 (file)
index 0000000..49d48e5
Binary files /dev/null and b/data/themes/default/images/candidates_list_arrow_left.png differ
diff --git a/data/themes/default/images/candidates_list_arrow_right.png b/data/themes/default/images/candidates_list_arrow_right.png
new file mode 100644 (file)
index 0000000..ddaaabc
Binary files /dev/null and b/data/themes/default/images/candidates_list_arrow_right.png differ
diff --git a/data/themes/default/images/candidates_list_arrow_up.png b/data/themes/default/images/candidates_list_arrow_up.png
new file mode 100644 (file)
index 0000000..45d3a9a
Binary files /dev/null and b/data/themes/default/images/candidates_list_arrow_up.png differ
diff --git a/data/themes/default/images/candidates_list_bg.png b/data/themes/default/images/candidates_list_bg.png
new file mode 100644 (file)
index 0000000..502cac8
Binary files /dev/null and b/data/themes/default/images/candidates_list_bg.png differ
diff --git a/data/themes/default/images/check.png b/data/themes/default/images/check.png
new file mode 100644 (file)
index 0000000..79a5a75
Binary files /dev/null and b/data/themes/default/images/check.png differ
diff --git a/data/themes/default/images/console.png b/data/themes/default/images/console.png
new file mode 100644 (file)
index 0000000..1f353bf
Binary files /dev/null and b/data/themes/default/images/console.png differ
diff --git a/data/themes/default/images/console_clicked.png b/data/themes/default/images/console_clicked.png
new file mode 100644 (file)
index 0000000..d2bb1e3
Binary files /dev/null and b/data/themes/default/images/console_clicked.png differ
diff --git a/data/themes/default/images/console_hover.png b/data/themes/default/images/console_hover.png
new file mode 100644 (file)
index 0000000..b34e9ad
Binary files /dev/null and b/data/themes/default/images/console_hover.png differ
diff --git a/data/themes/default/images/cursor_arrow.png b/data/themes/default/images/cursor_arrow.png
new file mode 100644 (file)
index 0000000..8b92cad
Binary files /dev/null and b/data/themes/default/images/cursor_arrow.png differ
diff --git a/data/themes/default/images/disabler.png b/data/themes/default/images/disabler.png
new file mode 100644 (file)
index 0000000..5f1f731
Binary files /dev/null and b/data/themes/default/images/disabler.png differ
diff --git a/data/themes/default/images/downlight_glow_left.png b/data/themes/default/images/downlight_glow_left.png
new file mode 100644 (file)
index 0000000..d74def7
Binary files /dev/null and b/data/themes/default/images/downlight_glow_left.png differ
diff --git a/data/themes/default/images/downlight_glow_right.png b/data/themes/default/images/downlight_glow_right.png
new file mode 100644 (file)
index 0000000..8b20af0
Binary files /dev/null and b/data/themes/default/images/downlight_glow_right.png differ
diff --git a/data/themes/default/images/dummy.png b/data/themes/default/images/dummy.png
new file mode 100644 (file)
index 0000000..5d560af
Binary files /dev/null and b/data/themes/default/images/dummy.png differ
diff --git a/data/themes/default/images/dummy_clicked.png b/data/themes/default/images/dummy_clicked.png
new file mode 100644 (file)
index 0000000..7906f9b
Binary files /dev/null and b/data/themes/default/images/dummy_clicked.png differ
diff --git a/data/themes/default/images/dummy_hover.png b/data/themes/default/images/dummy_hover.png
new file mode 100644 (file)
index 0000000..434f773
Binary files /dev/null and b/data/themes/default/images/dummy_hover.png differ
diff --git a/data/themes/default/images/edc_navigator.png b/data/themes/default/images/edc_navigator.png
new file mode 100644 (file)
index 0000000..17c15d0
Binary files /dev/null and b/data/themes/default/images/edc_navigator.png differ
diff --git a/data/themes/default/images/edc_navigator_clicked.png b/data/themes/default/images/edc_navigator_clicked.png
new file mode 100644 (file)
index 0000000..a26fd60
Binary files /dev/null and b/data/themes/default/images/edc_navigator_clicked.png differ
diff --git a/data/themes/default/images/edc_navigator_hover.png b/data/themes/default/images/edc_navigator_hover.png
new file mode 100644 (file)
index 0000000..b2aeab8
Binary files /dev/null and b/data/themes/default/images/edc_navigator_hover.png differ
diff --git a/data/themes/default/images/edceditor_icon.png b/data/themes/default/images/edceditor_icon.png
new file mode 100644 (file)
index 0000000..b34151d
Binary files /dev/null and b/data/themes/default/images/edceditor_icon.png differ
diff --git a/data/themes/default/images/expand.png b/data/themes/default/images/expand.png
new file mode 100644 (file)
index 0000000..cddbd63
Binary files /dev/null and b/data/themes/default/images/expand.png differ
diff --git a/data/themes/default/images/expand_clicked.png b/data/themes/default/images/expand_clicked.png
new file mode 100644 (file)
index 0000000..5f6af8e
Binary files /dev/null and b/data/themes/default/images/expand_clicked.png differ
diff --git a/data/themes/default/images/expand_hover.png b/data/themes/default/images/expand_hover.png
new file mode 100644 (file)
index 0000000..9d8fdea
Binary files /dev/null and b/data/themes/default/images/expand_hover.png differ
diff --git a/data/themes/default/images/file_browser.png b/data/themes/default/images/file_browser.png
new file mode 100644 (file)
index 0000000..971a148
Binary files /dev/null and b/data/themes/default/images/file_browser.png differ
diff --git a/data/themes/default/images/file_browser_clicked.png b/data/themes/default/images/file_browser_clicked.png
new file mode 100644 (file)
index 0000000..9d103f0
Binary files /dev/null and b/data/themes/default/images/file_browser_clicked.png differ
diff --git a/data/themes/default/images/file_browser_hover.png b/data/themes/default/images/file_browser_hover.png
new file mode 100644 (file)
index 0000000..79b9796
Binary files /dev/null and b/data/themes/default/images/file_browser_hover.png differ
diff --git a/data/themes/default/images/filetab.png b/data/themes/default/images/filetab.png
new file mode 100644 (file)
index 0000000..10bdb97
Binary files /dev/null and b/data/themes/default/images/filetab.png differ
diff --git a/data/themes/default/images/find.png b/data/themes/default/images/find.png
new file mode 100644 (file)
index 0000000..42dd101
Binary files /dev/null and b/data/themes/default/images/find.png differ
diff --git a/data/themes/default/images/find_clicked.png b/data/themes/default/images/find_clicked.png
new file mode 100644 (file)
index 0000000..d13f79c
Binary files /dev/null and b/data/themes/default/images/find_clicked.png differ
diff --git a/data/themes/default/images/find_hover.png b/data/themes/default/images/find_hover.png
new file mode 100644 (file)
index 0000000..9b1efc3
Binary files /dev/null and b/data/themes/default/images/find_hover.png differ
diff --git a/data/themes/default/images/full_logo.png b/data/themes/default/images/full_logo.png
new file mode 100644 (file)
index 0000000..3314fb4
Binary files /dev/null and b/data/themes/default/images/full_logo.png differ
diff --git a/data/themes/default/images/glow_small.png b/data/themes/default/images/glow_small.png
new file mode 100644 (file)
index 0000000..4a86096
Binary files /dev/null and b/data/themes/default/images/glow_small.png differ
diff --git a/data/themes/default/images/goto.png b/data/themes/default/images/goto.png
new file mode 100644 (file)
index 0000000..b98bfab
Binary files /dev/null and b/data/themes/default/images/goto.png differ
diff --git a/data/themes/default/images/goto_clicked.png b/data/themes/default/images/goto_clicked.png
new file mode 100644 (file)
index 0000000..1cd21f4
Binary files /dev/null and b/data/themes/default/images/goto_clicked.png differ
diff --git a/data/themes/default/images/goto_hover.png b/data/themes/default/images/goto_hover.png
new file mode 100644 (file)
index 0000000..64317b7
Binary files /dev/null and b/data/themes/default/images/goto_hover.png differ
diff --git a/data/themes/default/images/help_bg.png b/data/themes/default/images/help_bg.png
new file mode 100644 (file)
index 0000000..06fbc78
Binary files /dev/null and b/data/themes/default/images/help_bg.png differ
diff --git a/data/themes/default/images/highlight.png b/data/themes/default/images/highlight.png
new file mode 100644 (file)
index 0000000..153f74e
Binary files /dev/null and b/data/themes/default/images/highlight.png differ
diff --git a/data/themes/default/images/highlight_clicked.png b/data/themes/default/images/highlight_clicked.png
new file mode 100644 (file)
index 0000000..a093f61
Binary files /dev/null and b/data/themes/default/images/highlight_clicked.png differ
diff --git a/data/themes/default/images/highlight_hover.png b/data/themes/default/images/highlight_hover.png
new file mode 100644 (file)
index 0000000..41828c0
Binary files /dev/null and b/data/themes/default/images/highlight_hover.png differ
diff --git a/data/themes/default/images/holes_tiny_glow_horiz.png b/data/themes/default/images/holes_tiny_glow_horiz.png
new file mode 100644 (file)
index 0000000..bd2e331
Binary files /dev/null and b/data/themes/default/images/holes_tiny_glow_horiz.png differ
diff --git a/data/themes/default/images/holes_tiny_glow_vert.png b/data/themes/default/images/holes_tiny_glow_vert.png
new file mode 100644 (file)
index 0000000..360a19c
Binary files /dev/null and b/data/themes/default/images/holes_tiny_glow_vert.png differ
diff --git a/data/themes/default/images/holes_tiny_horiz.png b/data/themes/default/images/holes_tiny_horiz.png
new file mode 100644 (file)
index 0000000..aab4069
Binary files /dev/null and b/data/themes/default/images/holes_tiny_horiz.png differ
diff --git a/data/themes/default/images/holes_tiny_vert.png b/data/themes/default/images/holes_tiny_vert.png
new file mode 100644 (file)
index 0000000..a49be37
Binary files /dev/null and b/data/themes/default/images/holes_tiny_vert.png differ
diff --git a/data/themes/default/images/horizontal_separated_bar_small_glow.png b/data/themes/default/images/horizontal_separated_bar_small_glow.png
new file mode 100644 (file)
index 0000000..31ddfee
Binary files /dev/null and b/data/themes/default/images/horizontal_separated_bar_small_glow.png differ
diff --git a/data/themes/default/images/icon_close.png b/data/themes/default/images/icon_close.png
new file mode 100644 (file)
index 0000000..f9a1595
Binary files /dev/null and b/data/themes/default/images/icon_close.png differ
diff --git a/data/themes/default/images/icon_close_tab.png b/data/themes/default/images/icon_close_tab.png
new file mode 100644 (file)
index 0000000..550c192
Binary files /dev/null and b/data/themes/default/images/icon_close_tab.png differ
diff --git a/data/themes/default/images/icon_file.png b/data/themes/default/images/icon_file.png
new file mode 100644 (file)
index 0000000..b984a55
Binary files /dev/null and b/data/themes/default/images/icon_file.png differ
diff --git a/data/themes/default/images/icon_file2.png b/data/themes/default/images/icon_file2.png
new file mode 100644 (file)
index 0000000..f5adbea
Binary files /dev/null and b/data/themes/default/images/icon_file2.png differ
diff --git a/data/themes/default/images/icon_file_selected.png b/data/themes/default/images/icon_file_selected.png
new file mode 100644 (file)
index 0000000..1414c75
Binary files /dev/null and b/data/themes/default/images/icon_file_selected.png differ
diff --git a/data/themes/default/images/icon_folder.png b/data/themes/default/images/icon_folder.png
new file mode 100644 (file)
index 0000000..23f53a7
Binary files /dev/null and b/data/themes/default/images/icon_folder.png differ
diff --git a/data/themes/default/images/icon_folder_selected.png b/data/themes/default/images/icon_folder_selected.png
new file mode 100644 (file)
index 0000000..4e5d8ae
Binary files /dev/null and b/data/themes/default/images/icon_folder_selected.png differ
diff --git a/data/themes/default/images/info_rightbottom.png b/data/themes/default/images/info_rightbottom.png
new file mode 100644 (file)
index 0000000..b3e0df7
Binary files /dev/null and b/data/themes/default/images/info_rightbottom.png differ
diff --git a/data/themes/default/images/info_topleft.png b/data/themes/default/images/info_topleft.png
new file mode 100644 (file)
index 0000000..fad8c3c
Binary files /dev/null and b/data/themes/default/images/info_topleft.png differ
diff --git a/data/themes/default/images/info_window.png b/data/themes/default/images/info_window.png
new file mode 100644 (file)
index 0000000..61dc70f
Binary files /dev/null and b/data/themes/default/images/info_window.png differ
diff --git a/data/themes/default/images/inset_shadow.png b/data/themes/default/images/inset_shadow.png
new file mode 100644 (file)
index 0000000..dad255c
Binary files /dev/null and b/data/themes/default/images/inset_shadow.png differ
diff --git a/data/themes/default/images/invert.png b/data/themes/default/images/invert.png
new file mode 100644 (file)
index 0000000..67aeb33
Binary files /dev/null and b/data/themes/default/images/invert.png differ
diff --git a/data/themes/default/images/invert_clicked.png b/data/themes/default/images/invert_clicked.png
new file mode 100644 (file)
index 0000000..a7f1891
Binary files /dev/null and b/data/themes/default/images/invert_clicked.png differ
diff --git a/data/themes/default/images/invert_hover.png b/data/themes/default/images/invert_hover.png
new file mode 100644 (file)
index 0000000..805085f
Binary files /dev/null and b/data/themes/default/images/invert_hover.png differ
diff --git a/data/themes/default/images/lines.png b/data/themes/default/images/lines.png
new file mode 100644 (file)
index 0000000..fd06465
Binary files /dev/null and b/data/themes/default/images/lines.png differ
diff --git a/data/themes/default/images/lines_clicked.png b/data/themes/default/images/lines_clicked.png
new file mode 100644 (file)
index 0000000..68fa340
Binary files /dev/null and b/data/themes/default/images/lines_clicked.png differ
diff --git a/data/themes/default/images/lines_hover.png b/data/themes/default/images/lines_hover.png
new file mode 100644 (file)
index 0000000..e778d10
Binary files /dev/null and b/data/themes/default/images/lines_hover.png differ
diff --git a/data/themes/default/images/list_h_item_hovered_bg.png b/data/themes/default/images/list_h_item_hovered_bg.png
new file mode 100644 (file)
index 0000000..327e45e
Binary files /dev/null and b/data/themes/default/images/list_h_item_hovered_bg.png differ
diff --git a/data/themes/default/images/list_h_item_normal_bg.png b/data/themes/default/images/list_h_item_normal_bg.png
new file mode 100644 (file)
index 0000000..9a2cf68
Binary files /dev/null and b/data/themes/default/images/list_h_item_normal_bg.png differ
diff --git a/data/themes/default/images/list_h_item_selected_bg.png b/data/themes/default/images/list_h_item_selected_bg.png
new file mode 100644 (file)
index 0000000..68cda85
Binary files /dev/null and b/data/themes/default/images/list_h_item_selected_bg.png differ
diff --git a/data/themes/default/images/live_bg_glow_in.png b/data/themes/default/images/live_bg_glow_in.png
new file mode 100644 (file)
index 0000000..9e6afa3
Binary files /dev/null and b/data/themes/default/images/live_bg_glow_in.png differ
diff --git a/data/themes/default/images/live_bg_glow_in_24.png b/data/themes/default/images/live_bg_glow_in_24.png
new file mode 100644 (file)
index 0000000..a44220c
Binary files /dev/null and b/data/themes/default/images/live_bg_glow_in_24.png differ
diff --git a/data/themes/default/images/live_image.png b/data/themes/default/images/live_image.png
new file mode 100644 (file)
index 0000000..1419272
Binary files /dev/null and b/data/themes/default/images/live_image.png differ
diff --git a/data/themes/default/images/live_image_clicked.png b/data/themes/default/images/live_image_clicked.png
new file mode 100644 (file)
index 0000000..1a49490
Binary files /dev/null and b/data/themes/default/images/live_image_clicked.png differ
diff --git a/data/themes/default/images/live_image_hover.png b/data/themes/default/images/live_image_hover.png
new file mode 100644 (file)
index 0000000..8a69dc0
Binary files /dev/null and b/data/themes/default/images/live_image_hover.png differ
diff --git a/data/themes/default/images/live_rectangle.png b/data/themes/default/images/live_rectangle.png
new file mode 100644 (file)
index 0000000..026d57a
Binary files /dev/null and b/data/themes/default/images/live_rectangle.png differ
diff --git a/data/themes/default/images/live_rectangle_clicked.png b/data/themes/default/images/live_rectangle_clicked.png
new file mode 100644 (file)
index 0000000..f1a3e57
Binary files /dev/null and b/data/themes/default/images/live_rectangle_clicked.png differ
diff --git a/data/themes/default/images/live_rectangle_hover.png b/data/themes/default/images/live_rectangle_hover.png
new file mode 100644 (file)
index 0000000..9371bb9
Binary files /dev/null and b/data/themes/default/images/live_rectangle_hover.png differ
diff --git a/data/themes/default/images/live_spacer.png b/data/themes/default/images/live_spacer.png
new file mode 100644 (file)
index 0000000..827b667
Binary files /dev/null and b/data/themes/default/images/live_spacer.png differ
diff --git a/data/themes/default/images/live_spacer_icon.png b/data/themes/default/images/live_spacer_icon.png
new file mode 100644 (file)
index 0000000..f43403f
Binary files /dev/null and b/data/themes/default/images/live_spacer_icon.png differ
diff --git a/data/themes/default/images/live_spacer_icon_clicked.png b/data/themes/default/images/live_spacer_icon_clicked.png
new file mode 100644 (file)
index 0000000..b561402
Binary files /dev/null and b/data/themes/default/images/live_spacer_icon_clicked.png differ
diff --git a/data/themes/default/images/live_spacer_icon_hover.png b/data/themes/default/images/live_spacer_icon_hover.png
new file mode 100644 (file)
index 0000000..867df6f
Binary files /dev/null and b/data/themes/default/images/live_spacer_icon_hover.png differ
diff --git a/data/themes/default/images/live_swallow.png b/data/themes/default/images/live_swallow.png
new file mode 100644 (file)
index 0000000..00f18b9
Binary files /dev/null and b/data/themes/default/images/live_swallow.png differ
diff --git a/data/themes/default/images/live_swallow_clicked.png b/data/themes/default/images/live_swallow_clicked.png
new file mode 100644 (file)
index 0000000..00a1efb
Binary files /dev/null and b/data/themes/default/images/live_swallow_clicked.png differ
diff --git a/data/themes/default/images/live_swallow_hover.png b/data/themes/default/images/live_swallow_hover.png
new file mode 100644 (file)
index 0000000..a68dc2b
Binary files /dev/null and b/data/themes/default/images/live_swallow_hover.png differ
diff --git a/data/themes/default/images/live_text.png b/data/themes/default/images/live_text.png
new file mode 100644 (file)
index 0000000..4671584
Binary files /dev/null and b/data/themes/default/images/live_text.png differ
diff --git a/data/themes/default/images/live_text_clicked.png b/data/themes/default/images/live_text_clicked.png
new file mode 100644 (file)
index 0000000..28ac047
Binary files /dev/null and b/data/themes/default/images/live_text_clicked.png differ
diff --git a/data/themes/default/images/live_text_hover.png b/data/themes/default/images/live_text_hover.png
new file mode 100644 (file)
index 0000000..6f6f099
Binary files /dev/null and b/data/themes/default/images/live_text_hover.png differ
diff --git a/data/themes/default/images/live_textblock.png b/data/themes/default/images/live_textblock.png
new file mode 100644 (file)
index 0000000..f104f88
Binary files /dev/null and b/data/themes/default/images/live_textblock.png differ
diff --git a/data/themes/default/images/live_textblock_clicked.png b/data/themes/default/images/live_textblock_clicked.png
new file mode 100644 (file)
index 0000000..baa3a55
Binary files /dev/null and b/data/themes/default/images/live_textblock_clicked.png differ
diff --git a/data/themes/default/images/live_textblock_hover.png b/data/themes/default/images/live_textblock_hover.png
new file mode 100644 (file)
index 0000000..ab28e9c
Binary files /dev/null and b/data/themes/default/images/live_textblock_hover.png differ
diff --git a/data/themes/default/images/menu.png b/data/themes/default/images/menu.png
new file mode 100644 (file)
index 0000000..409272e
Binary files /dev/null and b/data/themes/default/images/menu.png differ
diff --git a/data/themes/default/images/mirror.png b/data/themes/default/images/mirror.png
new file mode 100644 (file)
index 0000000..e74c9e2
Binary files /dev/null and b/data/themes/default/images/mirror.png differ
diff --git a/data/themes/default/images/mirror_clicked.png b/data/themes/default/images/mirror_clicked.png
new file mode 100644 (file)
index 0000000..b6b764d
Binary files /dev/null and b/data/themes/default/images/mirror_clicked.png differ
diff --git a/data/themes/default/images/mirror_hover.png b/data/themes/default/images/mirror_hover.png
new file mode 100644 (file)
index 0000000..ae116b6
Binary files /dev/null and b/data/themes/default/images/mirror_hover.png differ
diff --git a/data/themes/default/images/navi_group.png b/data/themes/default/images/navi_group.png
new file mode 100644 (file)
index 0000000..4ef7eb4
Binary files /dev/null and b/data/themes/default/images/navi_group.png differ
diff --git a/data/themes/default/images/navi_group_selected.png b/data/themes/default/images/navi_group_selected.png
new file mode 100644 (file)
index 0000000..4ef7eb4
Binary files /dev/null and b/data/themes/default/images/navi_group_selected.png differ
diff --git a/data/themes/default/images/navi_image.png b/data/themes/default/images/navi_image.png
new file mode 100644 (file)
index 0000000..759350e
Binary files /dev/null and b/data/themes/default/images/navi_image.png differ
diff --git a/data/themes/default/images/navi_image_selected.png b/data/themes/default/images/navi_image_selected.png
new file mode 100644 (file)
index 0000000..4b5f33d
Binary files /dev/null and b/data/themes/default/images/navi_image_selected.png differ
diff --git a/data/themes/default/images/navi_play.png b/data/themes/default/images/navi_play.png
new file mode 100644 (file)
index 0000000..98ce53c
Binary files /dev/null and b/data/themes/default/images/navi_play.png differ
diff --git a/data/themes/default/images/navi_program.png b/data/themes/default/images/navi_program.png
new file mode 100644 (file)
index 0000000..10c9323
Binary files /dev/null and b/data/themes/default/images/navi_program.png differ
diff --git a/data/themes/default/images/navi_program_selected.png b/data/themes/default/images/navi_program_selected.png
new file mode 100644 (file)
index 0000000..000305a
Binary files /dev/null and b/data/themes/default/images/navi_program_selected.png differ
diff --git a/data/themes/default/images/navi_rect.png b/data/themes/default/images/navi_rect.png
new file mode 100644 (file)
index 0000000..430bbeb
Binary files /dev/null and b/data/themes/default/images/navi_rect.png differ
diff --git a/data/themes/default/images/navi_rect_selected.png b/data/themes/default/images/navi_rect_selected.png
new file mode 100644 (file)
index 0000000..f3f1158
Binary files /dev/null and b/data/themes/default/images/navi_rect_selected.png differ
diff --git a/data/themes/default/images/navi_spacer.png b/data/themes/default/images/navi_spacer.png
new file mode 100644 (file)
index 0000000..a10e57b
Binary files /dev/null and b/data/themes/default/images/navi_spacer.png differ
diff --git a/data/themes/default/images/navi_spacer_selected.png b/data/themes/default/images/navi_spacer_selected.png
new file mode 100644 (file)
index 0000000..0dff36a
Binary files /dev/null and b/data/themes/default/images/navi_spacer_selected.png differ
diff --git a/data/themes/default/images/navi_state.png b/data/themes/default/images/navi_state.png
new file mode 100644 (file)
index 0000000..708ae05
Binary files /dev/null and b/data/themes/default/images/navi_state.png differ
diff --git a/data/themes/default/images/navi_state_selected.png b/data/themes/default/images/navi_state_selected.png
new file mode 100644 (file)
index 0000000..0c74c65
Binary files /dev/null and b/data/themes/default/images/navi_state_selected.png differ
diff --git a/data/themes/default/images/navi_stop.png b/data/themes/default/images/navi_stop.png
new file mode 100644 (file)
index 0000000..6ef754b
Binary files /dev/null and b/data/themes/default/images/navi_stop.png differ
diff --git a/data/themes/default/images/navi_swallow.png b/data/themes/default/images/navi_swallow.png
new file mode 100644 (file)
index 0000000..34e6282
Binary files /dev/null and b/data/themes/default/images/navi_swallow.png differ
diff --git a/data/themes/default/images/navi_swallow_selected.png b/data/themes/default/images/navi_swallow_selected.png
new file mode 100644 (file)
index 0000000..8d8a110
Binary files /dev/null and b/data/themes/default/images/navi_swallow_selected.png differ
diff --git a/data/themes/default/images/navi_text.png b/data/themes/default/images/navi_text.png
new file mode 100644 (file)
index 0000000..96bb5ee
Binary files /dev/null and b/data/themes/default/images/navi_text.png differ
diff --git a/data/themes/default/images/navi_text_selected.png b/data/themes/default/images/navi_text_selected.png
new file mode 100644 (file)
index 0000000..cb0d41a
Binary files /dev/null and b/data/themes/default/images/navi_text_selected.png differ
diff --git a/data/themes/default/images/navi_textblock.png b/data/themes/default/images/navi_textblock.png
new file mode 100644 (file)
index 0000000..a51d62d
Binary files /dev/null and b/data/themes/default/images/navi_textblock.png differ
diff --git a/data/themes/default/images/navi_textblock_selected.png b/data/themes/default/images/navi_textblock_selected.png
new file mode 100644 (file)
index 0000000..00db19b
Binary files /dev/null and b/data/themes/default/images/navi_textblock_selected.png differ
diff --git a/data/themes/default/images/navi_unknown.png b/data/themes/default/images/navi_unknown.png
new file mode 100644 (file)
index 0000000..3ec3a23
Binary files /dev/null and b/data/themes/default/images/navi_unknown.png differ
diff --git a/data/themes/default/images/navi_unknown_selected.png b/data/themes/default/images/navi_unknown_selected.png
new file mode 100644 (file)
index 0000000..3ec3a23
Binary files /dev/null and b/data/themes/default/images/navi_unknown_selected.png differ
diff --git a/data/themes/default/images/part_highlight.png b/data/themes/default/images/part_highlight.png
new file mode 100644 (file)
index 0000000..1fe2916
Binary files /dev/null and b/data/themes/default/images/part_highlight.png differ
diff --git a/data/themes/default/images/popup_shadow.png b/data/themes/default/images/popup_shadow.png
new file mode 100644 (file)
index 0000000..56a420f
Binary files /dev/null and b/data/themes/default/images/popup_shadow.png differ
diff --git a/data/themes/default/images/preview_bg.png b/data/themes/default/images/preview_bg.png
new file mode 100644 (file)
index 0000000..e6d0d00
Binary files /dev/null and b/data/themes/default/images/preview_bg.png differ
diff --git a/data/themes/default/images/preview_image.png b/data/themes/default/images/preview_image.png
new file mode 100644 (file)
index 0000000..70c4b36
Binary files /dev/null and b/data/themes/default/images/preview_image.png differ
diff --git a/data/themes/default/images/preview_swallow.png b/data/themes/default/images/preview_swallow.png
new file mode 100644 (file)
index 0000000..15e6efd
Binary files /dev/null and b/data/themes/default/images/preview_swallow.png differ
diff --git a/data/themes/default/images/redo.png b/data/themes/default/images/redo.png
new file mode 100644 (file)
index 0000000..f9a9b20
Binary files /dev/null and b/data/themes/default/images/redo.png differ
diff --git a/data/themes/default/images/redo_clicked.png b/data/themes/default/images/redo_clicked.png
new file mode 100644 (file)
index 0000000..fc90b3d
Binary files /dev/null and b/data/themes/default/images/redo_clicked.png differ
diff --git a/data/themes/default/images/redo_hover.png b/data/themes/default/images/redo_hover.png
new file mode 100644 (file)
index 0000000..a723ba0
Binary files /dev/null and b/data/themes/default/images/redo_hover.png differ
diff --git a/data/themes/default/images/refresh.png b/data/themes/default/images/refresh.png
new file mode 100644 (file)
index 0000000..bdc0d2b
Binary files /dev/null and b/data/themes/default/images/refresh.png differ
diff --git a/data/themes/default/images/refresh_clicked.png b/data/themes/default/images/refresh_clicked.png
new file mode 100644 (file)
index 0000000..d92ea79
Binary files /dev/null and b/data/themes/default/images/refresh_clicked.png differ
diff --git a/data/themes/default/images/refresh_hover.png b/data/themes/default/images/refresh_hover.png
new file mode 100644 (file)
index 0000000..d2109f4
Binary files /dev/null and b/data/themes/default/images/refresh_hover.png differ
diff --git a/data/themes/default/images/runner_glow_horiz.png b/data/themes/default/images/runner_glow_horiz.png
new file mode 100644 (file)
index 0000000..ff63301
Binary files /dev/null and b/data/themes/default/images/runner_glow_horiz.png differ
diff --git a/data/themes/default/images/runner_glow_vert.png b/data/themes/default/images/runner_glow_vert.png
new file mode 100644 (file)
index 0000000..ddc47c7
Binary files /dev/null and b/data/themes/default/images/runner_glow_vert.png differ
diff --git a/data/themes/default/images/runner_horiz.png b/data/themes/default/images/runner_horiz.png
new file mode 100644 (file)
index 0000000..bf9b388
Binary files /dev/null and b/data/themes/default/images/runner_horiz.png differ
diff --git a/data/themes/default/images/runner_vert.png b/data/themes/default/images/runner_vert.png
new file mode 100644 (file)
index 0000000..1db8e6c
Binary files /dev/null and b/data/themes/default/images/runner_vert.png differ
diff --git a/data/themes/default/images/save.png b/data/themes/default/images/save.png
new file mode 100644 (file)
index 0000000..a1d790d
Binary files /dev/null and b/data/themes/default/images/save.png differ
diff --git a/data/themes/default/images/save_clicked.png b/data/themes/default/images/save_clicked.png
new file mode 100644 (file)
index 0000000..6a49f4a
Binary files /dev/null and b/data/themes/default/images/save_clicked.png differ
diff --git a/data/themes/default/images/save_hover.png b/data/themes/default/images/save_hover.png
new file mode 100644 (file)
index 0000000..8f96736
Binary files /dev/null and b/data/themes/default/images/save_hover.png differ
diff --git a/data/themes/default/images/setting.png b/data/themes/default/images/setting.png
new file mode 100644 (file)
index 0000000..aa3c664
Binary files /dev/null and b/data/themes/default/images/setting.png differ
diff --git a/data/themes/default/images/setting_clicked.png b/data/themes/default/images/setting_clicked.png
new file mode 100644 (file)
index 0000000..7908626
Binary files /dev/null and b/data/themes/default/images/setting_clicked.png differ
diff --git a/data/themes/default/images/setting_hover.png b/data/themes/default/images/setting_hover.png
new file mode 100644 (file)
index 0000000..2117f3e
Binary files /dev/null and b/data/themes/default/images/setting_hover.png differ
diff --git a/data/themes/default/images/setting_icon.png b/data/themes/default/images/setting_icon.png
new file mode 100644 (file)
index 0000000..1320fd5
Binary files /dev/null and b/data/themes/default/images/setting_icon.png differ
diff --git a/data/themes/default/images/setting_icon_data.png b/data/themes/default/images/setting_icon_data.png
new file mode 100644 (file)
index 0000000..6a977f1
Binary files /dev/null and b/data/themes/default/images/setting_icon_data.png differ
diff --git a/data/themes/default/images/setting_icon_font.png b/data/themes/default/images/setting_icon_font.png
new file mode 100644 (file)
index 0000000..646fe73
Binary files /dev/null and b/data/themes/default/images/setting_icon_font.png differ
diff --git a/data/themes/default/images/setting_icon_img.png b/data/themes/default/images/setting_icon_img.png
new file mode 100644 (file)
index 0000000..218af84
Binary files /dev/null and b/data/themes/default/images/setting_icon_img.png differ
diff --git a/data/themes/default/images/setting_icon_sound.png b/data/themes/default/images/setting_icon_sound.png
new file mode 100644 (file)
index 0000000..39f4842
Binary files /dev/null and b/data/themes/default/images/setting_icon_sound.png differ
diff --git a/data/themes/default/images/shadow_rounded_vert.png b/data/themes/default/images/shadow_rounded_vert.png
new file mode 100644 (file)
index 0000000..10a751a
Binary files /dev/null and b/data/themes/default/images/shadow_rounded_vert.png differ
diff --git a/data/themes/default/images/shadow_square_tiny.png b/data/themes/default/images/shadow_square_tiny.png
new file mode 100644 (file)
index 0000000..7a180f3
Binary files /dev/null and b/data/themes/default/images/shadow_square_tiny.png differ
diff --git a/data/themes/default/images/sizebox_icon.png b/data/themes/default/images/sizebox_icon.png
new file mode 100644 (file)
index 0000000..22910a6
Binary files /dev/null and b/data/themes/default/images/sizebox_icon.png differ
diff --git a/data/themes/default/images/slider_down.png b/data/themes/default/images/slider_down.png
new file mode 100644 (file)
index 0000000..30f398a
Binary files /dev/null and b/data/themes/default/images/slider_down.png differ
diff --git a/data/themes/default/images/slider_minus.png b/data/themes/default/images/slider_minus.png
new file mode 100644 (file)
index 0000000..6baf21b
Binary files /dev/null and b/data/themes/default/images/slider_minus.png differ
diff --git a/data/themes/default/images/slider_minus_hover.png b/data/themes/default/images/slider_minus_hover.png
new file mode 100644 (file)
index 0000000..0dbb946
Binary files /dev/null and b/data/themes/default/images/slider_minus_hover.png differ
diff --git a/data/themes/default/images/slider_minus_push.png b/data/themes/default/images/slider_minus_push.png
new file mode 100644 (file)
index 0000000..909d2f2
Binary files /dev/null and b/data/themes/default/images/slider_minus_push.png differ
diff --git a/data/themes/default/images/slider_plus.png b/data/themes/default/images/slider_plus.png
new file mode 100644 (file)
index 0000000..91c4e0d
Binary files /dev/null and b/data/themes/default/images/slider_plus.png differ
diff --git a/data/themes/default/images/slider_plus_hover.png b/data/themes/default/images/slider_plus_hover.png
new file mode 100644 (file)
index 0000000..adc26ed
Binary files /dev/null and b/data/themes/default/images/slider_plus_hover.png differ
diff --git a/data/themes/default/images/slider_plus_push.png b/data/themes/default/images/slider_plus_push.png
new file mode 100644 (file)
index 0000000..6dd65fc
Binary files /dev/null and b/data/themes/default/images/slider_plus_push.png differ
diff --git a/data/themes/default/images/slider_up.png b/data/themes/default/images/slider_up.png
new file mode 100644 (file)
index 0000000..3eac5de
Binary files /dev/null and b/data/themes/default/images/slider_up.png differ
diff --git a/data/themes/default/images/status.png b/data/themes/default/images/status.png
new file mode 100644 (file)
index 0000000..503b62c
Binary files /dev/null and b/data/themes/default/images/status.png differ
diff --git a/data/themes/default/images/status_bg.png b/data/themes/default/images/status_bg.png
new file mode 100644 (file)
index 0000000..68c27ac
Binary files /dev/null and b/data/themes/default/images/status_bg.png differ
diff --git a/data/themes/default/images/status_clicked.png b/data/themes/default/images/status_clicked.png
new file mode 100644 (file)
index 0000000..8860da5
Binary files /dev/null and b/data/themes/default/images/status_clicked.png differ
diff --git a/data/themes/default/images/status_hover.png b/data/themes/default/images/status_hover.png
new file mode 100644 (file)
index 0000000..494794a
Binary files /dev/null and b/data/themes/default/images/status_hover.png differ
diff --git a/data/themes/default/images/swallow.png b/data/themes/default/images/swallow.png
new file mode 100644 (file)
index 0000000..dde144c
Binary files /dev/null and b/data/themes/default/images/swallow.png differ
diff --git a/data/themes/default/images/sym_down_glow_normal.png b/data/themes/default/images/sym_down_glow_normal.png
new file mode 100644 (file)
index 0000000..2ec0f1e
Binary files /dev/null and b/data/themes/default/images/sym_down_glow_normal.png differ
diff --git a/data/themes/default/images/sym_down_light_normal.png b/data/themes/default/images/sym_down_light_normal.png
new file mode 100644 (file)
index 0000000..9b6f259
Binary files /dev/null and b/data/themes/default/images/sym_down_light_normal.png differ
diff --git a/data/themes/default/images/sym_left_glow_normal.png b/data/themes/default/images/sym_left_glow_normal.png
new file mode 100644 (file)
index 0000000..c2446a7
Binary files /dev/null and b/data/themes/default/images/sym_left_glow_normal.png differ
diff --git a/data/themes/default/images/sym_left_light_normal.png b/data/themes/default/images/sym_left_light_normal.png
new file mode 100644 (file)
index 0000000..f8a2a46
Binary files /dev/null and b/data/themes/default/images/sym_left_light_normal.png differ
diff --git a/data/themes/default/images/sym_right_glow_normal.png b/data/themes/default/images/sym_right_glow_normal.png
new file mode 100644 (file)
index 0000000..3010393
Binary files /dev/null and b/data/themes/default/images/sym_right_glow_normal.png differ
diff --git a/data/themes/default/images/sym_right_light_normal.png b/data/themes/default/images/sym_right_light_normal.png
new file mode 100644 (file)
index 0000000..2caf1dd
Binary files /dev/null and b/data/themes/default/images/sym_right_light_normal.png differ
diff --git a/data/themes/default/images/sym_up_glow_normal.png b/data/themes/default/images/sym_up_glow_normal.png
new file mode 100644 (file)
index 0000000..2df4220
Binary files /dev/null and b/data/themes/default/images/sym_up_glow_normal.png differ
diff --git a/data/themes/default/images/sym_up_light_normal.png b/data/themes/default/images/sym_up_light_normal.png
new file mode 100644 (file)
index 0000000..8ac150c
Binary files /dev/null and b/data/themes/default/images/sym_up_light_normal.png differ
diff --git a/data/themes/default/images/template.png b/data/themes/default/images/template.png
new file mode 100644 (file)
index 0000000..6e3a6e0
Binary files /dev/null and b/data/themes/default/images/template.png differ
diff --git a/data/themes/default/images/template_clicked.png b/data/themes/default/images/template_clicked.png
new file mode 100644 (file)
index 0000000..d189559
Binary files /dev/null and b/data/themes/default/images/template_clicked.png differ
diff --git a/data/themes/default/images/template_hover.png b/data/themes/default/images/template_hover.png
new file mode 100644 (file)
index 0000000..28244df
Binary files /dev/null and b/data/themes/default/images/template_hover.png differ
diff --git a/data/themes/default/images/text_color_01.png b/data/themes/default/images/text_color_01.png
new file mode 100644 (file)
index 0000000..341dae2
Binary files /dev/null and b/data/themes/default/images/text_color_01.png differ
diff --git a/data/themes/default/images/text_color_02.png b/data/themes/default/images/text_color_02.png
new file mode 100644 (file)
index 0000000..a5ffcd5
Binary files /dev/null and b/data/themes/default/images/text_color_02.png differ
diff --git a/data/themes/default/images/text_color_03.png b/data/themes/default/images/text_color_03.png
new file mode 100644 (file)
index 0000000..9ea434e
Binary files /dev/null and b/data/themes/default/images/text_color_03.png differ
diff --git a/data/themes/default/images/tool_percent_nor.png b/data/themes/default/images/tool_percent_nor.png
new file mode 100644 (file)
index 0000000..595c833
Binary files /dev/null and b/data/themes/default/images/tool_percent_nor.png differ
diff --git a/data/themes/default/images/tool_zoom_in_mv.png b/data/themes/default/images/tool_zoom_in_mv.png
new file mode 100644 (file)
index 0000000..5df14da
Binary files /dev/null and b/data/themes/default/images/tool_zoom_in_mv.png differ
diff --git a/data/themes/default/images/tool_zoom_in_nor.png b/data/themes/default/images/tool_zoom_in_nor.png
new file mode 100644 (file)
index 0000000..fb6f65f
Binary files /dev/null and b/data/themes/default/images/tool_zoom_in_nor.png differ
diff --git a/data/themes/default/images/tool_zoom_out_mv.png b/data/themes/default/images/tool_zoom_out_mv.png
new file mode 100644 (file)
index 0000000..8061cc3
Binary files /dev/null and b/data/themes/default/images/tool_zoom_out_mv.png differ
diff --git a/data/themes/default/images/tool_zoom_out_nor.png b/data/themes/default/images/tool_zoom_out_nor.png
new file mode 100644 (file)
index 0000000..b5eee0b
Binary files /dev/null and b/data/themes/default/images/tool_zoom_out_nor.png differ
diff --git a/data/themes/default/images/undo.png b/data/themes/default/images/undo.png
new file mode 100644 (file)
index 0000000..cd325d1
Binary files /dev/null and b/data/themes/default/images/undo.png differ
diff --git a/data/themes/default/images/undo_clicked.png b/data/themes/default/images/undo_clicked.png
new file mode 100644 (file)
index 0000000..beb8d20
Binary files /dev/null and b/data/themes/default/images/undo_clicked.png differ
diff --git a/data/themes/default/images/undo_hover.png b/data/themes/default/images/undo_hover.png
new file mode 100644 (file)
index 0000000..ba4fb1a
Binary files /dev/null and b/data/themes/default/images/undo_hover.png differ
diff --git a/data/themes/default/images/vgrad_med_lighter.png b/data/themes/default/images/vgrad_med_lighter.png
new file mode 100644 (file)
index 0000000..54d215e
Binary files /dev/null and b/data/themes/default/images/vgrad_med_lighter.png differ
diff --git a/data/themes/default/images/warning_icon.png b/data/themes/default/images/warning_icon.png
new file mode 100644 (file)
index 0000000..ffb4011
Binary files /dev/null and b/data/themes/default/images/warning_icon.png differ
diff --git a/data/themes/default/images/white_bar_vert_glow.png b/data/themes/default/images/white_bar_vert_glow.png
new file mode 100644 (file)
index 0000000..49c6735
Binary files /dev/null and b/data/themes/default/images/white_bar_vert_glow.png differ
diff --git a/data/themes/default/images/window_none_title_bg.png b/data/themes/default/images/window_none_title_bg.png
new file mode 100644 (file)
index 0000000..68557a2
Binary files /dev/null and b/data/themes/default/images/window_none_title_bg.png differ
diff --git a/data/themes/default/images/window_scale_controller.png b/data/themes/default/images/window_scale_controller.png
new file mode 100644 (file)
index 0000000..fbf2b1b
Binary files /dev/null and b/data/themes/default/images/window_scale_controller.png differ
diff --git a/data/themes/default/images/window_scale_controller_bottom.png b/data/themes/default/images/window_scale_controller_bottom.png
new file mode 100644 (file)
index 0000000..5a6554d
Binary files /dev/null and b/data/themes/default/images/window_scale_controller_bottom.png differ
diff --git a/data/themes/default/images/window_scale_controller_bottom_hover.png b/data/themes/default/images/window_scale_controller_bottom_hover.png
new file mode 100644 (file)
index 0000000..5a6554d
Binary files /dev/null and b/data/themes/default/images/window_scale_controller_bottom_hover.png differ
diff --git a/data/themes/default/images/window_scale_controller_bottom_push.png b/data/themes/default/images/window_scale_controller_bottom_push.png
new file mode 100644 (file)
index 0000000..5a6554d
Binary files /dev/null and b/data/themes/default/images/window_scale_controller_bottom_push.png differ
diff --git a/data/themes/default/images/window_scale_controller_hover.png b/data/themes/default/images/window_scale_controller_hover.png
new file mode 100644 (file)
index 0000000..fbf2b1b
Binary files /dev/null and b/data/themes/default/images/window_scale_controller_hover.png differ
diff --git a/data/themes/default/images/window_scale_controller_push.png b/data/themes/default/images/window_scale_controller_push.png
new file mode 100644 (file)
index 0000000..fbf2b1b
Binary files /dev/null and b/data/themes/default/images/window_scale_controller_push.png differ
diff --git a/data/themes/default/images/window_scale_controller_top.png b/data/themes/default/images/window_scale_controller_top.png
new file mode 100644 (file)
index 0000000..da961ff
Binary files /dev/null and b/data/themes/default/images/window_scale_controller_top.png differ
diff --git a/data/themes/default/images/window_scale_controller_top_hover.png b/data/themes/default/images/window_scale_controller_top_hover.png
new file mode 100644 (file)
index 0000000..da961ff
Binary files /dev/null and b/data/themes/default/images/window_scale_controller_top_hover.png differ
diff --git a/data/themes/default/images/window_scale_controller_top_push.png b/data/themes/default/images/window_scale_controller_top_push.png
new file mode 100644 (file)
index 0000000..da961ff
Binary files /dev/null and b/data/themes/default/images/window_scale_controller_top_push.png differ
diff --git a/data/themes/default/images/window_title_bg.png b/data/themes/default/images/window_title_bg.png
new file mode 100644 (file)
index 0000000..d5b0618
Binary files /dev/null and b/data/themes/default/images/window_title_bg.png differ
diff --git a/data/themes/default/images/wireframes.png b/data/themes/default/images/wireframes.png
new file mode 100644 (file)
index 0000000..a4231ae
Binary files /dev/null and b/data/themes/default/images/wireframes.png differ
diff --git a/data/themes/default/images/wireframes_icon.png b/data/themes/default/images/wireframes_icon.png
new file mode 100644 (file)
index 0000000..c32918e
Binary files /dev/null and b/data/themes/default/images/wireframes_icon.png differ
diff --git a/data/themes/default/images/wireframes_icon_clicked.png b/data/themes/default/images/wireframes_icon_clicked.png
new file mode 100644 (file)
index 0000000..5c99a05
Binary files /dev/null and b/data/themes/default/images/wireframes_icon_clicked.png differ
diff --git a/data/themes/default/images/wireframes_icon_hover.png b/data/themes/default/images/wireframes_icon_hover.png
new file mode 100644 (file)
index 0000000..be22a26
Binary files /dev/null and b/data/themes/default/images/wireframes_icon_hover.png differ
diff --git a/data/themes/default/layout_common.edc b/data/themes/default/layout_common.edc
new file mode 100644 (file)
index 0000000..95dd5fb
--- /dev/null
@@ -0,0 +1,3511 @@
+images {
+   image: "warning_icon.png" COMP;
+   image: "disabler.png" COMP;
+   image: "bevel_out.png" COMP;
+   image: "full_logo.png" COMP;
+   image: "cursor_arrow.png" COMP;
+   image: "navi_group.png" COMP;
+   image: "preview_bg.png" COMP;
+   image: "help_bg.png" COMP;
+   image: "popup_shadow" COMP;
+   image: "tool_percent_nor.png" COMP;
+   image: "window_title_bg.png" COMP;
+   image: "edceditor_icon.png" COMP;
+}
+
+styles {
+   style { "entry_statusbar_style";
+        base: "font="FN" font_size=11 text_class=entry color=#333333 valign=0.5 ellipsis=1.0 wrap=none";
+   }
+}
+
+group { "newfile_layout";
+   parts {
+      rect { "clipper";
+         desc { "default";
+            fixed: 1 1;
+            color: 127 127 127 127;
+         }
+         desc { "show";
+            inherit: "default";
+            color: 255 255 255 255;
+         }
+      }
+      image { "shadow";
+         scale: 1;
+         desc {
+            rel1.to: "bg";
+            rel2.to: "bg";
+            rel1.offset: -10 -10;
+            rel2.offset: 9 9;
+            image.normal: "popup_shadow.png";
+            image.border: 20 20 20 20;
+         }
+      }
+      rect { "bg";
+         clip_to: "clipper";
+         desc { "default";
+            min: 600 432;
+            max: 600 432;
+            color: 244 244 244 255;
+         }
+      }
+      spacer { "base_frame";
+         desc { "default";
+            rel1 {
+               to: "bg";
+            }
+            rel2 {
+               relative: 1.0 0.0;
+               to_x: "bg";
+               to_y: "btn_area_up_line";
+            }
+         }
+      }
+      rect { "title_frame";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 30;
+            max: -1 30;
+            color: 255 255 255 255;
+            rel1.to: "bg";
+            rel2.to: "bg";
+         }
+      }
+      rect { "title_bottom_line";
+         scale: 1;
+         desc { "default";
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 1;
+            rel1.to: "title_frame";
+            rel2.to: "title_frame";
+            rel1.relative: 0.0 1.0;
+            color: 173 173 173 255;
+         }
+      }
+      image { "title_icon";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 16 16;
+            max: 16 16;
+            rel1 {
+               offset: 10 0;
+               to: "title_frame";
+            }
+            rel2.to: "title_frame";
+            image.normal: "edceditor_icon.png";
+         }
+      }
+      text { "elm.text.title";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            fixed: 1 1;
+            color: 51 51 51 255;
+            rel1.to_x: "title_icon";
+            rel1.to_y: "title_frame";
+            rel1.relative: 1.0 0.0;
+            rel2.to: "title_frame";
+            rel1.offset: 10 0;
+            text {
+               font: FN;
+               size: 13;
+               min: 1 0;
+               align: 0.0 0.5;
+               ellipsis: -1;
+            }
+         }
+      }
+      swallow { "elm.swallow.content";
+         type: SWALLOW;
+         clip_to: "clipper";
+         desc { "default";
+            rel1.to: "title_bottom_line";
+            rel1.relative: 0.0 1.0;
+            rel2.to: "base_frame";
+         }
+      }
+      rect { "btn_area_bg";
+         scale: 1;
+         desc { "default";
+            align: 0.5 1.0;
+            fixed: 0 1;
+            min: 0 60;
+            max: -1 60;
+            rel1.to: "bg";
+            rel1.relative: 0.0 1.0;
+            rel2.to: "bg";
+            color: 255 255 255 255;
+         }
+      }
+      rect { "btn_area_up_line";
+         scale: 1;
+         desc { "default";
+            align: 0.5 1.0;
+            fixed: 0 1;
+            min: 0 1;
+            rel1.to: "btn_area_bg";
+            rel2.to: "btn_area_bg";
+            rel2.relative: 1.0 0.0;
+            color: 173 173 173 255;
+         }
+      }
+      swallow { "elm.swallow.cancel_btn";
+         type: SWALLOW;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 86 24;
+            max: 86 24;
+            rel1.to: "elm.swallow.ok_btn";
+            rel2 {
+               relative: 0.0 1.0;
+               offset: -9 -1;
+               to: "elm.swallow.ok_btn";
+            }
+         }
+      }
+      swallow { "elm.swallow.ok_btn";
+         scale: 1;
+         desc { "default";
+            align: 1.0 1.0;
+            min: 86 24;
+            max: 86 24;
+            fixed: 1 1;
+            rel1.to: "right_bottom_padding";
+            rel2 {
+               relative: 0.0 0.0;
+               to: "right_bottom_padding";
+            }
+         }
+      }
+      spacer { "right_bottom_padding";
+         desc { "default";
+            align: 1.0 1.0;
+            fixed: 1 1;
+            min: 20 18;
+            max: 20 18;
+            rel1 {
+               to: "bg";
+               relative: 1.0 1.0;
+            }
+            rel2.to: "bg";
+         }
+      }
+      rect { "event_blocker";
+         desc { "default";
+            color: 0 0 0 0;
+         }
+         desc { "hide" 0.0;
+            visible: 0;
+         }
+      }
+   }
+   programs {
+      program { "load";
+         signal: "load";
+         action: STATE_SET "show" 0.00;
+         transition: DECELERATE 0.50000;
+         target: "clipper";
+         after: "event_blocker_hide";
+      }
+      program { "dismiss";
+         signal: "elm,state,dismiss";
+         source: "";
+         action: STATE_SET "default";
+         target: "clipper";
+         target: "event_blocker";
+         after: "dismiss_done";
+      }
+      program { "event_blocker_hide";
+         signal: "elm,state,event_blocker,hide";
+         source: "";
+         action: STATE_SET "hide" 0.00;
+         target: "event_blocker";
+      }
+      program { "dismiss_done";
+         action: SIGNAL_EMIT "elm,state,dismiss,done" "";
+      }
+   }
+}
+
+group { "warning_layout";
+   parts {
+      rect { "clipper";
+         desc { "default";
+            color: 127 127 127 127;
+         }
+         desc {"show";
+            color: 255 255 255 255;
+         }
+      }
+      rect { "bg";
+         clip_to: "clipper";
+         desc { "default";
+            color: 0 0 0 204;
+         }
+      }
+      image { "base_frame_img";
+         scale: 1;
+         clip_to: "clipper";
+         desc {
+            min: 309 129;
+            max: 309 129;
+            fixed: 1 1;
+            image.normal: "window_title_bg.png";
+            image.border: 3 3 30 3;
+            image.border_scale: 1;
+         }
+      }
+      spacer { "base_frame";
+         desc {
+            rel1 { to: "base_frame_img"; }
+            rel2 { to: "base_frame_img"; }
+         }
+      }
+      spacer { "title_bg";
+         scale: 1;
+         desc {
+            rel1.to: "base_frame";
+            rel2.to: "base_frame";
+            rel2.relative: 1 0;
+            align: 0.5 0;
+            min: 0 30;
+            fixed: 0 1;
+         }
+      }
+      image { "warning_img";
+         clip_to: "clipper";
+         desc {
+            min: 16 16;
+            max: 16 16;
+            fixed: 1 1;
+            align: 0 0;
+            rel1.to: "title_bg";
+            rel2.to: "title_bg";
+            rel2.relative: 0 0;
+            rel1.offset: 6 7;
+            rel2.offset: 5 6;
+            image.normal: "warning_icon.png";
+         }
+      }
+      text { "elm.text.title";
+         clip_to: "clipper";
+         scale: 1;
+         desc {
+            rel1.to: "title_bg";
+            rel2.to: "title_bg";
+            text {
+               font: FN;
+               size: 13;
+               align: 0.5 0.5;
+               min: 1 1;
+               ellipsis: -1;
+               text: "EDC has been changed";
+            }
+            fixed: 1 1;
+            align: 0.5 0.5;
+         }
+      }
+      spacer { "desc_padding_t";
+         scale: 1;
+         desc {
+            rel1 { to: "title_bg"; relative: 0 1; }
+            rel2 { to: "title_bg"; relative: 1 1; }
+            min: 0 13;
+            align: 0.5 0;
+            fixed: 0 1;
+         }
+      }
+      text { "elm.text.desc";
+         clip_to: "clipper";
+         scale: 1;
+         desc {
+            rel1 { to: "desc_padding_t"; relative: 0 1; }
+            rel2 { to: "desc_padding_t"; relative: 1 1; }
+            text {
+               font: FN;
+               size: 13;
+               align: 0.5 0;
+               min: 1 1;
+               ellipsis: -1;
+            }
+            align: 0.5 0;
+            fixed: 1 1;
+            color: COL_NM;
+         }
+      }
+      text { "elm.text.question";
+         clip_to: "clipper";
+         scale: 1;
+         desc {
+            rel1 { to: "elm.text.desc"; relative: 0.5 1; }
+            rel2 { to: "elm.text.desc"; relative: 0.5 1; }
+            text {
+               font: FN;
+               size: 13;
+               align: 0.5 0;
+               min: 1 1;
+               ellipsis: -1;
+            }
+            align: 0.5 0;
+            fixed: 1 1;
+            color: COL_NM;
+         }
+      }
+      swallow { "elm.swallow.btn1";
+         clip_to: "clipper";
+         scale: 1;
+         desc {
+            rel1.to: "elm.swallow.btn2";
+            rel2.to: "elm.swallow.btn2";
+            rel1.relative: 0 0;
+            rel2.relative: 0 1;
+            rel1.offset: -8 0;
+            rel2.offset: -9 -1;
+            min: 72 25;
+            align: 1 0.5;
+            fixed: 1 1;
+         }
+      }
+      swallow { "elm.swallow.btn2";
+         clip_to: "clipper";
+         scale: 1;
+         desc {
+            rel1.to: "base_frame";
+            rel2.to: "base_frame";
+            rel1.relative: 0.5 1;
+            rel2.relative: 0.5 1;
+            rel1.offset: 0 -8;
+            rel2.offset: -1 -9;
+            min: 72 26;
+            align: 0.5 1;
+            fixed: 1 1;
+         }
+      }
+      swallow { "elm.swallow.btn3";
+         clip_to: "clipper";
+         scale: 1;
+         desc {
+            rel1.to: "elm.swallow.btn2";
+            rel2.to: "elm.swallow.btn2";
+            rel1.relative: 1 0;
+            rel2.relative: 1 1;
+            rel1.offset: 8 0;
+            rel2.offset: 7 -1;
+            min: 72 25;
+            align: 0 0.5;
+            fixed: 1 1;
+         }
+      }
+      rect { "event_blocker";
+         desc { "default";
+            color: 0 0 0 0;
+            visible: 1;
+         }
+         desc { "hide";
+            inherit: "default";
+            visible: 0;
+         }
+      }
+   }
+   programs {
+      program { "load";
+         signal: "load";
+         action: STATE_SET "show";
+         transition: "DECELERATE" 0.25;
+         target: "clipper";
+         after: "event_blocker_hide";
+      }
+      program { "dismiss";
+         signal: "elm,state,dismiss";
+         source: "";
+         action: STATE_SET "default";
+         transition: "DECELERATE" 0.125;
+         target: "clipper";
+         target: "event_blocker";
+         after: "dismiss_done";
+      }
+      program { "event_blocker_hide";
+         signal: "elm,state,event_blocker,hide";
+         source: "";
+         action: STATE_SET "hide";
+         target: "event_blocker";
+      }
+      program { "dismiss_done";
+         action: SIGNAL_EMIT "elm,state,dismiss,done" "";
+      }
+   }
+}
+
+group { "goto_layout";
+   parts {
+      spacer { "base";
+         scale: 1;
+         desc { "default";
+            min: 510 160;
+         }
+      }
+      rect { "bg";
+         desc { "default";
+            color: 244 244 244 255;
+            rel1.to: "base";
+            rel2.to: "base";
+         }
+      }
+      rect { "bg_up_line";
+         scale: 1;
+         desc { "default";
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 1;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            rel2.relative: 1.0 0.0;
+            color: 173 173 173 255;
+         }
+      }
+      spacer { "left_top_padding";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.0;
+            fixed: 1 1;
+            min: 20 35;
+            rel2.relative: 0.0 0.0;
+         }
+      }
+      text { "elm.text.goto";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.0;
+            fixed: 1 1;
+            min: 154 24;
+            color: 41 41 41 255;
+            rel1 {
+               relative: 1.0 1.0;
+               to: "left_top_padding";
+            }
+            rel2.to: "left_top_padding";
+            text {
+               font: FN;
+               size: 13;
+               align: 0.0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+            }
+         }
+      }
+      swallow { "elm.swallow.entry";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               relative: 1.0 0.0;
+               offset: 7 0;
+               to: "elm.text.goto";
+            }
+            rel2 {
+               offset: -19 -1;
+               to_y: "elm.text.goto";
+            }
+         }
+      }
+      rect { "btn_area_bg";
+         scale: 1;
+         desc { "default";
+            fixed: 1 1;
+            rel1.to_y: "elm.text.goto";
+            rel1.relative: 0.0 1.0;
+            rel1.offset: 0 35;
+            color: 255 255 255 255;
+         }
+      }
+      rect { "btn_area_up_line";
+         scale: 1;
+         desc { "default";
+            align: 0.5 1.0;
+            fixed: 0 1;
+            min: 0 1;
+            rel1.to: "btn_area_bg";
+            rel2.to: "btn_area_bg";
+            rel2.relative: 1.0 0.0;
+            color: 173 173 173 255;
+         }
+      }
+      text { "elm.text.msg";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.0;
+            fixed: 1 1;
+            min: 180 30;
+            color: 0 103 244 255;
+            rel1 {
+               to_x: "elm.text.goto";
+               to_y: "elm.swallow.btn";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               to_x: "elm.text.goto";
+               to_y: "elm.swallow.btn";
+            }
+            text {
+               font: FN;
+               size: 13;
+               align: 0.0 0.5;
+            }
+         }
+      }
+      swallow { "elm.swallow.btn";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.0;
+            fixed: 1 1;
+            min: 86 24;
+            max: 86 24;
+            rel1 {
+               relative: 1.0 1.0;
+               offset: 0 55;
+               to_y: "elm.text.goto";
+            }
+            rel2 {
+               relative: 1.0 0.0;
+               to_x: "elm.swallow.entry";
+            }
+         }
+      }
+   }
+}
+
+group { "search_layout";
+   parts {
+      spacer { "base";
+         scale: 1;
+         desc { "default";
+            min: 510 160;
+         }
+      }
+      rect { "bg";
+         desc { "default";
+            color: 244 244 244 255;
+            rel1.to: "base";
+            rel2.to: "base";
+         }
+      }
+      rect { "bg_up_line";
+         scale: 1;
+         desc { "default";
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 1;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            rel2.relative: 1.0 0.0;
+            color: 173 173 173 255;
+         }
+      }
+      spacer { "left_top_padding";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.0;
+            fixed: 1 1;
+            min: 20 20;
+            rel2.relative: 0.0 0.0;
+         }
+      }
+      text { "elm.text.find";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.0;
+            fixed: 1 1;
+            min: 90 24;
+            max: 90 24;
+            color: 51 51 51 255;
+            rel1 {
+               relative: 1.0 1.0;
+               to: "left_top_padding";
+            }
+            rel2 {
+               relative: 1.0 1.0;
+               to: "left_top_padding";
+            }
+            text {
+               text: "Find";
+               font: FN;
+               size: 13;
+               min: 1 0;
+               align: 0.0 0.5;
+               ellipsis: -1;
+            }
+         }
+      }
+      text { "elm.text.replace";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.0;
+            fixed: 1 1;
+            min: 90 24;
+            max: 90 24;
+            color: 51 51 51 255;
+            rel1 {
+               relative: 0.0 1.0;
+               offset: 0 10;
+               to: "elm.text.find";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               to: "elm.text.find";
+            }
+            text {
+               text: "Replace with";
+               font: FN;
+               size: 13;
+               align: 0.0 0.5;
+               min: 1 0;
+               max: 1 0;
+               ellipsis: -1;
+            }
+         }
+      }
+      spacer { "colone.find";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.0;
+            min: 8 24;
+            max: -1 24;
+            fixed: 1 1;
+            rel1 {
+               relative: 1.0 0.0;
+               to_x: "elm.text.replace";
+               to_y: "elm.text.find";
+            }
+            rel2.to_x: "elm.text.replace";
+            rel2.to_y: "elm.text.find";
+         }
+      }
+      spacer { "colone.replace";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.0;
+            min: 8 24;
+            max: -1 24;
+            fixed: 1 1;
+            rel1 {
+               relative: 1.0 0.0;
+               to: "elm.text.replace";
+            }
+            rel2.to: "elm.text.replace";
+         }
+      }
+      rect { "btn_area_bg";
+         scale: 1;
+         desc { "default";
+            fixed: 1 1;
+            rel1.to_y: "elm.text.replace";
+            rel1.relative: 0.0 1.0;
+            rel1.offset: 0 20;
+            color: 255 255 255 255;
+         }
+      }
+      rect { "btn_area_up_line";
+         scale: 1;
+         desc { "default";
+            align: 0.5 1.0;
+            fixed: 0 1;
+            min: 0 1;
+            rel1.to: "btn_area_bg";
+            rel2.to: "btn_area_bg";
+            rel2.relative: 1.0 0.0;
+            color: 173 173 173 255;
+         }
+      }
+      text { "elm.text.dir";
+         scale: 1;
+         desc { "default";
+            visible: 0;
+            align: 0.0 0.0;
+            fixed: 1 1;
+            min: 50 26;
+            max: -1 26;
+            color: 0 103 244 255;
+            rel1 {
+               relative: 0.0 1.0;
+               offset: 0 38;
+               to: "elm.text.replace";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               to: "elm.text.replace";
+            }
+            text {
+               font: FN;
+               size: 10;
+               align: 0 0.5;
+               text: "Next";
+            }
+         }
+      }
+      swallow { "elm.swallow.find_entry";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 380 0;
+            max: 380 -1;
+            rel1 {
+               relative: 1.0 0.0;
+               to: "colone.find";
+            }
+            rel2 {
+               offset: -19 -1;
+               to_x: "base";
+               to_y: "colone.find";
+            }
+         }
+      }
+      swallow { "elm.swallow.replace_entry";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 0 1;
+            min: 380 0;
+            max: 380 -1;
+            rel1 {
+               relative: 1.0 0.0;
+               to: "colone.replace";
+            }
+            rel2 {
+               offset: -19 -1;
+               to_x: "base";
+               to_y: "colone.replace";
+            }
+         }
+      }
+      swallow { "elm.swallow.backward";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 86 24;
+            max: 86 24;
+            rel1 {
+               to: "elm.swallow.forward";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               offset: -9 -1;
+               to: "elm.swallow.forward";
+            }
+         }
+      }
+      swallow { "elm.swallow.forward";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 86 24;
+            max: 86 24;
+            rel1 {
+               to: "elm.swallow.replace";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               offset: -9 -1;
+               to: "elm.swallow.replace";
+            }
+         }
+      }
+      swallow { "elm.swallow.replace";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 86 24;
+            max: 86 24;
+            rel1 {
+               to: "elm.swallow.replace_all";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               offset: -9 -1;
+               to: "elm.swallow.replace_all";
+            }
+         }
+      }
+      swallow { "elm.swallow.replace_all";
+         scale: 1;
+         desc { "default";
+            align: 1.0 1.0;
+            fixed: 1 1;
+            min: 86 24;
+            max: 86 24;
+            rel1 {
+               to: "right_bottom_padding";
+            }
+            rel2 {
+               relative: 0.0 0.0;
+               to: "right_bottom_padding";
+            }
+         }
+      }
+      spacer { "right_bottom_padding";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            min: 20 18 ;
+            rel1.to: "base";
+            rel2.to: "base";
+            rel1.relative: 1.0 1.0;
+            align: 1.0 1.0;
+         }
+      }
+   }
+}
+
+group { "live_edit_layout";
+   data.item: "ctrl_size" "8";
+   parts {
+      rect { "clipper";
+         desc { "default";
+            color: 0 0 0 0;
+         }
+         desc { "show" 0.0;
+            color: 255 255 255 255;
+         }
+      }
+      swallow { "elm.swallow.symbol";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+         }
+      }
+      rect { "cursor_body";
+         repeat_events: 1;
+         desc { "default";
+            color: 0 0 0 0;
+         }
+      }
+      rect { "frame_l";
+         nomouse;
+         clip_to: "clipper";
+         scale: 1;
+         desc { "default";
+            align: 0 0.5;
+            rel1.relative: 0 0;
+            rel2.relative: 0 1;
+            min: 1 0;
+            fixed: 1 0;
+         }
+         desc { "anim" 0.0;
+            inherit: "default";
+            color: 51 153 255 127;
+         }
+      }
+      rect { "frame_r";
+         nomouse;
+         clip_to: "clipper";
+         scale: 1;
+         desc { "default";
+            align: 1 0.5;
+            rel1.relative: 1 0;
+            rel2.relative: 1 1;
+            min: 1 0;
+            fixed: 1 0;
+         }
+         desc { "anim" 0.0;
+            inherit: "default";
+            color: 51 153 255 127;
+         }
+      }
+      rect { "frame_t";
+         nomouse;
+         clip_to: "clipper";
+         scale: 1;
+         desc { "default";
+            align: 0.5 0;
+            rel1.relative: 0 0;
+            rel2.relative: 1 0;
+            min: 0 1;
+            fixed: 0 1;
+         }
+         desc { "anim" 0.0;
+            inherit: "default";
+            color: 51 153 255 127;
+         }
+      }
+      rect { "frame_b";
+         nomouse;
+         clip_to: "clipper";
+         scale: 1;
+         desc { "default";
+            align: 0.5 1;
+            rel1.relative: 0 1;
+            rel2.relative: 1 1;
+            min: 0 1;
+            fixed: 0 1;
+         }
+         desc { "anim" 0.0;
+            inherit: "default";
+            color: 51 153 255 127;
+         }
+      }
+   }
+   programs {
+      program { "on_load";
+         signal: "load";
+         action: STATE_SET "show";
+         target: "clipper";
+         after: "anim";
+         after: "clip_init";
+      }
+      program { "clip_init";
+         action: STATE_SET "show";
+         target: "clipper";
+         transition: DECELERATE 0.25;
+      }
+      program { "anim";
+         action: STATE_SET "anim";
+         target: "frame_l";
+         target: "frame_r";
+         target: "frame_t";
+         target: "frame_b";
+         transition: LINEAR 0.5;
+         after: "anim2";
+      }
+      program { "anim2";
+         action: STATE_SET "default";
+         target: "frame_l";
+         target: "frame_r";
+         target: "frame_t";
+         target: "frame_b";
+         transition: LINEAR 0.5;
+         after: "anim";
+      }
+   }
+}
+
+group { "viewer_layout_bg";
+   parts {
+      image { "bg";
+         nomouse;
+         desc { "default";
+            image.normal: "preview_bg.png";
+            fill {
+               size.relative: 0 0;
+               size.offset: 150 150;
+            }
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+         }
+      }
+      swallow { "elm.swallow.content";
+         desc { "default";
+         }
+      }
+   }
+}
+
+group { "viewer_layout";
+   parts {
+      rect { "prev_clipper";
+         desc { "default";
+         }
+         desc { "switched";
+            color: 255 255 255 0;
+         }
+      }
+      rect { "cur_clipper";
+         desc { "default";
+            rel1.relative: -1 0;
+            rel2.relative: 0 1;
+            color: 255 255 255 0;
+         }
+         desc { "switched";
+            rel1.relative: 0 0;
+            rel2.relative: 1 1;
+            color: 255 255 255 255;
+         }
+      }
+      swallow { "elm.swallow.prev";
+         clip_to: "prev_clipper";
+         desc { "default";
+         }
+      }
+      swallow { "elm.swallow.content";
+         clip_to: "cur_clipper";
+         desc { "default";
+            rel1.to: "cur_clipper";
+            rel2.to: "cur_clipper";
+         }
+      }
+   }
+   programs {
+      program { "switch_instant";
+         signal: "elm,view,switch,instant";
+         source: "";
+         action: STATE_SET "switched";
+         target: "prev_clipper";
+         target: "cur_clipper";
+      }
+      program { "switch";
+         signal: "elm,view,switch";
+         source: "";
+         action: STATE_SET "default";
+         target: "prev_clipper";
+         target: "cur_clipper";
+         after: "switched";
+      }
+      program { "switched";
+         action: STATE_SET "switched";
+         target: "prev_clipper";
+         target: "cur_clipper";
+         transition: DECELERATE 0.25;
+      }
+   }
+}
+
+group { "preview_layout";
+   parts {
+      image { "bg";
+         desc { "default";
+            min: 120 120;
+            image.normal: "preview_bg.png";
+            fill {
+               size.relative: 0 0;
+               size.offset: 150 150;
+            }
+            rel1.offset: 2 2;
+            rel2.offset: -3 -3;
+         }
+      }
+      swallow { "elm.swallow.img";
+         desc { "default";
+            rel1.to: "bg";
+            rel2.to: "bg";
+         }
+      }
+   }
+}
+
+group { "toggle_layout";
+   parts {
+      rect { "base";
+         scale: 1;
+         desc { "default";
+            min: 311 65;
+            color: 255 255 255 255;
+         }
+      }
+      spacer { "text_base";
+         scale: 1;
+         desc { "default";
+            rel1.to: "base";
+            rel1.offset: 25 0;
+            rel2.to: "base";
+            rel2.relative: 0.0 1.0;
+            rel2.offset: 24 -1;
+            align: 0.0 0.5;
+            min: 60 0;
+            fixed: 1 0;
+         }
+      }
+      text { "elm.text.type";
+         scale: 1;
+         desc { "default";
+            rel1.to: "text_base";
+            rel2.to: "text_base";
+            align: 0.0 0.5;
+            fixed: 1 0;
+            text {
+               font: FN;
+               size: 13;
+               align: 0.0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+            }
+            color: COL_NM;
+         }
+      }
+      swallow { "elm.swallow.toggle";
+         scale: 1;
+         desc { "default";
+            rel1.to: "text_base";
+            rel1.relative: 1.0 0.0;
+            rel2.to: "padding";
+            rel2.relative: 0.0 1.0;
+         }
+      }
+      spacer { "padding";
+         scale: 1;
+         desc { "default";
+            rel1.to: "base";
+            rel1.relative: 1.0 0.0;
+            rel2.to: "base";
+            align: 1.0 0.5;
+            min: 25 0;
+            fixed: 1 0;
+         }
+      }
+   }
+}
+
+group { "slider_layout";
+   parts {
+      rect { "base";
+         scale: 1;
+         desc { "default";
+            min: 311 65;
+            color: 255 255 255 255;
+         }
+      }
+      spacer { "text_base";
+         scale: 1;
+         desc { "default";
+            rel1.to: "base";
+            rel1.offset: 25 0;
+            rel2.to: "base";
+            rel2.relative: 0.0 1.0;
+            align: 0.0 0.5;
+            min: 60 0;
+            fixed: 1 0;
+         }
+      }
+      text { "elm.text.type";
+         scale: 1;
+         desc { "default";
+            rel1.to: "text_base";
+            rel2.to: "text_base";
+            align: 0.0 0.5;
+            fixed: 1 0;
+            text {
+               font: FNBD;
+               size: 13;
+               align: 0.0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+            }
+            color: 51 51 51 255;
+         }
+      }
+      text { "elm.text.slider_min";
+         scale: 1;
+         desc { "default";
+            rel1.to: "text_base";
+            rel1.relative: 1.0 0.0;
+            rel1.offset: 5 21;
+            rel2.to: "text_base";
+            rel2.relative: 1.0 0.0;
+            rel2.offset: -1 20;
+            align: 0.0 0.0;
+            fixed: 1 1;
+            text {
+               font: FN;
+               size: 11;
+               align: 0.0 0.0;
+               min: 1 1;
+               ellipsis: -1;
+            }
+            color: 51 51 51 255;
+         }
+      }
+      text { "elm.text.slider_max";
+         scale: 1;
+         desc { "default";
+            rel1.to: "padding";
+            rel1.relative: 0.0 0.0;
+            rel1.offset: 0 21;
+            rel2.to: "padding";
+            rel2.relative: 0.0 0.0;
+            rel2.offset: -6 20;
+            align: 1.0 0.0;
+            fixed: 1 1;
+            text {
+               font: FN;
+               size: 11;
+               align: 1.0 0.5;
+               min: 1 1;
+               ellipsis: -1;
+            }
+            color: 51 51 51 255;
+         }
+      }
+      swallow { "elm.swallow.slider";
+         type: SWALLOW;
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "text_base";
+            rel1.to_y: "elm.text.slider_min";
+            rel1.relative: 1.0 1.0;
+            rel2.to: "padding";
+            rel2.relative: 0.0 1.0;
+            rel2.offset: -1 -17;
+         }
+      }
+      spacer { "padding";
+         scale: 1;
+         desc { "default";
+            rel1.to: "base";
+            rel1.relative: 1.0 0.0;
+            rel2.to: "base";
+            align: 1.0 0.5;
+            min: 25 0;
+            fixed: 1 0;
+         }
+      }
+   }
+}
+
+group { "colorselector_layout";
+   parts {
+      rect { "base";
+         scale: 1;
+         desc {
+            min: 402 261;
+            color: 255 255 255 255;
+         }
+      }
+      spacer { "left_top_padding";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            min: 25 25 ;
+            rel1.to: "base";
+            rel2.to: "base";
+            rel2.relative: 0.0 0.0;
+            align: 0.0 0.0;
+         }
+      }
+      spacer { "right_bottom_padding";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            min: 25 25 ;
+            rel1.to: "base";
+            rel2.to: "base";
+            rel1.relative: 1.0 1.0;
+            align: 1.0 1.0;
+         }
+      }
+      swallow { "elm.swallow.colorselector";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            rel1.to: "left_top_padding";
+            rel2.to: "left_top_padding";
+            rel1.relative: 1.0 1.0;
+            align: 0.0 0.0;
+            min: 240 159;
+            max: 240 159;
+         }
+      }
+      spacer { "colors_padding";
+         scale: 1;
+         desc {
+            fixed: 0 1;
+            rel1.to_y: "elm.swallow.colorselector";
+            rel2.to_y: "elm.swallow.colorselector";
+            rel1.relative: 0.0 1.0;
+            rel2.relative: 1.0 1.0;
+            align: 0.5 0.0;
+            min: 0 1;
+         }
+      }
+      spacer { "vertical_padding";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            align: 0.0 0.5;
+            min: 16 0;
+            rel1.to_x: "elm.swallow.colorselector";
+            rel2.to_x: "elm.swallow.colorselector";
+            rel1.to_y: "colors_padding";
+            rel2.to_y: "colors_padding";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 0.0;
+         }
+      }
+      spacer { "view_top_padding";
+         scale: 1;
+         desc {
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 0;
+            rel1.to_x: "vertical_padding";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 0.0;
+         }
+      }
+      swallow { "view_left_padding";
+         scale: 1;
+         desc {
+            align: 0.0 0.5;
+            fixed: 1 0;
+            min: 0 0;
+            rel1.to_x: "vertical_padding";
+            rel1.to_y: "view_top_padding";
+            rel2.to_x: "vertical_padding";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      swallow { "elm.swallow.color_view";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            align: 0.5 0.0;
+            min: 96 48;
+            max: 96 48;
+            rel1.to_x: "view_left_padding";
+            rel1.to_y: "left_top_padding";
+            rel2.to_x: "right_bottom_padding";
+            rel2.to_y: "left_top_padding";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 0.0 1.0;
+         }
+      }
+      spacer { "inputs_padding";
+         scale: 1;
+         desc {
+            fixed: 0 1;
+            align: 0.5 0.0;
+            min: 0 10;
+            rel1.to_x: "vertical_padding";
+            rel1.to_y: "elm.swallow.color_view";
+            rel2.to_y: "elm.swallow.color_view";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      spacer { "red_text_region";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            align: 0.0 0.0;
+            min: 15 24;
+            max: 15 24;
+            rel1.to_x: "vertical_padding";
+            rel1.to_y: "inputs_padding";
+            rel2.to_x: "vertical_padding";
+            rel2.to_y: "inputs_padding";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      text { "elm.text.red";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            color: 70 70 70 255;
+            rel1.to: "red_text_region";
+            rel2.to: "red_text_region";
+            text {
+               font: FN;
+               size: 10;
+               align: 0.0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+            }
+         }
+      }
+      spacer { "green_text_region";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            align: 0.0 0.0;
+            min: 15 24;
+            max: 15 24;
+            rel1.offset: 0 5;
+            rel1.to_x: "vertical_padding";
+            rel1.to_y: "elm.text.red";
+            rel2.to_x: "vertical_padding";
+            rel2.to_y: "elm.text.red";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      text { "elm.text.green";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            color: 70 70 70 255;
+            rel1.to: "green_text_region";
+            rel2.to: "green_text_region";
+            text {
+               font: FN;
+               size: 10;
+               align: 0.0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+            }
+         }
+      }
+      spacer { "blue_text_region";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            align: 0.0 0.0;
+            min: 15 24;
+            max: 15 24;
+            rel1.offset: 0 5;
+            rel1.to_x: "vertical_padding";
+            rel1.to_y: "elm.text.green";
+            rel2.to_x: "vertical_padding";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      text { "elm.text.blue";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            color: 70 70 70 255;
+            rel1.to: "blue_text_region";
+            rel2.to: "blue_text_region";
+            text {
+               font: FN;
+               size: 10;
+               align: 0.0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+            }
+         }
+      }
+      spacer { "alpha_text_region";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            align: 0.0 0.0;
+            min: 15 24;
+            max: 15 24;
+            rel1.offset: 0 5;
+            rel1.to_x: "vertical_padding";
+            rel1.to_y: "elm.text.blue";
+            rel2.to_x: "vertical_padding";
+            rel2.to_y: "colors_padding";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 1.0 0.0;
+         }
+      }
+      text { "elm.text.alpha";
+         scale: 1;
+         desc {
+            fixed: 1 1;
+            color: 70 70 70 255;
+            rel1.to: "alpha_text_region";
+            rel2.to: "alpha_text_region";
+            text {
+               font: FN;
+               size: 10;
+               align: 0.0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+            }
+         }
+      }
+      swallow { "elm.swallow.input_red";
+         scale: 1;
+         desc {
+            align: 0.0 0.0;
+            min: 81 24;
+            max: 81 24;
+            rel1.to_x: "elm.text.red";
+            rel1.to_y: "inputs_padding";
+            rel1.to_y: "inputs_padding";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      swallow { "elm.swallow.input_green";
+         scale: 1;
+         desc {
+            align: 0.0 0.0;
+            min: 81 24;
+            max: 81 24;
+            rel1.offset: 0 5;
+            rel1.to_x: "elm.text.red";
+            rel1.to_y: "elm.swallow.input_red";
+            rel1.to_y: "elm.swallow.input_red";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      swallow { "elm.swallow.input_blue";
+         scale: 1;
+         desc {
+            align: 0.0 0.0;
+            min: 81 24;
+            max: 81 24;
+            rel1.offset: 0 5;
+            rel1.to_x: "elm.text.red";
+            rel1.to_y: "elm.swallow.input_green";
+            rel1.to_y: "elm.swallow.input_green";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      swallow { "elm.swallow.input_alpha";
+         scale: 1;
+         desc {
+            align: 0.0 0.0;
+            min: 81 24;
+            max: 81 24;
+            rel1.offset: 0 5;
+            rel1.to_x: "elm.text.red";
+            rel1.to_y: "elm.swallow.input_blue";
+            rel1.to_y: "elm.swallow.input_blue";
+            rel1.relative: 1.0 1.0;
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      swallow { "elm.swallow.preset_colors";
+         scale: 1;
+         desc {
+            align: 0.0 0.0;
+            min: 0 32;
+            max: -1 32;
+            rel1.to_y: "elm.swallow.colorselector";
+            rel1.relative: 0.0 1.0;
+            color: 128 0 0 128;
+         }
+      }
+   }
+}
+
+group { "statusbar_layout";
+   parts {
+      rect { "base_img";
+         scale: 1;
+         desc { "default";
+            color: 229 229 229 255;
+         }
+      }
+      rect { "base_line";
+         scale: 1;
+         desc { "default";
+            color: 177 177 177 255;
+            rel1.relative: 0 0;
+            rel2.relative: 1 0;
+            min: 0 1;
+            align: 0.5 0;
+            fixed: 0 1;
+         }
+      }
+      rect { "base_clip";
+         scale: 1;
+         desc { "default";
+            color: 255 255 255 255;
+         }
+         desc { "hide";
+            color: 0 0 0 0;
+         }
+      }
+      spacer { "size_spacer";
+         scale: 1;
+         desc { "default";
+            rel1.relative: 0 0;
+            rel2.relative: 0 1;
+            rel1.offset: 10 0;
+            min: 110 0;
+            fixed: 1 0;
+            align: 0 0.5;
+         }
+      }
+      swallow { "resize_btn";
+         clip_to: "base_clip";
+         scale: 1;
+         desc {
+            rel1.to_x: "size_spacer";
+            rel1.relative: 0.0 0;
+            rel2.relative: 0.0 1;
+            rel1.offset: 3 -3;
+            align: 0 0;
+            fixed: 1 0;
+            min: 13 13;
+         }
+      }
+      swallow { "invert_btn";
+         clip_to: "base_clip";
+         scale: 1;
+         desc {
+            rel1.to_x: "resize_btn";
+            rel1.relative: 1.0 0;
+            rel2.relative: 0.0 1;
+            rel1.offset: 3 -3;
+            align: 0 0;
+            fixed: 1 0;
+            min: 13 13;
+         }
+      }
+      text { "elm.text.size_w";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "invert_btn";
+            rel2.to_x: "invert_btn";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            rel1.offset: 3 0;
+            align: 0 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               size: 11;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.size_x";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.text.size_w";
+            rel2.to_x: "elm.text.size_w";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            align: 0 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               text: " X ";
+               size: 11;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.size_h";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.text.size_x";
+            rel2.to_x: "elm.text.size_x";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            rel1.offset: 3 0;
+            align: 0 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               size: 11;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      image { "cursor_arrow";
+         clip_to: "base_clip";
+         scale: 1;
+         desc {
+            rel1.to_x: "size_spacer";
+            rel2.to_x: "size_spacer";
+            rel1.relative: 1.0 0.5;
+            rel2.relative: 1.0 0.5;
+            rel1.offset: 0 2;
+            align: 0 0.5;
+            fixed: 1 1;
+            min: 13 13;
+            image.normal: "cursor_arrow.png";
+         }
+      }
+      swallow { "elm.swallow.cursor_arrow.tooltip";
+         desc { "default";
+            fixed: 1 1;
+            rel1.to: "cursor_arrow";
+            rel2.to: "cursor_arrow";
+         }
+      }
+      text { "elm.text.cursor_pxx";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "cursor_arrow";
+            rel2.to_x: "cursor_arrow";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            rel1.offset: 3 0;
+            align: 0 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               size: 11;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.cursor_px.";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.text.cursor_pxx";
+            rel2.to_x: "elm.text.cursor_pxx";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            align: 0 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               text: ",";
+               size: 11;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.cursor_pxy";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.text.cursor_px.";
+            rel2.to_x: "elm.text.cursor_px.";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            align: 0 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               size: 11;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.cursor_sep";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.text.cursor_pxy";
+            rel2.to_x: "elm.text.cursor_pxy";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            align: 0 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               text: " | ";
+               size: 11;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.cursor_relx";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.text.cursor_sep";
+            rel2.to_x: "elm.text.cursor_sep";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            rel1.offset: 3 0;
+            align: 0 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               size: 11;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.cursor_rel.";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.text.cursor_relx";
+            rel2.to_x: "elm.text.cursor_relx";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            align: 0 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               text: ",";
+               size: 11;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.cursor_rely";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.text.cursor_rel.";
+            rel2.to_x: "elm.text.cursor_rel.";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            align: 0 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               size: 11;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      spacer { "cursor_spacer";
+         scale: 1;
+         desc {
+            rel1.to: "size_spacer";
+            rel1.relative: 1.0 0.0;
+            rel2.to: "size_spacer";
+            rel2.relative: 1.0 1.0;
+            min: 200 0;
+            fixed: 1 0;
+            align: 0 0.5;
+         }
+      }
+      spacer { "group_spacer";
+         scale: 1;
+         desc {
+            rel1.to: "line_spacer";
+            rel1.relative: 0.0 0.0;
+            rel2.to: "line_spacer";
+            rel2.relative: 0.0 1.0;
+            min: 200 0;
+            fixed: 1 0;
+            align: 1 0.5;
+         }
+      }
+      image { "group_icon";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "cursor_spacer";
+            rel2.to_x: "elm.text.group_name";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 0.0 1.0;
+            rel1.offset: 0 -3;
+            rel2.offset: -3 -1;
+            min: 15 15;
+            max: 15 15;
+            align: 1 0.5;
+            image.normal: "navi_group.png";
+         }
+      }
+      swallow { "elm.swallow.group_icon.tooltip";
+         desc { "default";
+            fixed: 1 1;
+            rel1.to: "group_icon";
+            rel2.to: "group_icon";
+         }
+      }
+      text { "elm.text.group_name";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "group_spacer";
+            rel2.to_x: "line_spacer";
+            rel1.relative: 0.0 0.0;
+            rel2.relative: 0.0 1.0;
+            align: 1 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               size: 11;
+               align: 1 0.5;
+               min: 0 0;
+               max: 1 0;
+               font: FN;
+            }
+         }
+      }
+      spacer { "line_spacer";
+         scale: 1;
+         desc {
+            rel1.relative: 1 0;
+            align: 1 0.5;
+            min: 100 0;
+            fixed: 1 0;
+         }
+      }
+      text { "elm.text.line_[";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to: "elm.text.line_cur";
+            rel2.to: "elm.text.line_cur";
+            rel2.relative: 0 1.0;
+            align: 1 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               text: "line  ";
+               size: 11;
+               align: 1 0.5;
+               min: 1 0;
+               max: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      swallow { "elm.swallow.line.tooltip";
+         desc { "default";
+            fixed: 1 1;
+            rel1.to: "elm.text.line_[";
+            rel2.to: "elm.text.line_[";
+         }
+      }
+      text { "elm.text.line_cur";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to: "elm.text.line_c";
+            rel2.to: "elm.text.line_c";
+            rel1.relative: 0.0 0.0;
+            rel2.relative: 0.0 1.0;
+            align: 1 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               size: 11;
+               align: 1 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.line_c";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.to: "elm.text.line_max";
+            rel2.to: "elm.text.line_max";
+            rel2.relative: 0 1.0;
+            align: 1 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               text: ",";
+               size: 11;
+               align: 1 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.line_max";
+         clip_to: "base_clip";
+         scale: 1;
+         desc { "default";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            rel2.offset: -21 -1;
+            align: 1 0.5;
+            fixed: 1 0;
+            color: 69 69 69 255;
+            text {
+               size: 11;
+               align: 1 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               font: FN;
+            }
+         }
+      }
+      text { "elm.text.info_msg";
+         scale: 1;
+         nomouse;
+         desc { "default";
+            align: 0 0.5;
+            rel1.offset: 25 -1;
+            rel2.offset: -1 -2;
+            text {
+               font: FN;
+               size: 11;
+               align: 0 0.5;
+            }
+            color: 69 69 69 0;
+         }
+         desc { "show" 0.0;
+            inherit: "default";
+            color: 69 69 69 255;
+         }
+      }
+      program { "info_msg_show";
+         signal: "elm,action,info_msg,show";
+         source: "";
+         action: STATE_SET "hide";
+         target: "base_clip";
+         transition: DECELERATE 0.15;
+         after: "info_msg_show2";
+      }
+      program { "info_msg_show2";
+         action: STATE_SET "show";
+         target: "elm.text.info_msg";
+         transition: DECELERATE 0.3;
+         after: "info_msg_idle";
+      }
+      program { "info_msg_idle";
+         action: STATE_SET "show";
+         target: "elm.text.info_msg";
+         transition: LINEAR 3.5;
+         after: "info_msg_hide";
+      }
+      program { "info_msg_hide";
+         signal: "elm,action,info_msg,hide";
+         source: "";
+         action: STATE_SET "default";
+         target: "elm.text.info_msg";
+         transition: DECELERATE 0.3;
+         after: "info_msg_hide2";
+      }
+      program { "info_msg_hide2";
+         action: STATE_SET "default";
+         target: "base_clip";
+         transition: DECELERATE 0.3;
+      }
+   }
+}
+
+group { "main_layout";
+   parts {
+      spacer { "base";
+         scale: 1;
+         desc {
+            min: 1200 640;
+         }
+      }
+      swallow { "elm.swallow.panes";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               relative: 1.0 1.0;
+               to_x: "elm.swallow.file_browser";
+               to_y: "elm.swallow.file_tab";
+            }
+            rel2 {
+               relative: 0.0 0.0;
+               to_x: "elm.swallow.edc_navigator";
+               to_y: "elm.swallow.statusbar";
+            }
+         }
+      }
+      rect { "error_alert";
+         nomouse;
+         desc { "default";
+            rel1.to_y: "elm.swallow.panes";
+            rel2.to_y: "elm.swallow.panes";
+            color: 0 0 0 0;
+         }
+         desc { "visible" 0.0;
+            inherit: "default";
+            color: 200 0 0 175;
+         }
+      }
+      swallow { "elm.swallow.statusbar";
+         scale: 1;
+         desc { "default";
+            rel1.relative: 0 1;
+            rel2.relative: 1 1;
+            align: 0.5 0;
+            min: 0 30;
+            fixed: 0 1;
+         }
+         desc { "visible" 0.0;
+            inherit: "default";
+            align: 0.5 1;
+         }
+      }
+      swallow { "elm.swallow.file_browser";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               offset: 1 0;
+               relative: 0.0 1.0;
+               to_y: "elm.swallow.file_tab";
+            }
+            rel2 {
+               relative: 0.0 0.0;
+               to_y: "elm.swallow.statusbar";
+            }
+            align: 1 0;
+            min: 256 0;
+            fixed: 1 0;
+            visible: 0;
+         }
+         desc { "visible";
+            inherit: "default";
+            align: 0 0;
+            visible: 1;
+         }
+      }
+      swallow { "elm.swallow.edc_navigator";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               relative: 1.0 1.0;
+               to_y: "elm.swallow.file_tab";
+            }
+            rel2 {
+               relative: 1.0 0.0;
+               to_y: "elm.swallow.statusbar";
+            }
+            align: 0 0;
+            min: 238 0;
+            fixed: 1 0;
+            visible: 0;
+         }
+         desc { "visible";
+            inherit: "default";
+            align: 1 0;
+            rel1 {
+               relative: 1.0 1.0;
+               to_y: "elm.swallow.file_tab";
+            }
+            rel2 {
+               relative: 1.0 0.0;
+               to_y: "elm.swallow.statusbar";
+            }
+            visible: 1;
+         }
+      }
+      swallow { "elm.swallow.file_tab";
+         scale: 1;
+         desc { "default";
+            rel1 { relative: 0 0; }
+            rel2 { relative: 1 0; }
+            align: 0.5 1;
+            min: 0 34;
+            fixed: 0 1;
+         }
+         desc { "visible";
+            inherit: "default";
+            align: 0.5 0;
+         }
+      }
+   }
+   programs {
+      program { "file_browser_show";
+         signal: "elm,state,file_browser,show";
+         action: STATE_SET "visible";
+         target: "elm.swallow.file_browser";
+         transition: DECELERATE 0.25;
+      }
+      program { "file_browser_hide";
+         signal: "elm,state,file_browser,hide";
+         action: STATE_SET "default";
+         target: "elm.swallow.file_browser";
+         transition: DECELERATE 0.25;
+      }
+      program { "edc_navigator_show";
+         signal: "elm,state,edc_navigator,show";
+         action: STATE_SET "visible";
+         target: "elm.swallow.edc_navigator";
+         transition: DECELERATE 0.25;
+      }
+      program { "edc_navigator_hide";
+         signal: "elm,state,edc_navigator,hide";
+         action: STATE_SET "default";
+         target: "elm.swallow.edc_navigator";
+         transition: DECELERATE 0.25;
+      }
+      program { "statusbar_show";
+         signal: "elm,state,statusbar,show";
+         action: STATE_SET "visible";
+         target: "elm.swallow.statusbar";
+         transition: DECELERATE 0.25;
+      }
+      program { "statusbar_hide";
+         signal: "elm,state,statusbar,hide";
+         action: STATE_SET "default";
+         target: "elm.swallow.statusbar";
+         transition: DECELERATE 0.25;
+      }
+      program { "file_tab_show";
+         signal: "elm,state,file_tab,show";
+         action: STATE_SET "visible";
+         target: "elm.swallow.file_tab";
+         transition: DECELERATE 0.25;
+      }
+      program { "file_tab_hide";
+         signal: "elm,state,file_tab,hide";
+         action: STATE_SET "default";
+         target: "elm.swallow.file_tab";
+         transition: DECELERATE 0.25;
+      }
+      program { "alert_show";
+         signal: "elm,state,alert,show";
+         action: STATE_SET "visible";
+         target: "error_alert";
+         after: "alert_show2";
+      }
+      program { "alert_show2";
+         action: STATE_SET "default";
+         target: "error_alert";
+         transition: DECELERATE 1;
+      }
+   }
+}
+
+group { "tools_layout";
+   parts {
+      swallow { "elm.swallow.content";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               relative: 0.0 1.0;
+               to_y: "elm.swallow.tools";
+            }
+            rel2.to_y: "elm.swallow.fixed_bar";
+            rel2.relative: 1.0 0.0;
+         }
+      }
+      rect { "tools_base";
+         scale: 1;
+         desc { "default";
+            rel1.relative: 0 0;
+            rel2.relative: 1 0;
+            min: 0 46;
+            fixed: 0 1;
+            align: 0.5 1;
+            color: 244 244 244 255;
+         }
+         desc { "visible";
+            inherit: "default";
+            align: 0.5 0;
+         }
+      }
+      swallow { "elm.swallow.tools";
+         scale: 1;
+         desc { "default";
+            rel1.to: "tools_base";
+            rel2.to: "tools_base";
+         }
+      }
+      image { "tools_overlay";
+         scale: 1;
+         nomouse;
+         desc { "default";
+            rel1 { to: "tools_base"; }
+            rel2 { to: "tools_base"; }
+            image.normal: "bevel_out.png";
+            image.border: 1 1 1 1;
+            image.border_scale: 1;
+            fill.smooth: 0;
+         }
+      }
+      rect { "fixed_bar_bg";
+         desc { "default";
+            color: 248 248 248 255;
+            rel1.to: "elm.swallow.fixed_bar";
+            rel2.to: "elm.swallow.fixed_bar";
+         }
+      }
+      rect { "fixed_bar_line_left";
+         desc { "default";
+            color: 134 144 151 255;
+            rel1.to: "fixed_bar_bg";
+            rel2.to: "fixed_bar_bg";
+            align: 0.0 0.0;
+            max: 1 9999;
+         }
+      }
+      rect { "fixed_bar_line_right";
+         desc { "default";
+            color: 134 144 151 255;
+            rel1.to: "fixed_bar_bg";
+            rel2.to: "fixed_bar_bg";
+            align: 1.0 0.0;
+            max: 1 9999;
+         }
+      }
+      rect { "fixed_bar_line_bottom";
+         desc { "default";
+            color: 134 144 151 255;
+            rel1.to: "fixed_bar_bg";
+            rel2.to: "fixed_bar_bg";
+            align: 0.0 1.0;
+            max: 9999 1;
+         }
+      }
+      swallow { "elm.swallow.fixed_bar";
+         scale: 1;
+         desc { "default";
+            min: 0 0;
+            align: 0.5 0;
+            fixed: 1 1;
+            rel1.relative: 0.0 1.0;
+            rel2.relative: 1.0 1.0;
+         }
+         desc { "visible";
+            inherit: "default";
+            min: 0 20;
+            align: 0.5 1;
+         }
+      }
+   }
+   programs {
+      program { "tools_show";
+         signal: "elm,state,tools,show";
+         action: STATE_SET "visible";
+         target: "tools_base";
+         transition: DECELERATE 0.25 CURRENT;
+      }
+      program { "tools_hide";
+         signal: "elm,state,tools,hide";
+         action: STATE_SET "default";
+         target: "tools_base";
+         transition: DECELERATE 0.25 CURRENT;
+      }
+      program { "fixed_bar_show";
+         signal: "elm,state,fixed_bar,show";
+         action: STATE_SET "visible";
+         target: "elm.swallow.fixed_bar";
+         transition: DECELERATE 0.25 CURRENT;
+      }
+      program { "fixed_bar_hide";
+         signal: "elm,state,fixed_bar,hide";
+         action: STATE_SET "default";
+         target: "elm.swallow.fixed_bar";
+         transition: DECELERATE 0.25 CURRENT;
+      }
+   }
+}
+
+group { "live_view_tools_layout";
+   parts {
+      swallow { "elm.swallow.highlight";
+         scale: 1;
+         desc { "default";
+            rel1.offset: 10 0;
+            rel2.relative: 0.0 1.0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding1";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.highlight";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.highlight";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.dummy";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding1";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding1";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding2";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.dummy";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.dummy";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.wireframes";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding2";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding2";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding_outline";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.wireframes";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.wireframes";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.mirror";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding_outline";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding_outline";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding3";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.mirror";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.mirror";
+            min: 17 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      rect { "separator";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding3";
+               relative: 1.0 0.5;
+            }
+            rel2 {
+               to_x: "padding3";
+               relative: 1.0 0.5;
+            }
+            min: 1 18;
+            fixed: 1 1;
+            align: 0.0 0.5;
+            color: 207 207 207 255;
+         }
+      }
+      spacer { "padding4";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "separator";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "separator";
+            min: 17 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.live_edit1";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding4";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding4";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding5";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.live_edit1";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.live_edit1";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.live_edit2";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding5";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding5";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding6";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.live_edit2";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.live_edit2";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.live_edit3";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding6";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding6";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding7";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.live_edit3";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.live_edit3";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.live_edit4";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding7";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding7";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding8";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.live_edit4";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.live_edit4";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.live_edit5";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding8";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding8";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding9";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.live_edit5";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.live_edit5";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.live_edit6";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding9";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding9";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding10";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.live_edit6";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.live_edit6";
+            min: 17 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      rect { "separator2";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding10";
+               relative: 1.0 0.5;
+            }
+            rel2 {
+               to_x: "padding10";
+               relative: 1.0 0.5;
+            }
+            min: 1 18;
+            fixed: 1 1;
+            align: 0.0 0.5;
+            color: 207 207 207 255;
+         }
+      }
+      spacer { "padding11";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "separator2";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "separator2";
+            min: 17 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.view_slider"
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding11";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding11";
+            min: 240 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      image { "unit_view_size";
+         scale: 1;
+         desc { "default";
+            image.normal: "tool_percent_nor.png";
+            rel1 {
+               to_x: "elm.swallow.view_slider";
+               relative: 1.0 0.0;
+               offset: 5 0;
+            }
+            rel2.to_x: "elm.swallow.view_slider";
+            min: 9 9;
+            max: 9 9;
+            fixed: 1 1;
+            align: 0.0 0.5;
+         }
+      }
+   }
+}
+
+group { "text_editor_tools_layout";
+   parts {
+      spacer { "base";
+         scale: 1;
+         desc { "default";
+            min: 525 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.save";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "base";
+            rel2 {
+               to_x: "base";
+               relative: 0.0 1.0;
+            }
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding1";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.save";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.save";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.undo";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding1";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding1";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding2";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.undo";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.undo";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.redo";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding2";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding2";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding3";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.redo";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.redo";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.find";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding3";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding3";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding4";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.find";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.find";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.goto";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding4";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding4";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding5";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.goto";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.goto";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.lines";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding5";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding5";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      spacer { "padding6";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "elm.swallow.lines";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "elm.swallow.lines";
+            min: 8 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.template";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding6";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "padding6";
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.about";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "base";
+               relative: 1.0 0.0;
+            }
+            rel2.to_x: "base";
+            rel2.offset: -11 -1;
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+      spacer { "padding7";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.swallow.about";
+            rel2 {
+               to_x: "elm.swallow.about";
+               relative: 0.0 1.0;
+            }
+            min: 8 0;
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+
+      swallow { "elm.swallow.setting";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "padding7";
+            rel2 {
+               to_x: "padding7";
+               relative: 0.0 1.0;
+            }
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+      spacer { "padding8";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.swallow.setting";
+            rel2 {
+               to_x: "elm.swallow.setting";
+               relative: 0.0 1.0;
+            }
+            min: 17 0;
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+      rect { "separator";
+         scale: 1;
+         desc { "default";
+            rel1 {
+               to_x: "padding8";
+               relative: 0.0 0.5;
+            }
+            rel2 {
+               to_x: "padding8";
+               relative: 0.0 0.5;
+            }
+            min: 1 18;
+            fixed: 1 1;
+            align: 1.0 0.5;
+            color: 207 207 207 255;
+         }
+      }
+      spacer { "padding9";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "separator";
+            rel2 {
+               to_x: "separator";
+               relative: 0.0 1.0;
+            }
+            min: 17 0;
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.file_tab";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "padding9";
+            rel2 {
+               to_x: "padding9";
+               relative: 0.0 1.0;
+            }
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+      spacer { "padding10";
+         scale: 1;
+         desc { "default";
+            rel.to: "elm.swallow.file_tab";
+            rel2.relative: 0.0 1.0;
+            min: 8 0;
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.edc_navigator";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "padding10";
+            rel2 {
+               to_x: "padding10";
+               relative: 0.0 1.0;
+            }
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+      spacer { "padding11";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.swallow.edc_navigator";
+            rel2 {
+               to_x: "elm.swallow.edc_navigator";
+               relative: 0.0 1.0;
+            }
+            min: 8 0;
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.file_browser";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "padding11";
+            rel2 {
+               to_x: "padding11";
+               relative: 0.0 1.0;
+            }
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+      spacer { "padding12";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "elm.swallow.file_browser";
+            rel2 {
+               to_x: "elm.swallow.file_browser";
+               relative: 0.0 1.0;
+            }
+            min: 8 0;
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+      swallow { "elm.swallow.console";
+         scale: 1;
+         desc { "default";
+            rel1.to_x: "padding12";
+            rel2 {
+               to_x: "padding12";
+               relative: 0.0 1.0;
+            }
+            fixed: 1 0;
+            align: 1.0 0.5;
+         }
+      }
+   }
+}
+
+group { "rel_to_layout";
+   parts {
+      rect { "base";
+         scale: 1;
+         desc { "default";
+            min: 230 95;
+            color: 255 255 255 255;
+         }
+         desc { "single";
+            min: 115 95;
+            color: 255 255 255 255;
+         }
+      }
+      text { "guide_x";
+         scale: 1;
+         desc { "default";
+            rel1.relative: 0 0;
+            rel2.relative: 0 0;
+            align: 0 0;
+            min: 115 20;
+            fixed: 1 1;
+            text {
+               font: FN;
+               size: 13;
+               align: 0.1 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               text: "Relative to X";
+            }
+            color: 0 138 238 255;
+         }
+         desc { "single";
+            rel1.to: "guide_y";
+            rel2.to: "guide_y";
+            visible: 0;
+         }
+      }
+      text { "guide_y";
+         scale: 1;
+         desc { "default";
+            rel1.relative: 1 0;
+            rel2.relative: 1 0;
+            align: 1 0;
+            min: 115 20;
+            fixed: 1 1;
+            text {
+               font: FN;
+               size: 13;
+               align: 0.1 0.5;
+               min: 1 0;
+               ellipsis: -1;
+               text: "Relative to Y";
+            }
+            color: 0 138 238 255;
+         }
+         desc { "single";
+            rel1.to: "guide_x";
+            rel2.to: "guide_x";
+            visible: 0;
+         }
+      }
+      swallow { "elm.swallow.x";
+         scale: 1;
+         desc { "default";
+            rel1.to: "guide_x";
+            rel1.relative: 0 1;
+            rel1.offset: 2 0;
+            rel2.to_x: "guide_x";
+            rel2.to_y: "button_area";
+            rel2.relative: 1 0;
+            rel2.offset: -3 -1;
+            align: 0.5 0;
+         }
+         desc { "single";
+            rel1.to: "elm.swallow.y";
+            rel2.to: "elm.swallow.y";
+            visible: 0;
+         }
+      }
+      swallow { "elm.swallow.y";
+         scale: 1;
+         desc { "default";
+            rel1.to: "guide_y";
+            rel1.relative: 0 1;
+            rel2.to_x: "guide_y";
+            rel2.to_y: "button_area";
+            rel2.relative: 1 0;
+            rel1.offset: 2 0;
+            rel2.offset: -3 -1;
+            align: 0.5 0;
+         }
+         desc { "single";
+            rel1.to: "elm.swallow.x";
+            rel2.to: "elm.swallow.x";
+            visible: 0;
+         }
+      }
+      spacer { "button_area";
+         scale: 1;
+         desc { "default";
+            min: 0 30;
+            align: 0.5 1;
+            fixed: 1 1;
+            rel1.relative: 0 1;
+            rel2.relative: 1 1;
+            rel2.offset: 0 -5;
+         }
+      }
+      swallow { "elm.swallow.ok_btn";
+         scale: 1;
+         desc { "default";
+            rel1.to: "button_area";
+            rel2.to: "button_area";
+            rel1.relative: 0.5 1;
+            rel2.relative: 0.5 1;
+            align: 0.5 1;
+            fixed: 1 1;
+            min: 50 25;
+         }
+      }
+   }
+   programs {
+      program { "show_x";
+         signal: "elm,state,show,x";
+         action: STATE_SET "single" 0.0;
+         target: "elm.swallow.y";
+         target: "guide_y";
+         target: "base";
+      }
+      program { "show_y";
+         signal: "elm,state,show,y";
+         action: STATE_SET "single" 0.0;
+         target: "elm.swallow.x";
+         target: "guide_x";
+         target: "base";
+      }
+   }
+}
+
+group { "padding3_layout";
+   parts {
+      swallow { "elm.swallow.content";
+         type: SWALLOW;
+         desc { "default";
+            rel1.offset: 3 0;
+         }
+      }
+   }
+}
+
+group { "edit_layout";
+   parts {
+      rect { "base_clip";
+         desc { "default";
+            rel1.to: "elm.swallow.linenumber";
+            rel2.to: "elm.swallow.linenumber";
+            rel2.relative: 1 1;
+            fixed: 1 0;
+         }
+         desc { "hide";
+            inherit: "default";
+            rel2.relative: 0 1;
+         }
+      }
+      swallow { "elm.swallow.linenumber";
+         scale: 1;
+         clip_to: "base_clip";
+         nomouse;
+         desc {
+            fixed: 1 0;
+            align: 0 0.5;
+            min: 15 0;
+            rel1.relative: 0 0;
+            rel2.relative: 0 1;
+         }
+      }
+      swallow { "elm.swallow.edit";
+         scale: 1;
+         desc {
+            align: 0 0.5;
+            rel1.relative: 1 0;
+            rel1.to: "base_clip";
+            fixed: 0 1;
+         }
+      }
+      rect { "linenumber_vertical_line";
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 0;
+            min: 1 0;
+            color: 212 212 212 255;
+            rel1.to: "elm.swallow.edit";
+            rel2.to: "elm.swallow.edit";
+            rel2.relative: 0.0 1.0;
+         }
+      }
+      image { "disabler";
+         desc { "default";
+            image.normal: "disabler.png";
+            fill.type: TILE;
+            color: 255 255 255 0;
+            visible: 0;
+         }
+         desc { "disabled";
+            inherit: "default";
+            color: 255 255 255 255;
+            visible: 1;
+         }
+      }
+   }
+   programs {
+      program { "linenumber_show";
+         signal: "elm,state,linenumber,show";
+         action: STATE_SET "default";
+         target: "base_clip";
+         transition: DECELERATE 0.35;
+      }
+      program { "linenumber_hide";
+         signal: "elm,state,linenumber,hide";
+         action: STATE_SET "hide";
+         target: "base_clip";
+         transition: DECELERATE 0.35;
+      }
+   }
+   programs {
+      program { "layout_disable";
+         signal: "elm,state,disabled";
+         action: STATE_SET "disabled";
+         target: "disabler";
+         transition: DECELERATE 0.125;
+      }
+      program { "layout_enable";
+         signal: "elm,state,enabled";
+         action: STATE_SET "default";
+         target: "disabler";
+         transition: DECELERATE 0.125;
+      }
+   }
+}
+group { "help_layout";
+   parts {
+      rect { "base";
+         scale: 1;
+         desc { "default";
+            color: 65 65 65 255;
+            min: 430 220;
+         }
+      }
+      image { "image_bg";
+         scale: 1;
+         desc { "default";
+            image.normal: "help_bg.png";
+            image.border: 0 350 0 0;
+            align: 0.5 0.0;
+            rel1.to: "base";
+            rel2.to: "base";
+            min: 430 90;
+            max: 9999 90;
+         }
+      }
+      image { "image_logo";
+         scale: 1;
+         desc { "default";
+            image.normal: "full_logo.png";
+            align: 0.0 0.5;
+            rel1.to: "image_bg";
+            rel1.offset: 30 0;
+            rel2.to: "image_bg";
+            min: 156 90;
+            max: 156 90;
+         }
+      }
+      swallow { "swallow_list";
+         scale: 1;
+         desc { "default";
+            rel1.to: "image_bg";
+            rel1.relative: 0.0 1.0;
+            rel2.to: "base";
+         }
+      }
+      rect { "content_bg";
+         scale: 1;
+         desc { "default";
+            rel1.to: "base";
+            rel2.to: "base";
+            color: 1 158 235 255;
+         }
+         desc { "hide";
+            inherit: "default";
+            visible: 0;
+         }
+      }
+      swallow { "swallow_label";
+         scale: 1;
+         desc { "default";
+            align: 0.5 0.0;
+            min: 430 25;
+            max: 9999 25;
+         }
+         desc { "hide";
+            inherit: "default";
+            visible: 0;
+         }
+      }
+      swallow { "swallow_entry";
+         scale: 1;
+         desc { "default";
+            rel1.to: "swallow_label";
+            rel1.relative: 0.0 1.0;
+            rel2.to: "base";
+         }
+         desc { "hide";
+            inherit: "default";
+            visible: 0;
+         }
+      }
+      swallow { "swallow_button";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            rel1.to: "swallow_label";
+            rel2.to: "swallow_label";
+            min: 23 23;
+            max: 23 23;
+         }
+         desc { "hide";
+            inherit: "default";
+            visible: 0;
+         }
+      }
+   }
+   programs {
+      program { "content_show";
+         signal: "elm,state,content,show";
+         action: STATE_SET "default";
+         target: "content_bg";
+         target: "swallow_label";
+         target: "swallow_entry";
+         target: "swallow_button";
+      }
+      program { "content_hide";
+         signal: "elm,state,content,hide";
+         action: STATE_SET "hide";
+         target: "content_bg";
+         target: "swallow_label";
+         target: "swallow_entry";
+         target: "swallow_button";
+      }
+   }
+}
+#define REFERENCE_LAYOUT_WIDTH 360
+#define REFERENCE_LAYOUT_HEIGHT 100
+group { "reference_layout";
+   data.item: "width" REFERENCE_LAYOUT_WIDTH;
+   data.item: "height" REFERENCE_LAYOUT_HEIGHT;
+   parts {
+      spacer { "base";
+         scale: 1;
+         desc { "default";
+         }
+      }
+      image { "shadow";
+         scale: 1;
+         desc {
+            rel1.to: "bg";
+            rel2.to: "bg";
+            rel1.offset: -10 -10;
+            rel2.offset: 9 9;
+            image.normal: "popup_shadow.png";
+            image.border: 20 20 20 20;
+         }
+      }
+      rect { "bg";
+         scale: 1;
+         desc { "default";
+            min: REFERENCE_LAYOUT_WIDTH REFERENCE_LAYOUT_HEIGHT;
+            max: REFERENCE_LAYOUT_WIDTH REFERENCE_LAYOUT_HEIGHT;
+            fixed: 1 1;
+            align: 0.0 0.0;
+            rel1.to: "base";
+            rel2.to: "base";
+            color: 255 255 255 255;
+         }
+      }
+      swallow { "elm.swallow.content";
+         scale: 1;
+         desc { "default";
+            rel1.to: "bg";
+            rel2.to: "bg";
+         }
+      }
+      rect { "outline_top";
+         scale: 1;
+         desc { "default";
+            align: 0.5 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            max: 9999 2;
+            color: 0 138 238 255;
+         }
+      }
+      rect { "outline_bottom";
+         scale: 1;
+         desc { "default";
+            align: 0.5 1.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            max: 9999 2;
+            color: 0 138 238 255;
+         }
+      }
+      rect { "outline_left";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            max: 2 9999;
+            color: 0 138 238 255;
+         }
+      }
+      rect { "outline_right";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            max: 2 9999;
+            color: 0 138 238 255;
+         }
+      }
+   }
+}
diff --git a/data/themes/default/layout_setting.edc b/data/themes/default/layout_setting.edc
new file mode 100644 (file)
index 0000000..50c7e60
--- /dev/null
@@ -0,0 +1,825 @@
+images {
+   image: "setting_icon_font.png" COMP;
+   image: "setting_icon_sound.png" COMP;
+   image: "setting_icon_img.png" COMP;
+   image: "setting_icon_data.png" COMP;
+   image: "popup_shadow.png" COMP;
+   image: "tool_percent_nor.png" COMP;
+   image: "icon_file2.png" COMP;
+   image: "edceditor_icon.png" COMP;
+}
+
+group { "setting_layout";
+   parts {
+      rect { "clipper";
+         desc { "default";
+            color: 127 127 127 127;
+         }
+         desc { "show";
+         }
+      }
+      image { "shadow";
+         scale: 1;
+         desc { "default";
+            rel1.to: "base";
+            rel2.to: "base";
+            rel1.offset: -10 -10;
+            rel2.offset: 9 9;
+            image.normal: "popup_shadow.png";
+            image.border: 20 20 20 20;
+         }
+      }
+      spacer { "base";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            fixed: 1 1;
+            min: 600 435;
+            max: 600 435;
+         }
+      }
+      rect { "title_base";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            rel1 { to: "base"; }
+            rel2 { to: "base"; relative: 1.0 0.0; }
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 30;
+            max: -1 30;
+            color: 255 255 255 255;
+         }
+      }
+      image { "title_icon";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 16 16;
+            max: 16 16;
+            rel1 {
+               offset: 10 0;
+               to: "title_base";
+            }
+            rel2.to: "title_base";
+            image.normal: "edceditor_icon.png";
+         }
+      }
+      text { "title_text";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            align: 0.5 0.0;
+            fixed: 1 1;
+            color: 51 51 51 255;
+            rel1 {
+               to_x: "title_icon";
+               to_y: "title_base";
+               relative: 1.0 0.0;
+               offset: 10 0;
+            }
+            rel2.to: "title_base";
+            text {
+               text: "Settings";
+               font: FN;
+               size: 13;
+               min: 1 0;
+               align: 0.0 0.5;
+               ellipsis: -1;
+            }
+         }
+      }
+      rect { "title_bottom_line";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            rel1 { to: "title_base"; relative: 0.0 1.0; }
+            rel2 { to: "title_base"; }
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 1;
+            max: -1 1;
+            color: 204 204 204 255;
+         }
+      }
+      swallow { "elm.swallow.toolbar";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            rel1 { to: "title_bottom_line"; relative: 0.0 1.0; }
+            rel2 { to: "title_bottom_line"; }
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 32;
+            max: -1 32;
+         }
+      }
+      rect { "content_base";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            rel1 { to: "elm.swallow.toolbar"; relative: 0.0 1.0; }
+            rel2 { to: "button_top_line"; relative: 1.0 0.0; }
+            color: 248 248 248 255;
+         }
+      }
+      spacer { "content_top_padding";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            rel1.to: "content_base";
+            rel2 { to: "content_base"; relative: 1.0 0.0; }
+            align: 0.5 0.0;
+            min: 0 20;
+            max: -1 20;
+            fixed: 0 1;
+         }
+      }
+      spacer { "content_left_padding";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            rel1.to: "content_base";
+            rel2 { to: "content_base"; relative: 0.0 1.0; }
+            align: 0.0 0.5;
+            min: 20 0;
+            max: 20 -1;
+            fixed: 1 0;
+         }
+      }
+      spacer { "content_right_padding";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            rel1 { to: "content_base"; relative: 1.0 0.0; }
+            rel2.to: "content_base";
+            align: 1.0 0.5;
+            min: 20 0;
+            max: 20 -1;
+            fixed: 1 0;
+         }
+      }
+      swallow { "elm.swallow.content";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            rel1 {
+               to_x: "content_left_padding";
+               to_y: "content_top_padding";
+               relative: 1.0 1.0;
+            }
+            rel2 {
+               to: "content_right_padding";
+               relative: 0.0 1.0;
+            }
+         }
+      }
+      rect { "button_base";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            rel1 { to: "base"; relative: 0.0 1.0; }
+            rel2.to: "base";
+            align: 0.5 1.0;
+            min: 0 60;
+            max: -1 60;
+            fixed: 0 1;
+            color: 255 255 255 255;
+         }
+      }
+      rect { "button_top_line";
+         scale: 1;
+         clip_to: "clipper";
+         desc { "default";
+            rel1.to: "button_base";
+            rel2 { to: "button_base"; relative: 1.0 0.0; }
+            align: 0.5 1.0;
+            fixed: 0 1;
+            min: 0 1;
+            max: -1 1;
+            color: 173 173 173 255;
+         }
+      }
+      swallow { "elm.swallow.apply_btn";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 86 24;
+            max: 86 24;
+            rel1 { to: "button_base"; relative: 1.0 0.0; }
+            rel2 {
+               to: "button_base";
+               offset: -21 -1;
+            }
+         }
+      }
+      swallow { "elm.swallow.cancel_btn";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 86 24;
+            max: 86 24;
+            rel1.to: "elm.swallow.apply_btn";
+            rel2 {
+               to: "elm.swallow.apply_btn";
+               relative: 0.0 1.0;
+               offset: -21 -1;
+            }
+         }
+      }
+      swallow { "elm.swallow.reset_btn";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 86 24;
+            max: 86 24;
+            rel1.to: "elm.swallow.cancel_btn";
+            rel2 {
+               to: "elm.swallow.cancel_btn";
+               relative: 0.0 1.0;
+               offset: -21 -1;
+            }
+         }
+      }
+      rect { "event_blocker";
+         desc { "default";
+            color: 0 0 0 0;
+         }
+         desc { "hide";
+            visible: 0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program { "load";
+         signal: "load";
+         action: STATE_SET "show" 0.00;
+         target: "clipper";
+         after: "event_blocker_hide";
+      }
+      program { "dismiss";
+         signal: "elm,state,dismiss";
+         source: "";
+         action: STATE_SET "default" 0.00;
+         target: "clipper";
+         target: "event_blocker";
+         after: "dismiss_done";
+      }
+      program { "event_blocker_hide";
+         signal: "elm,state,event_blocker,hide";
+         source: "";
+         action: STATE_SET "hide" 0.00;
+         target: "event_blocker";
+      }
+      program { "dismiss_done";
+         action: SIGNAL_EMIT "elm,state,dismiss,done" "";
+      }
+   }
+}
+
+group { "build_setting_layout";
+   parts {
+      spacer { "main_edc_frame";
+         desc { "default";
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 24;
+            max: -1 24;
+            rel1 {
+               relative: 0 0;
+               offset: 0 9;
+            }
+            rel2 {
+               relative: 1 0;
+            }
+         }
+      }
+      spacer { "img_path_frame";
+         desc { "default";
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 24;
+            max: -1 24;
+            rel1 {
+               relative: 0.0 1.0;
+               offset: 0 9;
+               to: "main_edc_frame";
+            }
+            rel2 {
+               to: "main_edc_frame";
+            }
+         }
+      }
+      spacer { "snd_path_frame";
+         scale: 1;
+         desc { "default";
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 24;
+            max: -1 24;
+            rel1 {
+               relative: 0.0 1.0;
+               offset: 0 9;
+               to: "img_path_frame";
+            }
+            rel2 {
+               to: "img_path_frame";
+            }
+         }
+      }
+      spacer { "fnt_path_frame";
+         scale: 1;
+         desc { "default";
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 24;
+            max: -1 24;
+            rel1 {
+               relative: 0.0 1.0;
+               offset: 0 9;
+               to: "snd_path_frame";
+            }
+            rel2 {
+               to: "snd_path_frame";
+            }
+         }
+      }
+      spacer { "dat_path_frame";
+         scale: 1;
+         desc { "default";
+            align: 0.5 0.0;
+            fixed: 0 1;
+            min: 0 24;
+            max: -1 24;
+            rel1 {
+               relative: 0.0 1.0;
+               offset: 0 9;
+               to: "fnt_path_frame";
+            }
+            rel2 {
+               to: "fnt_path_frame";
+            }
+         }
+      }
+      image { "main_edc_icon";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 24 24;
+            max: 24 24;
+            rel1.to: "main_edc_frame";
+            rel2.to: "main_edc_frame";
+            image {
+               normal: "icon_file2.png";
+               middle: DEFAULT;
+            }
+         }
+      }
+      text { "main_edc_guide";
+         scale: 1;
+         desc { "default";
+            align: 0 0.5;
+            fixed: 1 1;
+            min: 100 0;
+            max: 100 -1;
+            color: 88 88 88 255;
+            rel1 {
+               relative: 1.0 0.0;
+               offset: 8 0;
+               to_x: "main_edc_icon";
+               to_y: "main_edc_frame";
+            }
+            rel2 {
+               to_x: "main_edc_icon";
+               to_y: "main_edc_frame";
+            }
+            text {
+               text: "Main EDC File";
+               font: FNBD;
+               size: 13;
+               align: 0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+            }
+         }
+      }
+      swallow { "elm.swallow.main_edc_entry";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 400 0;
+            max: 400 -1;
+            rel1 {
+               relative: 1.0 0.0;
+               to_x: "main_edc_guide";
+               to_y: "main_edc_frame";
+            }
+            rel2 {
+               to: "main_edc_frame";
+            }
+         }
+      }
+      swallow { "main_edc_tooltip";
+         repeat_events: 1;
+         desc { "default";
+            rel1.to: "main_edc_frame";
+            rel2.to: "main_edc_frame";
+            fixed: 1 1;
+         }
+      }
+      image { "img_path_icon";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 24 24;
+            max: 24 24;
+            rel1.to: "img_path_frame";
+            rel2.to: "img_path_frame";
+            image {
+               normal: "setting_icon_img.png";
+               middle: DEFAULT;
+            }
+         }
+      }
+      text { "img_path_guide";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 100 0;
+            max: 100 -1;
+            color: 88 88 88 255;
+            rel1 {
+               relative: 1.0 0.0;
+               offset: 8 0;
+               to_x: "img_path_icon";
+               to_y: "img_path_frame";
+            }
+            rel2 {
+               to_x: "img_path_icon";
+               to_y: "img_path_frame";
+            }
+            text {
+               text: "Image path";
+               font: FNBD;
+               size: 13;
+               min: 1 0;
+               align: 0.0 0.5;
+               ellipsis: -1.0;
+            }
+         }
+      }
+      swallow { "elm.swallow.img_path_entry";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 400 0;
+            max: 400 -1;
+            rel1 {
+               relative: 1.0 0.0;
+               to_x: "img_path_guide";
+               to_y: "img_path_frame";
+            }
+            rel2 {
+               to: "img_path_frame";
+            }
+         }
+      }
+      swallow { "img_path_tooltip";
+         repeat_events: 1;
+         desc { "default";
+            rel1.to: "img_path_frame";
+            rel2.to: "img_path_frame";
+            fixed: 1 1;
+         }
+      }
+      image { "snd_path_icon";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 24 24;
+            max: 24 24;
+            rel1 {
+               to: "snd_path_frame";
+            }
+            rel2 {
+               to: "snd_path_frame";
+            }
+            image {
+               normal: "setting_icon_sound.png";
+               middle: DEFAULT;
+            }
+         }
+      }
+      text { "snd_path_guide";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 100 0;
+            max: 100 -1;
+            color: 88 88 88 255;
+            rel1 {
+               relative: 1.0 0.0;
+               offset: 8 0;
+               to_x: "snd_path_icon";
+               to_y: "snd_path_frame";
+            }
+            rel2 {
+               to_x: "snd_path_icon";
+               to_y: "snd_path_frame";
+            }
+            text {
+               text: "Sound path";
+               font: FNBD;
+               size: 13;
+               min: 1 0;
+               align: 0.0 0.5;
+               ellipsis: -1.0;
+            }
+         }
+      }
+      swallow { "elm.swallow.snd_path_entry";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 400 0;
+            max: 400 -1;
+            rel1 {
+               relative: 1.0 0.0;
+               to_x: "snd_path_guide";
+               to_y: "snd_path_frame";
+            }
+            rel2 {
+               to: "snd_path_frame";
+            }
+         }
+      }
+      swallow { "snd_path_tooltip";
+         repeat_events: 1;
+         desc { "default";
+            rel1.to: "snd_path_frame";
+            rel2.to: "snd_path_frame";
+            fixed: 1 1;
+         }
+      }
+      image { "fnt_path_icon";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 24 24;
+            max: 24 24;
+            rel1 {
+               to: "fnt_path_frame";
+            }
+            rel2 {
+               to: "fnt_path_frame";
+            }
+            image {
+               normal: "setting_icon_font.png";
+               middle: DEFAULT;
+            }
+         }
+      }
+      text { "fnt_path_guide";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 100 0;
+            max: 100 -1;
+            color: 88 88 88 255;
+            rel1 {
+               relative: 1.0 0.0;
+               offset: 8 0;
+               to_x: "fnt_path_icon";
+               to_y: "fnt_path_frame";
+            }
+            rel2 {
+               to_x: "fnt_path_icon";
+               to_y: "fnt_path_frame";
+            }
+            text {
+               text: "Font path";
+               font: FNBD;
+               size: 13;
+               min: 1 0;
+               align: 0.0 0.5;
+               ellipsis: -1.0;
+            }
+         }
+      }
+      swallow { "elm.swallow.fnt_path_entry";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 400 0;
+            max: 400 -1;
+            rel1 {
+               relative: 1.0 0.0;
+               to_x: "fnt_path_guide";
+               to_y: "fnt_path_frame";
+            }
+            rel2 {
+               to: "fnt_path_frame";
+            }
+         }
+      }
+      swallow { "fnt_path_tooltip";
+         repeat_events: 1;
+         desc { "default";
+            rel1.to: "fnt_path_frame";
+            rel2.to: "fnt_path_frame";
+            fixed: 1 1;
+         }
+      }
+      image { "dat_path_icon";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 24 24;
+            max: 24 24;
+            rel1 {
+               to: "dat_path_frame";
+            }
+            rel2 {
+               to: "dat_path_frame";
+            }
+            image {
+               normal: "setting_icon_data.png";
+               middle: DEFAULT;
+            }
+         }
+      }
+      text { "dat_path_guide";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 100 0;
+            max: 100 -1;
+            color: 88 88 88 255;
+            rel1 {
+               relative: 1.0 0.0;
+               offset: 8 0;
+               to_x: "dat_path_icon";
+               to_y: "dat_path_frame";
+            }
+            rel2 {
+               to_x: "dat_path_icon";
+               to_y: "dat_path_frame";
+            }
+            text {
+               text: "Data path";
+               font: FNBD;
+               size: 13;
+               align: 0.0 0.5;
+               ellipsis: -1.0;
+            }
+         }
+      }
+      swallow { "elm.swallow.dat_path_entry";
+         scale: 1;
+         desc { "default";
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 400 0;
+            max: 400 -1;
+            rel1 {
+               relative: 1.0 0.0;
+               to_x: "dat_path_guide";
+               to_y: "dat_path_frame";
+            }
+            rel2 {
+               to: "dat_path_frame";
+            }
+         }
+      }
+      swallow { "data_path_tooltip";
+         repeat_events: 1;
+         desc { "default";
+            rel1.to: "dat_path_frame";
+            rel2.to: "dat_path_frame";
+            fixed: 1 1;
+         }
+      }
+   }
+}
+
+group { "text_setting_layout";
+   parts {
+      spacer { "preference_frame";
+         scale: 1;
+         desc { "default";
+            rel1.relative: 0 0;
+            rel2.relative: 1 0;
+            align: 0.5 0;
+            min: 0 24;
+            fixed: 0 1;
+         }
+      }
+      text { "text_font_size";
+         scale: 1;
+         desc { "default";
+            rel1.to: "preference_frame";
+            rel2 { to: "preference_frame"; relative: 0.0 1.0; }
+            rel1.offset: 2 0;
+            min: 80 20;
+            fixed: 1 1;
+            align: 0.0 0.5;
+            color: 88 88 88 255;
+            text {
+               text: "Font Size";
+               size: 13;
+               font: FNBD;
+               align: 0.0 0.5;
+            }
+         }
+      }
+      swallow { "elm.swallow.font_size";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            rel1 { to: "text_font_size"; relative: 1.0 0.0; }
+            rel2 { to_x: "preference_frame"; to_y: "text_font_size"; }
+            max: 230 24;
+            fixed: 1 1;
+         }
+      }
+      image { "unit_font_size";
+         scale: 1;
+         desc { "default";
+            align: 0.0 0.5;
+            rel1 { to: "elm.swallow.font_size"; relative: 1.0 0.0; offset: 5 0; }
+            rel2 { to_x: "preference_frame"; to_y: "elm.swallow.font_size"; }
+            min: 9 9;
+            max: 9 9;
+            fixed: 1 1;
+            image.normal: "tool_percent_nor.png";
+         }
+      }
+      spacer { "padding1";
+         desc { "default";
+            rel1 { to_y: "preference_frame"; relative: 0 1; }
+            rel2 { to_y: "preference_frame"; }
+            align: 0.5 0;
+            min: 0 40;
+            fixed: 0 1;
+         }
+      }
+      spacer { "text_setting_frame";
+         scale: 1;
+         desc { "default";
+            rel1 { to: "padding1"; relative: 0 1; offset: 5 0; }
+            rel2 { to_x: "padding1"; relative: 0.645 0.95; }
+         }
+      }
+      swallow { "elm.swallow.text_setting";
+         scale: 1;
+         desc { "default";
+            fixed: 0 1;
+            rel1.to: "text_setting_frame";
+            rel2.to: "text_setting_frame";
+         }
+      }
+      spacer { "padding2";
+         desc { "default";
+            rel1 { to: "text_setting_frame"; relative: 1 0; }
+            rel2 { to: "text_setting_frame"; relative: 1 0; }
+            align: 0 1;
+            min: 20 20;
+            fixed: 1 1;
+         }
+      }
+      spacer { "font_frame";
+         scale: 1;
+         desc { "default";
+            rel1 {to: "padding2"; relative: 1 0;}
+            rel2.relative: 1 0.95;
+         }
+      }
+      swallow { "elm.swallow.font";
+         scale: 1;
+         desc { "default";
+            rel1.to: "font_frame";
+            rel2.to: "font_frame";
+         }
+      }
+
+   }
+}
diff --git a/data/themes/default/live_edit.edc b/data/themes/default/live_edit.edc
new file mode 100644 (file)
index 0000000..7c26cd8
--- /dev/null
@@ -0,0 +1,86 @@
+images {
+   image: "live_spacer.png" COMP;
+   image: "preview_swallow.png" COMP;
+   image: "preview_image.png" COMP;
+
+}
+
+styles {
+   style { "default_style";
+      base: "font="FN" font_size=30 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0088AA64 valign=0.5 ellipsis=1.0 wrap=none align=center";
+   }
+}
+
+group { "Image_bg";
+   parts {
+      image { "img";
+         desc {
+            image.normal: "preview_image.png";
+         }
+      }
+   }
+}
+group { "Rect_bg";
+   parts {
+      rect { "rect";
+         desc {
+            color: 0 136 170 255;
+         }
+      }
+   }
+}
+group { "Text_bg";
+   parts {
+      text { "text";
+         scale: 1;
+         effect: SOFT_OUTLINE;
+         desc {
+            color: 255 255 255 255;
+            color2: 0 136 170 100;
+            text {
+               size: 50;
+               font: FN;
+               text: "TEXT";
+            }
+         }
+      }
+   }
+}
+group { "Textblock_bg";
+   parts {
+      textblock { "textblock";
+         scale: 1;
+         desc {
+            text {
+               style: "default_style";
+               size: 10;
+               font: FN;
+               text: "TEXTBLOCK";
+            }
+         }
+      }
+   }
+}
+group { "Swallow_bg";
+   parts {
+      image { "img";
+         repeat_events: 1;
+         desc { "default";
+            image.normal: "preview_swallow.png";
+            aspect: 1 1;
+            aspect_preference: BOTH;
+         }
+      }
+   }
+}
+group { "Spacer_bg";
+   parts {
+      image { "img";
+         desc { "default";
+            image.normal: "live_spacer.png";
+            image.border: 1 1 1 1;
+            fill.smooth: 0;
+         }
+      }
+   }
+}
diff --git a/data/themes/default/sounds/Makefile.am b/data/themes/default/sounds/Makefile.am
new file mode 100644 (file)
index 0000000..2a1a6e1
--- /dev/null
@@ -0,0 +1,7 @@
+MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST = \
+   kbd-tap.wav \
+   kbd-tap2.wav \
+   kbd-tap3.wav \
+   kbd-tap4.wav \
+   kbd-tap5.wav
diff --git a/data/themes/default/sounds/kbd-tap.wav b/data/themes/default/sounds/kbd-tap.wav
new file mode 100644 (file)
index 0000000..50bbf4c
Binary files /dev/null and b/data/themes/default/sounds/kbd-tap.wav differ
diff --git a/data/themes/default/sounds/kbd-tap2.wav b/data/themes/default/sounds/kbd-tap2.wav
new file mode 100644 (file)
index 0000000..8ca8d0a
Binary files /dev/null and b/data/themes/default/sounds/kbd-tap2.wav differ
diff --git a/data/themes/default/sounds/kbd-tap3.wav b/data/themes/default/sounds/kbd-tap3.wav
new file mode 100644 (file)
index 0000000..849fa1c
Binary files /dev/null and b/data/themes/default/sounds/kbd-tap3.wav differ
diff --git a/data/themes/default/sounds/kbd-tap4.wav b/data/themes/default/sounds/kbd-tap4.wav
new file mode 100644 (file)
index 0000000..eecd4e3
Binary files /dev/null and b/data/themes/default/sounds/kbd-tap4.wav differ
diff --git a/data/themes/default/sounds/kbd-tap5.wav b/data/themes/default/sounds/kbd-tap5.wav
new file mode 100644 (file)
index 0000000..a2dc79b
Binary files /dev/null and b/data/themes/default/sounds/kbd-tap5.wav differ
diff --git a/data/themes/default/theme_ext.edc b/data/themes/default/theme_ext.edc
new file mode 100644 (file)
index 0000000..5195a96
--- /dev/null
@@ -0,0 +1,3199 @@
+#define DARK_GREY_BG_COLOR 48 48 48 255
+#define ASPECT_FILL(_ASPECT) \
+   aspect: _ASPECT _ASPECT; aspect_preference: NONE;
+#define TILED_PATTERN(_WIDTH, _HEIGHT) \
+   fill { size { relative: 0.0 0.0; offset: _WIDTH _HEIGHT; } }
+#define TILED_HORIZ(_WIDTH) \
+   fill { size { relative: 0.0 1.0; offset: _WIDTH 0; } }
+#define FIXED_SIZE(_WIDTH, _HEIGHT) \
+   min: _WIDTH _HEIGHT; max: _WIDTH _HEIGHT; fixed: 1 1;
+#define PANEMIN 10
+#define PANEMIN2 16
+#define PANEWID 32
+
+#define ENABLED_TEXTBLOCK_TAGS                                             \
+   tag: "em" "+ font_style=Oblique";                                       \
+   tag: "hilight" "+ font_weight=Bold style=glow glow_color=#3399ff80";    \
+   tag: "error" "+ underline=single underline_color=#ff0000 underline2_color=#ff0000"; \
+   tag: "link" "+ color=#3399ff underline=on underline_color=#3399ff";     \
+   tag: "preedit" "+ underline=on underline_color=#3399ff";                \
+   tag: "preedit_sel" "+ backing=on backing_color=#000000 color=#ffffff";  \
+   tag: "title" "+ font_size=26";                                          \
+   tag: "subtitle" "+ font_size=18";                                       \
+   tag: "bigger" "+ font_size=12";                                         \
+   tag: "big" "+ font_size=11";                                            \
+   tag: "small" "+ font_size=8";                                           \
+   tag: "smaller" "+ font_size=7";                                         \
+   tag: "name" "+ color=#888888 font_weight=Bold";                         \
+   tag: "val" "+ color=#ffffff";                                           \
+   tag: "info" "+ color=#3399ff style=glow glow_color=#3399ff30";          \
+   tag: "success" "+ color=#00ff00 style=glow glow_color=#00ff0030";       \
+   tag: "warning" "+ color=#ff7c00 style=glow glow_color=#ff7c0030";       \
+   tag: "failure" "+ color=#ff0000 style=glow glow_color=#ff000030";       \
+   tag: "code" "+ font=Mono style=plain color=#ffffff";                    \
+   tag: "comment" "+ color=#00B000";                                       \
+   tag: "string" "+ color=#ff3a35";                                        \
+   tag: "number" "+ color=#D4D42A font_weight=Bold";                       \
+   tag: "brace" "+ color=#656565";                                         \
+   tag: "type" "+ color=#3399ff";                                          \
+   tag: "class" "+ color=#72AAD4 font_weight=Bold";                        \
+   tag: "function" "+ color=#72AAD4 font_weight=Bold";                     \
+   tag: "param" "+ color=#ffffff";                                         \
+   tag: "keyword" "+ color=#ff9900 font_weight=Bold";                      \
+   tag: "preprocessor" "+ color=#3399ff font_weight=Bold";                 \
+   tag: "line_added" "+ color=#00B000";                                    \
+   tag: "line_removed" "+ color=#ff3a35";                                  \
+   tag: "line_changed" "+ color=#ff9900";
+
+#define DISABLED_TEXTBLOCK_TAGS                                            \
+   tag: "em" "+ font_style=Oblique";                                       \
+   tag: "hilight" "+ font_weight=Bold style=glow glow_color=#3399ff20";    \
+   tag: "error" "+ underline=single underline_color=#ff0000 underline2_color=#ff0000"; \
+   tag: "link" "+ color=#101820 shadow_color=#66aaff28 underline=on underline_color=#101820"; \
+   tag: "preedit" "+ underline=on underline_color=#3399ff88";              \
+   tag: "preedit_sel" "+ backing=on backing_color=#000000 color=#888888";  \
+   tag: "title" "+ font_size=26";                                          \
+   tag: "subtitle" "+ font_size=18";                                       \
+   tag: "bigger" "+ font_size=12";                                         \
+   tag: "big" "+ font_size=11";                                            \
+   tag: "small" "+ font_size=8";                                           \
+   tag: "smaller" "+ font_size=7";                                         \
+   tag: "name" "+ color=#151515 font_weight=Bold";                         \
+   tag: "val" "+ color=#151515";                                           \
+   tag: "info" "+ color=#3399ff60 style=glow glow_color=#3399ff18";        \
+   tag: "success" "+ color=#00ff0060 style=glow glow_color=#00ff0018";     \
+   tag: "warning" "+ color=#ff7c0060 style=glow glow_color=#ff7c0018";     \
+   tag: "failure" "+ color=#ff000060 style=glow glow_color=#ff000018";     \
+   tag: "code" "+ style=shadow,bottom shadow_color=#ffffff19 font=Mono color=#151515"; \
+   tag: "comment" "+ color=#002800";                                       \
+   tag: "string" "+ color=#300504";                                        \
+   tag: "number" "+ color=#202008 font_weight=Bold";                       \
+   tag: "brace" "+ color=#000000";                                         \
+   tag: "type" "+ color=#101820";                                          \
+   tag: "class" "+ color=#121c20 font_weight=Bold";                        \
+   tag: "function" "+ color=#121c20 font_weight=Bold";                     \
+   tag: "param" "+ color=#151515";                                         \
+   tag: "keyword" "+ color=#201200 font_weight=Bold";                      \
+   tag: "preprocessor" "+ color=#101820 font_weight=Bold";                 \
+   tag: "line_added" "+ color=#002800";                                    \
+   tag: "line_removed" "+ color=#300504";                                  \
+   tag: "line_changed" "+ color=#201200";
+
+
+//List
+#define ODD(_NAME, _SRC) \
+   group { name: _NAME; \
+      inherit: _SRC; \
+      parts { \
+         part { name: "base"; \
+            description { state: "default" 0.0; \
+               color: 56 56 56 255; \
+               color_class: "list_item_base_odd"; \
+            } \
+         } \
+      } \
+   }
+#define COMPRESS(_NAME, _SRC) \
+   group { name: _NAME; \
+      inherit: _SRC; \
+      parts { \
+         part { name: "elm.text"; \
+            description { state: "default" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "selected" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "disabled" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+         } \
+         part { name: "label2"; \
+            description { state: "default" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "selected" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "disabled" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+         } \
+         part { name: "label3"; \
+            description { state: "default" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "selected" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "disabled" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+         } \
+      } \
+   }
+#define COMPRESS_ODD(_NAME, _SRC) \
+   group { name: _NAME; \
+      inherit: _SRC; \
+      parts { \
+         part { name: "elm.text"; \
+            description { state: "default" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "selected" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "disabled" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+         } \
+         part { name: "label2"; \
+            description { state: "default" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "selected" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "disabled" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+         } \
+         part { name: "label3"; \
+            description { state: "default" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "selected" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+            description { state: "disabled" 0.0; \
+               text.min: 0 1; \
+               text.ellipsis: 0.0; \
+            } \
+         } \
+         part { name: "base"; \
+            description { state: "default" 0.0; \
+               color: 56 56 56 255; \
+               color_class: "list_item_base_odd"; \
+            } \
+         } \
+      } \
+   }
+
+group { name: "elm/list/h_item/enventor";
+   data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
+   images.image: "list_h_item_normal_bg.png" COMP;
+   images.image: "list_h_item_hovered_bg.png" COMP;
+   images.image: "list_h_item_selected_bg.png" COMP;
+   images.image: "icon_file.png" COMP;
+   script {
+      public selected;
+   }
+   parts {
+      part { name: "event"; type: RECT;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "base"; type: RECT; mouse_events: 0;
+         description { state: "default" 0.0;
+            color: 64 64 64 255;
+            color_class: "list_item_base";
+         }
+         description { state: "odd" 0.0;
+            color: 56 56 56 255;
+            color_class: "list_item_base_odd";
+         }
+      }
+      program {
+         signal: "elm,state,odd"; source: "elm";
+         action: STATE_SET "odd" 1.0;
+         target: "base";
+      }
+      program {
+         signal: "elm,state,even"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "base";
+      }
+      part { name: "sel_base"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "list_h_item_normal_bg.png";
+            image.border: 1 1 1 3;
+            fill.smooth: 0;
+            visible: 1;
+            //TILED_HORIZ(120)
+            rel1.offset: -1 0;
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "list_h_item_selected_bg.png";
+            visible: 1;
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "list_h_item_hovered_bg.png";
+            visible: 1;
+         }
+      }
+      program { "mouse_in";
+         signal: "mouse,in";
+         source: "event";
+         script {
+            if (!get_int(selected)) {
+               set_state(PART:"sel_base", "hovered", 0.0);
+            }
+         }
+      }
+      program { "mouse_out";
+         signal: "mouse,out";
+         source: "event";
+         script {
+            if (!get_int(selected)) {
+               set_state(PART:"sel_base", "default", 0.0);
+            }
+         }
+      }
+      program {
+         signal: "elm,state,selected"; source: "elm";
+         script {
+            set_state(PART:"sel_base", "selected", 0.0);
+            set_int(selected, 1);
+         }
+      }
+      program {
+         signal: "elm,state,unselected"; source: "elm";
+         script {
+            set_state(PART:"sel_base", "default", 0.0);
+            set_int(selected, 0);
+         }
+      }
+      program {
+         signal: "elm,state,disabled"; source: "elm";
+         action: STATE_SET "disabled" 0.0;
+         target: "event";
+      }
+      program {
+         signal: "elm,state,enabled"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "event";
+      }
+      text { "elm.text";
+         nomouse;
+         scale: 1;
+         desc { "default";
+            rel1.offset: 5 0;
+            rel1.relative: 1.0 0;
+            rel1.to_x: "elm.swallow.icon";
+            rel2.relative: 0.0 1.0;
+            rel2.offset: -5 0;
+            rel2.to_x: "elm.swallow.end";
+            color: 65 65 65 255;
+            color_class: "list_item";
+            text { font: FN; size: 12;
+               min: 1 1;
+               ellipsis: -1;
+               align: 0.5 0.5;
+               text_class: "list_item";
+            }
+         }
+         desc { "selected";
+            inherit: "default";
+            visible: 0;
+         }
+         desc { "disabled";
+            inherit: "default";
+            visible: 0;
+         }
+      }
+      part { name: "label2"; type: TEXT; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "elm.text";
+            rel2.to: "elm.text";
+            color: 21 21 21 255;
+            color_class: "list_item_disabled";
+            text { font: FN; size: 10;
+               text_source: "elm.text";
+               align: 0.5 0.5;
+               text_class: "list_item";
+            }
+            visible: 0;
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "label3"; type: TEXT; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "elm.text";
+            rel2.to: "elm.text";
+            color: COL_HI;
+            color_class: "list_item_selected";
+            text { font: FN; size: 12;
+               text_source: "elm.text";
+               align: 0.5 0.5;
+               text_class: "list_item";
+            }
+            visible: 0;
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      program {
+         signal: "elm,state,selected"; source: "elm";
+         action: STATE_SET "selected" 0.0;
+         target: "elm.text";
+         target: "label2";
+         target: "label3";
+         target: "elm.swallow.end";
+      }
+      program {
+         signal: "elm,state,unselected"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "elm.text";
+         target: "label2";
+         target: "label3";
+         target: "elm.swallow.end";
+      }
+      program {
+         signal: "elm,state,disabled"; source: "elm";
+         action: STATE_SET "disabled" 0.0;
+         target: "elm.text";
+         target: "label2";
+         target: "label3";
+      }
+      program {
+         signal: "elm,state,enabled"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "elm.text";
+         target: "label2";
+         target: "label3";
+      }
+      part { name: "icon"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "icon_file.png";
+            fill.smooth: 0;
+            fixed: 1 1;
+            visible: 1;
+            align: 0.0 0.5;
+            rel1.relative: 0.0 0.5;
+            rel1.offset: 5 0;
+            rel2.relative: 0.0 0.5;
+            min: 16 16;
+            max: 16 16;
+         }
+      }
+      swallow {"elm.swallow.icon";
+         scale: 1;
+         desc { "default";
+            fixed: 1 1;
+            align: 0 0.5;
+            rel1.relative: 0.0 0.5;
+            rel1.offset: 5 0;
+            rel2.relative: 0.0 0.5;
+            min: 15 15;
+            max: 15 15;
+         }
+      }
+      swallow { "elm.swallow.end";
+          scale: 1;
+          desc { "default";
+             visible: 0;
+             fixed: 1 1;
+             align: 1.0 0.5;
+             aspect: 1.0 1.0;
+             rel1.relative: 1.0 0.0;
+             rel1.offset: 5 0;
+             rel2.to: "base";
+             rel2.offset: -5 0;
+             min: 20 20;
+             max: 20 20;
+          }
+          desc { "selected";
+             inherit: "default";
+             visible: 1;
+          }
+      }
+      part { name: "event_block"; type: RECT;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            visible: 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      program {
+         signal: "elm,state,disabled"; source: "elm";
+         action: STATE_SET "disabled" 0.0;
+         target: "event_block";
+      }
+      program {
+         signal: "elm,state,enabled"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "event_block";
+      }
+   }
+}
+ODD("elm/list/h_item_odd/enventor", "elm/list/h_item/enventor")
+COMPRESS("elm/list/h_item_compress/enventor", "elm/list/h_item/enventor")
+COMPRESS_ODD("elm/list/h_item_compress_odd/enventor", "elm/list/h_item/enventor")
+
+
+
+group { name: "elm/scroller/base/enventor";
+   images.image: "inset_shadow.png" COMP;
+   images.image: "bevel_in.png" COMP;
+   images.image: "bevel_out.png" COMP;
+   images.image: "runner_horiz.png" COMP;
+   images.image: "runner_vert.png" COMP;
+   images.image: "runner_glow_horiz.png" COMP;
+   images.image: "runner_glow_vert.png" COMP;
+   images.image: "holes_tiny_horiz.png" COMP;
+   images.image: "holes_tiny_vert.png" COMP;
+   images.image: "holes_tiny_glow_horiz.png" COMP;
+   images.image: "holes_tiny_glow_vert.png" COMP;
+   images.image: "vgrad_med_lighter.png" COMP;
+   images.image: "shadow_square_tiny.png" COMP;
+   images.image: "glow_small.png" COMP;
+   images.image: "sym_left_light_normal.png" COMP;
+   images.image: "sym_right_light_normal.png" COMP;
+   images.image: "sym_up_light_normal.png" COMP;
+   images.image: "sym_down_light_normal.png" COMP;
+   images.image: "sym_left_glow_normal.png" COMP;
+   images.image: "sym_right_glow_normal.png" COMP;
+   images.image: "sym_up_glow_normal.png" COMP;
+   images.image: "sym_down_glow_normal.png" COMP;
+
+   data.item: "focus_highlight" "on";
+
+   parts {
+      program {
+         signal: "load"; source: "";
+         script {
+            emit("reload", "elm");
+         }
+      }
+// vert bar ////////////////////////////////////////////////////////////////
+      part { name: "sb_vbar_show"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+//            rel1.offset: -11 -11;
+//            rel2.offset: 10 10;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "sb_vbar"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 0;
+            min: 15 15;
+            align: 1.0 0.0;
+            rel1.relative: 1.0 0.0;
+            rel1.offset: -1 0;
+            rel2.relative: 1.0 0.0;
+            rel2.to_y: "sb_hbar";
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            min: 0 0;
+            max: 0 99999;
+         }
+      }
+      part { name: "sb_vbar_base"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 0.0 1.0;
+            rel1.to: "sb_vbar_a1";
+            rel2.relative: 1.0 0.0;
+            rel2.to: "sb_vbar_a2";
+         }
+      }
+      part { name: "sb_vbar_p1"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 0.0 1.0;
+            rel1.to: "sb_vbar_a1";
+            rel2.relative: 1.0 0.0;
+            rel2.to: "elm.dragable.vbar";
+         }
+      }
+      part { name: "sb_vbar_p2"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 0.0 1.0;
+            rel1.to: "elm.dragable.vbar";
+            rel2.relative: 1.0 0.0;
+            rel2.to: "sb_vbar_a2";
+         }
+      }
+      part { name: "elm.dragable.vbar"; type: RECT;
+         clip_to: "sb_vbar";
+         scale: 1;
+         dragable.x: 0 0 0;
+         dragable.y: 1 1 0;
+         dragable.confine: "sb_vbar_base";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 15 15;
+            rel1.relative: 0.5  0.5;
+            rel1.to: "sb_vbar_base";
+            rel2.relative: 0.5  0.5;
+            rel2.to: "sb_vbar_base";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "sb_vbar_a1"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 15 15;
+            align: 0.5 0.0;
+            aspect: 1.0 1.0; aspect_preference: HORIZONTAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_vbar";
+            rel2.to: "sb_vbar";
+            rel2.relative: 1.0 0.0;
+            rel2.offset: -1 0;
+         }
+      }
+      part { name: "sb_vbar_a2"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 15 15;
+            align: 0.5 1.0;
+            aspect: 1.0 1.0; aspect_preference: HORIZONTAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_vbar";
+            rel1.offset: 0 -1;
+            rel1.relative: 0.0 1.0;
+            rel2.to: "sb_vbar";
+         }
+      }
+      program {
+         signal: "elm,action,show,vbar"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "sb_vbar";
+         target: "sb_vbar_show";
+      }
+      program {
+         signal: "elm,action,hide,vbar"; source: "elm";
+         action: STATE_SET "hidden" 0.0;
+         target: "sb_vbar";
+         target: "sb_vbar_show";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a1";
+         action: STATE_SET "clicked" 0.0;
+         target: "sb_vbar_a1";
+         target: "arrow1_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a1";
+         action: DRAG_VAL_STEP 0.0 -1.0;
+         target: "elm.dragable.vbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_vbar_a1";
+         action: STATE_SET "default" 0.0;
+         target: "sb_vbar_a1";
+         target: "arrow1_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a2";
+         action: STATE_SET "clicked" 0.0;
+         target: "sb_vbar_a2";
+         target: "arrow2_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a2";
+         action: DRAG_VAL_STEP 0.0 1.0;
+         target: "elm.dragable.vbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_vbar_a2";
+         action: STATE_SET "default" 0.0;
+         target: "sb_vbar_a2";
+         target: "arrow2_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_p1";
+         action: DRAG_VAL_PAGE 0.0 -1.0;
+         target: "elm.dragable.vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_p2";
+         action: DRAG_VAL_PAGE  0.0 1.0;
+         target: "elm.dragable.vbar";
+      }
+
+// horiz bar /////////////////////////////////////////////////////////////
+      part { name: "sb_hbar_show"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+//            rel1.offset: -11 -11;
+//            rel2.offset: 10 10;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "sb_hbar"; type: RECT; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 0 1;
+            min: 15 15;
+            align: 0.0 1.0;
+            rel1.relative: 0.0 1.0;
+            rel1.offset: 0 -1;
+            rel2.relative: 0.0 1.0;
+            rel2.to_x: "sb_vbar";
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            min: 0 0;
+            max: 99999 0;
+         }
+      }
+      part { name: "sb_hbar_base"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "sb_hbar_a1";
+            rel2.relative: 0.0 1.0;
+            rel2.to: "sb_hbar_a2";
+         }
+      }
+      part { name: "sb_hbar_p1"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "sb_hbar_a1";
+            rel2.relative: 0.0 1.0;
+            rel2.to: "elm.dragable.hbar";
+         }
+      }
+      part { name: "sb_hbar_p2"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "elm.dragable.hbar";
+            rel2.relative: 0.0 1.0;
+            rel2.to: "sb_hbar_a2";
+         }
+      }
+      part { name: "elm.dragable.hbar"; type: RECT;
+         clip_to: "sb_hbar";
+         scale: 1;
+         dragable.x: 1 1 0;
+         dragable.y: 0 0 0;
+         dragable.confine: "sb_hbar_base";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 15 15;
+            rel1.relative: 0.5  0.5;
+            rel1.to: "sb_hbar_base";
+            rel2.relative: 0.5  0.5;
+            rel2.to: "sb_hbar_base";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "sb_hbar_a1"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 15 15;
+            align: 0.0 0.5;
+            aspect: 1.0 1.0; aspect_preference: VERTICAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_hbar";
+            rel2.to: "sb_hbar";
+            rel2.relative: 0.0 1.0;
+            rel2.offset: 0 -1;
+         }
+      }
+      part { name: "sb_hbar_a2"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 15 15;
+            align: 1.0 0.5;
+            aspect: 1.0 1.0; aspect_preference: VERTICAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_hbar";
+            rel1.offset: -1 0;
+            rel1.relative: 1.0 0.0;
+            rel2.to: "sb_hbar";
+         }
+      }
+      program {
+         signal: "elm,action,show,hbar"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "sb_hbar";
+         target: "sb_hbar_show";
+      }
+      program {
+         signal: "elm,action,hide,hbar"; source: "elm";
+         action: STATE_SET "hidden" 0.0;
+         target: "sb_hbar";
+         target: "sb_hbar_show";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a1";
+         action: STATE_SET "clicked" 0.0;
+         target: "sb_hbar_a1";
+         target: "arrow1_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a1";
+         action: DRAG_VAL_STEP -1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_hbar_a1";
+         action: STATE_SET "default" 0.0;
+         target: "sb_hbar_a1";
+         target: "arrow1_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a2";
+         action: STATE_SET "clicked" 0.0;
+         target: "sb_hbar_a2";
+         target: "arrow2_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a2";
+         action: DRAG_VAL_STEP 1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_hbar_a2";
+         action: STATE_SET "default" 0.0;
+         target: "sb_hbar_a2";
+         target: "arrow2_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_p1";
+         action: DRAG_VAL_PAGE -1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_p2";
+         action: DRAG_VAL_PAGE  1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+
+      part { name: "bg"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.background";
+            rel2.to: "elm.swallow.background";
+//            color: 64 64 64 200;
+            color: 0 0 0 0;
+            color_class: "scrollframe_base";
+         }
+      }
+      part { name: "clipper"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.background";
+            rel2.to: "elm.swallow.background";
+         }
+      }
+      part { name: "elm.swallow.background"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.offset: 1 1;
+            rel2.relative: 0.0 0.0;
+            rel2.offset: -2 -2;
+            rel2.to_x: "sb_vbar";
+            rel2.to_y: "sb_hbar";
+         }
+      }
+      part { name: "elm.swallow.content"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.offset: 1 1;
+            rel2.relative: 0.0 0.0;
+            rel2.offset: -2 -2;
+            rel2.to_x: "sb_vbar";
+            rel2.to_y: "sb_hbar";
+         }
+      }
+      part { name: "elm.swallow.overlay"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+         }
+      }
+      part { name: "runner_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            image.normal: "runner_vert.png";
+            image.border: 0 0 2 2;
+            rel1.to: "sb_vbar_base";
+            rel2.to: "sb_vbar_base";
+            fill.smooth: 0;
+            min: 3 4;
+            max: 3 99999;
+         }
+      }
+      part { name: "runner_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            image.normal: "runner_horiz.png";
+            image.border: 2 2 0 0;
+            rel1.to: "sb_hbar_base";
+            rel2.to: "sb_hbar_base";
+            fill.smooth: 0;
+            min: 4 3;
+            max: 99999 3;
+         }
+      }
+      part { name: "runner_vbar_clip"; type: RECT;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            min: 1 1;
+            max: 1 99999;
+            rel1.to: "runner_vbar";
+            rel1.offset: 0 1;
+            rel2.to: "runner_vbar";
+            rel2.offset: -1 -2;
+         }
+      }
+      part { name: "runner_hbar_clip"; type: RECT;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            min: 1 1;
+            max: 99999 1;
+            rel1.to: "runner_hbar";
+            rel1.offset: 1 0;
+            rel2.to: "runner_hbar";
+            rel2.offset: -2 -1;
+         }
+      }
+
+      part { name: "arrow1_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_vbar_a1";
+            rel2.to: "sb_vbar_a1";
+            image.normal: "sym_up_light_normal.png";
+            FIXED_SIZE(15, 15)
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "sym_up_glow_normal.png";
+         }
+      }
+      part { name: "arrow2_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_vbar_a2";
+            rel2.to: "sb_vbar_a2";
+            image.normal: "sym_down_light_normal.png";
+            FIXED_SIZE(15, 15)
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "sym_down_glow_normal.png";
+         }
+      }
+      part { name: "shadow_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.offset: -3 -2;
+            rel1.to: "base_vbar";
+            rel2.offset: 2 4;
+            rel2.to: "base_vbar";
+            image.normal: "shadow_square_tiny.png";
+            image.border: 6 6 6 6;
+            fill.smooth: 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            rel1.offset: -2 -2;
+            rel2.offset: 1 1;
+            color: 255 255 255 128;
+         }
+      }
+      part { name: "glow_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.offset: -3 -3;
+            rel1.to: "base_vbar";
+            rel2.offset: 2 2;
+            rel2.to: "base_vbar";
+            image.normal: "glow_small.png";
+            image.border: 7 7 7 7;
+            fill.smooth: 0;
+            visible: 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "runner_glow_vbar"; mouse_events: 0;
+         clip_to: "runner_vbar_clip";
+         description { state: "default" 0.0;
+            rel1.offset: 0 -30;
+            rel1.to_x: "runner_vbar_clip";
+            rel1.to_y: "base_vbar";
+            rel2.offset: -1 29;
+            rel2.to_x: "runner_vbar_clip";
+            rel2.to_y: "base_vbar";
+            image.normal: "runner_glow_vert.png";
+            image.border: 0 0 33 33;
+         }
+      }
+      part { name: "base_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.offset: 2 0;
+            rel1.to: "elm.dragable.vbar";
+            rel2.offset: -3 -1;
+            rel2.to: "elm.dragable.vbar";
+            image.normal: "vgrad_med_lighter.png";
+            fill.smooth: 0;
+            min: 3 13;
+            TILED_HORIZ(120)
+         }
+      }
+      part { name: "bevel_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "base_vbar";
+            rel2.to: "base_vbar";
+            image.normal: "bevel_out.png";
+            image.border: 1 1 1 1;
+            image.middle: 0;
+            fill.smooth: 0;
+            min: 3 3;
+         }
+      }
+      part { name: "center_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "base_vbar";
+            rel2.to: "base_vbar";
+            image.normal: "holes_tiny_vert.png";
+            FIXED_SIZE(3, 11)
+         }
+      }
+      part { name: "center_glow_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "center_vbar";
+            rel2.to: "center_vbar";
+            image.normal: "holes_tiny_glow_vert.png";
+            FIXED_SIZE(11, 17)
+            visible: 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+
+      part { name: "arrow1_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_hbar_a1";
+            rel2.to: "sb_hbar_a1";
+            image.normal: "sym_left_light_normal.png";
+            FIXED_SIZE(15, 15)
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "sym_left_glow_normal.png";
+         }
+      }
+      part { name: "arrow2_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_hbar_a2";
+            rel2.to: "sb_hbar_a2";
+            image.normal: "sym_right_light_normal.png";
+            FIXED_SIZE(15, 15)
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "sym_right_glow_normal.png";
+         }
+      }
+      part { name: "shadow_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.offset: -3 -2;
+            rel1.to: "base_hbar";
+            rel2.offset: 2 4;
+            rel2.to: "base_hbar";
+            image.normal: "shadow_square_tiny.png";
+            image.border: 6 6 6 6;
+            fill.smooth: 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            rel1.offset: -2 -2;
+            rel2.offset: 1 1;
+            color: 255 255 255 128;
+         }
+      }
+      part { name: "glow_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.offset: -3 -3;
+            rel1.to: "base_hbar";
+            rel2.offset: 2 2;
+            rel2.to: "base_hbar";
+            image.normal: "glow_small.png";
+            image.border: 7 7 7 7;
+            fill.smooth: 0;
+            visible: 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "runner_glow_hbar"; mouse_events: 0;
+         clip_to: "runner_hbar_clip";
+         description { state: "default" 0.0;
+            rel1.offset: -30 0;
+            rel1.to_x: "base_hbar";
+            rel1.to_y: "runner_hbar_clip";
+            rel2.offset: 29 -1;
+            rel2.to_x: "base_hbar";
+            rel2.to_y: "runner_hbar_clip";
+            image.normal: "runner_glow_horiz.png";
+            image.border: 33 33 0 0;
+         }
+      }
+      part { name: "base_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.offset: 0 2;
+            rel1.to: "elm.dragable.hbar";
+            rel2.offset: -1 -3;
+            rel2.to: "elm.dragable.hbar";
+            image.normal: "vgrad_med_lighter.png";
+            fill.smooth: 0;
+            min: 13 3;
+            TILED_HORIZ(120)
+         }
+      }
+      part { name: "bevel_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "base_hbar";
+            rel2.to: "base_hbar";
+            image.normal: "bevel_out.png";
+            image.border: 1 1 1 1;
+            image.middle: 0;
+            fill.smooth: 0;
+            min: 3 3;
+         }
+      }
+      part { name: "center_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "base_hbar";
+            rel2.to: "base_hbar";
+            image.normal: "holes_tiny_horiz.png";
+            FIXED_SIZE(11, 3)
+         }
+      }
+      part { name: "center_glow_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "center_hbar";
+            rel2.to: "center_hbar";
+            image.normal: "holes_tiny_glow_horiz.png";
+            FIXED_SIZE(17, 11)
+            visible: 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "mouse,down,1*"; source: "elm.dragable.vbar";
+         action: STATE_SET "clicked" 0.0;
+         target: "elm.dragable.vbar";
+         target: "shadow_vbar";
+         target: "glow_vbar";
+         target: "center_glow_vbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "elm.dragable.vbar";
+         action: STATE_SET "default" 0.0;
+         target: "elm.dragable.vbar";
+         target: "shadow_vbar";
+         target: "glow_vbar";
+         target: "center_glow_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "elm.dragable.hbar";
+         action: STATE_SET "clicked" 0.0;
+         target: "elm.dragable.hbar";
+         target: "shadow_hbar";
+         target: "glow_hbar";
+         target: "center_glow_hbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "elm.dragable.hbar";
+         action: STATE_SET "default" 0.0;
+         target: "elm.dragable.hbar";
+         target: "shadow_hbar";
+         target: "glow_hbar";
+         target: "center_glow_hbar";
+      }
+   }
+}
+
+group { name: "elm/ctxpopup/bg/enventor";
+   parts {
+      part { name: "ctxpopup_bg";
+         type: RECT;
+         mouse_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            color: 0 0 0 15;
+         }
+      }
+   }
+   programs {
+      program { name: "clicked_event";
+         signal: "mouse,clicked,1";
+         source: "ctxpopup_bg";
+         action: SIGNAL_EMIT "elm,action,click" "";
+      }
+      program { name: "show";
+         signal: "elm,state,show";
+         source: "elm";
+         action: STATE_SET "visible" 0.0;
+         target: "ctxpopup_bg";
+         transition: LINEAR 0.25;
+      }
+      program { name: "hide";
+         signal: "elm,state,hide";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "ctxpopup_bg";
+         transition: LINEAR 0.25;
+      }
+   }
+}
+
+group { name: "elm/ctxpopup/base/enventor";
+   images {
+      image: "candidates_list_bg.png" COMP;
+   }
+   parts {
+      part { name: "arrow_area_left";
+         type: RECT;
+         mouse_events: 0;
+         clip_to: "ctxpopup_clip";
+         description { state: "default" 0.0;
+            visible: 0;
+            min: 4 0;
+            fixed: 1 1;
+            align: 1 0.5;
+            rel1 {
+               to_y: "base";
+               offset: 2 0;
+            }
+            rel2 {
+               relative:0 1;
+               to:"base";
+               offset: 1 -1;
+            }
+         }
+      }
+      part { name: "arrow_area_right";
+         type: RECT;
+         mouse_events: 0;
+         clip_to: "ctxpopup_clip";
+         description { state: "default" 0.0;
+            visible: 0;
+            min: 4 0;
+            fixed: 1 1;
+            align: 0 0.5;
+            rel1 {
+               relative: 1 0;
+               to:"base";
+               offset: -2 0;
+            }
+            rel2 {
+               to_y: "base";
+               offset: -3 -1;
+            }
+         }
+      }
+      part { name: "arrow_area_up";
+         type: RECT;
+         mouse_events: 0;
+         clip_to: "ctxpopup_clip";
+         description { state: "default" 0.0;
+            visible: 0;
+            min: 0 4;
+            fixed: 1 1;
+            align: 0.5 1;
+            rel1 {
+               to_x: "base";
+               offset: 0 2;
+            }
+            rel2 {
+               relative: 1 0;
+               to:"base";
+               offset: -1 1;
+            }
+         }
+      }
+      part { name: "arrow_area_down";
+         type: RECT;
+         mouse_events: 0;
+         clip_to: "ctxpopup_clip";
+         description { state: "default" 0.0;
+            visible: 0;
+            min: 0 4;
+            fixed: 1 1;
+            align: 0.5 0;
+            rel1 {
+               relative: 0 1;
+               to:"base";
+               offset: 0 -2;
+            }
+            rel2 {
+               to_x: "base";
+               offset: -1 -3;
+            }
+         }
+      }
+      part { name: "elm.swallow.arrow_up";
+         type: SWALLOW;
+         mouse_events: 0;
+         scale: 1;
+         clip_to: "ctxpopup_clip";
+         dragable {
+            x: 1 1 0;
+            y: 1 1 0;
+            confine: "arrow_area_up";
+         }
+         description { state: "default" 0.0;
+            min: 7 4;
+            fixed: 1 1;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.arrow_down";
+         type: SWALLOW;
+         mouse_events: 0;
+         scale: 1;
+         clip_to: "ctxpopup_clip";
+         dragable {
+            x: 1 1 0;
+            y: 1 1 0;
+            confine: "arrow_area_down";
+         }
+         description { state: "default" 0.0;
+            min: 7 4;
+            fixed: 1 1;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.arrow_left";
+         type: SWALLOW;
+         mouse_events: 0;
+         scale: 1;
+         clip_to: "ctxpopup_clip";
+         dragable {
+            x: 1 1 0;
+            y: 1 1 0;
+            confine: "arrow_area_left";
+         }
+         description { state: "default" 0.0;
+            min: 4 7;
+            fixed: 1 1;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.arrow_right";
+         type: SWALLOW;
+         mouse_events: 0;
+         scale: 1;
+         clip_to: "ctxpopup_clip";
+         dragable {
+            x: 1 1 0;
+            y: 1 1 0;
+            confine: "arrow_area_right";
+         }
+         description { state: "default" 0.0;
+            min: 4 7;
+            fixed: 1 1;
+            visible: 1;
+         }
+      }
+      part { name: "base";
+         type: SPACER;
+         scale: 1;
+         description { state: "default" 0.0;
+         }
+      }
+      part { name: "shadow";
+         type: RECT;
+         scale: 1;
+         mouse_events: 0;
+         clip_to: "ctxpopup_clip";
+         description { state: "default" 0.0;
+            rel1.to: "base";
+            rel2.to: "base";
+            color: 0 0 0 28;
+         }
+      }
+      part { name: "elm.swallow.content";
+         type: SWALLOW;
+         clip_to: "ctxpopup_clip";
+         description { state: "default" 0.0;
+            rel1.to: "base";
+            rel2.to: "base";
+            rel1.offset: 1 0;
+            rel2.offset: -2 -4;
+         }
+      }
+      part { name: "overlay";
+         scale: 1;
+         mouse_events: 0;
+         clip_to: "ctxpopup_clip";
+         description { state: "default" 0.0;
+            image { normal: "candidates_list_bg.png";
+               border: 8 8 8 8;
+            }
+            rel1.to: "base";
+            rel2.to: "base";
+            rel1.offset: 1 0;
+            rel2.offset: -2 -4;
+         }
+      }
+      part { name: "ctxpopup_clip";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 255 255 255 0;
+            visible: 0;
+            rel1 { to_x:"arrow_area_left"; to_y:"arrow_area_up"; }
+            rel2 { to_x:"arrow_area_right"; to_y:"arrow_area_down"; }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 255;
+            visible: 1;
+         }
+      }
+   }
+   programs {
+      program { name: "show";
+         signal: "elm,state,show";
+         source: "elm";
+         action: STATE_SET "visible" 0.0;
+         transition: LINEAR 0.25;
+         target: "ctxpopup_clip";
+      }
+      program { name: "hide";
+         signal: "elm,state,hide";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+         transition: LINEAR 0.25;
+         target: "ctxpopup_clip";
+         after: "hide_finished";
+      }
+      program { name: "hide_finished";
+         action: SIGNAL_EMIT "elm,action,hide,finished" "";
+      }
+
+   }
+}
+
+group { name: "elm/ctxpopup/arrow/enventor";
+   alias: "elm/ctxpopup/arrow/enventor";
+   images {
+      image: "candidates_list_arrow_left.png" COMP;
+      image: "candidates_list_arrow_right.png" COMP;
+      image: "candidates_list_arrow_up.png" COMP;
+      image: "candidates_list_arrow_down.png" COMP;
+   }
+   parts {
+      part { name: "ctxpopup_arrow";
+         type: IMAGE;
+         scale: 1;
+         description {
+            state: "default" 0.0;
+            min: 7 7;
+            fixed: 1 1;
+            visible: 0;
+            align: 0.5 0.5;
+         }
+         description {
+            state: "left" 0.0;
+            min: 4 7;
+            fixed: 1 1;
+            align: 1.0 0.5;
+            image { normal: "candidates_list_arrow_left.png"; }
+         }
+         description { state: "right" 0.0;
+            min: 4 7;
+            fixed: 1 1;
+            align: 0.0 0.5;
+            image { normal: "candidates_list_arrow_right.png"; }
+         }
+         description { state: "top" 0.0;
+            min: 7 4;
+            fixed: 1 1;
+            align: 0.5 1.0;
+            image { normal: "candidates_list_arrow_up.png"; }
+         }
+         description { state: "bottom" 0.0;
+            min: 7 4;
+            fixed: 1 1;
+            align: 0.5 0.0;
+            image { normal: "candidates_list_arrow_down.png"; }
+         }
+      }
+   }
+   programs {
+      program { name: "enable_left_arrow";
+         signal: "elm,state,left";
+         source: "elm";
+         action: STATE_SET "left" 0.0;
+         target: "ctxpopup_arrow";
+      }
+      program { name: "enable_right_arrow";
+         signal: "elm,state,right";
+         source: "elm";
+         action: STATE_SET "right" 0.0;
+         target: "ctxpopup_arrow";
+      }
+      program { name: "enable_top_arrow";
+         signal: "elm,state,top";
+         source: "elm";
+         action: STATE_SET "top" 0.0;
+         target: "ctxpopup_arrow";
+      }
+      program { name: "enable_bottom_arrow";
+         signal: "elm,state,bottom";
+         source: "elm";
+         action: STATE_SET "bottom" 0.0;
+         target: "ctxpopup_arrow";
+      }
+   }
+}
+
+//Tizen Only
+group { name: "elm/list/item/enventor";
+   alias: "elm/list/item_compress/enventor";
+   script {
+      public item_selected = 0;
+   }
+   data.item: "stacking" "above";
+   parts {
+      part { name: "base";
+         type: SPACER;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 0 22;
+         }
+      }
+      part { name: "bg";
+         type: RECT;
+         scale: 1;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: 255 255 255 255;
+         }
+         description { state: "selected" 0.0;
+            color: 0 138 238 255;
+         }
+         description { state: "hovered" 0.0;
+            color: 205 233 255 255;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         scale: 1;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: COL_NM;
+            rel1.offset: 8 0;
+            rel2.offset: -9 -1;
+            text {
+               font: FN;
+               size: 13;
+               min: 1 1;
+               align: 0.0 0.5;
+               text_class: "list_item";
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "event";
+         type: RECT;
+         scale: 1;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program { name: "go_active";
+         signal: "elm,state,selected";
+         source: "elm";
+         script {
+            set_int(item_selected, 1);
+            set_state(PART:"bg", "selected", 0.0);
+         }
+      }
+      program { name: "go_passive";
+         signal: "elm,state,unselected";
+         source: "elm";
+         script {
+            set_int(item_selected, 0);
+            set_state(PART:"bg", "default", 0.0);
+         }
+      }
+      program { name: "item_mouse_in";
+         signal: "mouse,in";
+         source: "event";
+         script {
+            if (!get_int(item_selected))
+              set_state(PART:"bg", "hovered", 0.0);
+         }
+      }
+      program { name: "item_mouse_out";
+         signal: "mouse,out";
+         source: "event";
+         script {
+            if (!get_int(item_selected))
+              set_state(PART:"bg", "default", 0.0);
+         }
+      }
+   }
+}
+
+//Tizen Only
+group { name: "elm/list/item_odd/enventor";
+   alias: "elm/list/item_compress_odd/enventor";
+   script {
+      public item_selected = 0;
+   }
+   data.item: "stacking" "below";
+   parts {
+      part { name: "base";
+         type: SPACER;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 0 22;
+         }
+      }
+      part { name: "bg";
+         type: RECT;
+         scale: 1;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: 255 255 255 255;
+         }
+         description { state: "selected" 0.0;
+            color: 0 138 238 255;
+         }
+         description { state: "hovered" 0.0;
+            color: 205 233 255 255;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         scale: 1;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: COL_NM;
+            rel1.offset: 8 0;
+            rel2.offset: -9 -1;
+            text {
+               font: FN;
+               size: 13;
+               min: 1 1;
+               align: 0.0 0.5;
+               text_class: "list_item";
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "event";
+         type: RECT;
+         scale: 1;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program { name: "go_active";
+         signal: "elm,state,selected";
+         source: "elm";
+         script {
+            set_int(item_selected, 1);
+            set_state(PART:"bg", "selected", 0.0);
+         }
+      }
+      program { name: "go_passive";
+         signal: "elm,state,unselected";
+         source: "elm";
+         script {
+            set_int(item_selected, 0);
+            set_state(PART:"bg", "default", 0.0);
+         }
+      }
+      program { name: "item_mouse_in";
+         signal: "mouse,in";
+         source: "event";
+         script {
+            if (!get_int(item_selected))
+              set_state(PART:"bg", "hovered", 0.0);
+         }
+      }
+      program { name: "item_mouse_out";
+         signal: "mouse,out";
+         source: "event";
+         script {
+            if (!get_int(item_selected))
+              set_state(PART:"bg", "default", 0.0);
+         }
+      }
+   }
+}
+
+group { name: "elm/panes/vertical/enventor";
+   images {
+      image: "window_scale_controller.png" COMP;
+      image: "window_scale_controller_push.png" COMP;
+      image: "window_scale_controller_hover.png" COMP;
+      image: "window_scale_controller_top.png" COMP;
+      image: "window_scale_controller_top_push.png" COMP;
+      image: "window_scale_controller_top_hover.png" COMP;
+      image: "window_scale_controller_bottom.png" COMP;
+      image: "window_scale_controller_bottom_push.png" COMP;
+      image: "window_scale_controller_bottom_hover.png" COMP;
+   }
+   parts {
+      part { name: "whole";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "left_bg"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.left";
+            rel2.to: "elm.swallow.left";
+            color: 255 255 255 255;
+         }
+      }
+      part { name: "right_bg"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.right";
+            rel2.to: "elm.swallow.right";
+            color: 255 255 255 255;
+         }
+      }
+      part { name: "whole_left";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel2.to_x: "elm.bar";
+            rel2.relative: 0.0 1.0;
+         }
+      }
+      part { name: "elm.swallow.left";
+         type: SWALLOW;
+         clip_to: "whole_left";
+         description { state: "default" 0.0;
+            rel1.to: "whole_left";
+            rel2.to: "whole_left";
+         }
+      }
+      part { name: "whole_right";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to_x: "elm.bar";
+            rel1.relative: 1.0 0.0;
+         }
+      }
+      part { name: "elm.swallow.right";
+         type: SWALLOW;
+         clip_to: "whole_right";
+         description { state: "default" 0.0;
+            rel1.to: "whole_right";
+            rel2.to: "whole_right";
+         }
+      }
+      part { name: "bar_top";
+         description { state: "default" 0.0;
+            max: 7 9999;
+            min: 7 2;
+            fixed: 1 1;
+            rel1.to_x: "elm.bar";
+            rel2 { to_x: "elm.bar"; to_y: "bar_middle"; }
+            rel2.relative: 1.0 0.0;
+            align: 0.5 0;
+            image {
+               normal: "window_scale_controller_top.png";
+               border: 0 0 47 0;
+            }
+            fill.smooth: 0;
+         }
+         description { state: "pressed" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "window_scale_controller_top_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit:  "default" 0.0;
+            image.normal: "window_scale_controller_top_hover.png";
+         }
+      }
+      part { name: "bar_middle";
+         description { state: "default" 0.0;
+            max: 7 15;
+            min: 7 15;
+            fixed: 1 1;
+            rel1.to: "elm.bar";
+            rel2.to: "elm.bar";
+            rel1.relative: 0.0 0.5;
+            rel2.relative: 1.0 0.5;
+            image {
+               normal: "window_scale_controller.png";
+            }
+         }
+         description { state: "pressed" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "window_scale_controller_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit:  "default" 0.0;
+            image.normal: "window_scale_controller_hover.png";
+         }
+      }
+      part { name: "bar_bottom";
+         description { state: "default" 0.0;
+            max: 7 9999;
+            min: 7 2;
+            fixed: 1 1;
+            rel1 { to_x: "elm.bar"; to_y: "bar_middle"; }
+            rel2.to_x: "elm.bar";
+            rel1.relative: 0.0 1.0;
+            align: 0.5 1;
+            image {
+               normal: "window_scale_controller_bottom.png";
+               border: 0 0 0 1;
+            }
+            fill.smooth: 0;
+         }
+         description { state: "pressed" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "window_scale_controller_bottom_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit:  "default" 0.0;
+            image.normal: "window_scale_controller_bottom_hover.png";
+         }
+      }
+      part { name: "elm.bar";
+         type: SPACER;
+         dragable {
+            confine: "whole";
+            x: 1 1 1;
+            y: 0 0 0;
+         }
+         description { state: "default" 0.0;
+            max: 7 9999;
+            min: 7 19;
+            fixed: 1 1;
+            rel1.relative: 0.0 0.5;
+            rel2.relative: 1.0 0.5;
+         }
+      }
+      part { name: "bar";
+         type: RECT;
+         dragable.events: "elm.bar";
+         mouse_events: 1;
+         ignore_flags: ON_HOLD;
+         description { state: "default" 0.0;
+            rel1.to_x: "elm.bar";
+            rel2.to_x: "elm.bar";
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program {
+         name:   "bar_pressed";
+         signal: "mouse,down,1";
+         source: "bar";
+         action: SIGNAL_EMIT "elm,action,press" "";
+         after: "bar_pressed_anim";
+      }
+      program {
+         name:   "bar_pressed_anim";
+         action: STATE_SET "pressed" 0.0;
+         target: "bar_top";
+         target: "bar_middle";
+         target: "bar_bottom";
+      }
+      program {
+         name:   "bar_unpressed";
+         signal: "mouse,up,1";
+         source: "bar";
+         action: SIGNAL_EMIT "elm,action,unpress" "";
+         after: "bar_unpressed_anim";
+      }
+      program {
+         name:   "bar_unpressed_anim";
+         action: STATE_SET "default" 0.0;
+         target: "bar_top";
+         target: "bar_middle";
+         target: "bar_bottom";
+      }
+      program {
+         name:   "bar_mouse_in";
+         signal: "mouse,in";
+         source: "bar";
+         action: STATE_SET "hovered" 0.0;
+         target: "bar_top";
+         target: "bar_middle";
+         target: "bar_bottom";
+      }
+      program {
+         name:   "bar_mouse_out";
+         signal: "mouse,out";
+         source: "bar";
+         action: STATE_SET "default" 0.0;
+         target: "bar_top";
+         target: "bar_middle";
+         target: "bar_bottom";
+      }
+      program {
+         name:   "bar_clicked";
+         signal: "mouse,clicked,1";
+         source: "bar";
+         action: SIGNAL_EMIT "elm,action,click" "";
+      }
+      program {
+         name:   "bar_double_clicked";
+         signal: "mouse,down,1,double";
+         source: "bar";
+         action: SIGNAL_EMIT "elm,action,click,double" "";
+      }
+   }
+}
+
+group { name: "elm/button/base/enventor";
+#define ICON     1
+#define LABEL    2
+#define MASK     3
+#define DISABLE  4
+   script {
+      public btmode;
+      public eval_mode(m) {
+         new m1 = m & MASK;
+         new d = m & DISABLE;
+         if (m1 == (ICON | LABEL)) {
+            if (!d) {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"sizer.content", "visible", 0.0);
+               set_state(PART:"elm.text", "visible", 0.0);
+               set_state(PART:"icon_clip", "default", 0.0);
+               set_state(PART:"event", "default", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"sizer.content", "visible", 0.0);
+               set_state(PART:"elm.text", "disabled_visible", 0.0);
+               set_state(PART:"icon_clip", "disabled", 0.0);
+               set_state(PART:"event", "disabled", 0.0);
+            }
+         } else if (m1 == (ICON)) {
+            if (!d) {
+               set_state(PART:"elm.swallow.content", "icononly", 0.0);
+               set_state(PART:"sizer.content", "icononly", 0.0);
+               set_state(PART:"elm.text", "default", 0.0);
+               set_state(PART:"icon_clip", "default", 0.0);
+               set_state(PART:"event", "default", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.content", "icononly", 0.0);
+               set_state(PART:"sizer.content", "icononly", 0.0);
+               set_state(PART:"elm.text", "default", 0.0);
+               set_state(PART:"icon_clip", "disabled", 0.0);
+               set_state(PART:"event", "disabled", 0.0);
+            }
+         } else if (m1 == (LABEL)) {
+            if (!d) {
+               set_state(PART:"elm.swallow.content", "default", 0.0);
+               set_state(PART:"sizer.content", "default", 0.0);
+               set_state(PART:"elm.text", "textonly", 0.0);
+               set_state(PART:"icon_clip", "default", 0.0);
+               set_state(PART:"event", "default", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.content", "default", 0.0);
+               set_state(PART:"sizer.content", "default", 0.0);
+               set_state(PART:"elm.text", "disabled_textonly", 0.0);
+               set_state(PART:"icon_clip", "disabled", 0.0);
+               set_state(PART:"event", "disabled", 0.0);
+            }
+         } else {
+            if (!d) {
+               set_state(PART:"elm.swallow.content", "default", 0.0);
+               set_state(PART:"sizer.content", "default", 0.0);
+               set_state(PART:"icon_clip", "default", 0.0);
+               set_state(PART:"event", "default", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.content", "default", 0.0);
+               set_state(PART:"sizer.content", "default", 0.0);
+               set_state(PART:"icon_clip", "disabled", 0.0);
+               set_state(PART:"event", "disabled", 0.0);
+            }
+         }
+      }
+   }
+   parts {
+      spacer { "base";
+         desc { "default";
+         }
+      }
+      rect { "icon_clip";
+         desc { "default";
+         }
+         desc { "disabled";
+            inherit: "default";
+            color: 255 255 255 64;
+         }
+      }
+      swallow { "elm.swallow.content";
+         clip_to: "icon_clip";
+         scale: 1;
+         desc { "default";
+            fixed: 1 0;
+            align: 0.0 0.5;
+            rel1.offset: 0 4;
+            rel1.to: "base";
+            rel2.relative: 0.0 1.0;
+            rel2.to: "base";
+            min: 30 30;
+            max: 30 30;
+            visible: 0;
+         }
+         desc { "visible";
+            inherit: "default";
+            fixed: 1 0;
+            aspect: 1.0 1.0;
+            visible: 1;
+         }
+         desc { "icononly";
+            inherit: "default";
+            fixed: 1 1;
+            align: 0 0.5;
+            visible: 1;
+         }
+      }
+      text { "sizer.content"; nomouse;
+         scale: 1;
+         desc { "default";
+            fixed: 1 1;
+            visible: 0;
+            text { font: FN; size: 10;
+               min: 0 0;
+               text_class: "button_text";
+               ellipsis: -1;
+            }
+         }
+         desc { "visible";
+            inherit: "default";
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            text {
+               min: 1 1;
+               ellipsis: -1;
+               text: "M";
+            }
+         }
+         desc { "icononly";
+            inherit: "default";
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            text {
+               min: 1 1;
+               ellipsis: -1;
+               text: "M";
+            }
+         }
+      }
+      text { "elm.text"; nomouse;
+         effect: GLOW;
+         scale: 1;
+         desc { "default";
+            rel1.relative: 1.0 0.0;
+            rel1.to_x: "elm.swallow.content";
+            rel1.to_y: "base";
+            rel2.to: "base";
+            color: COL_HI;
+            text { font: FN; size: 10;
+               align: 0.5 0.5;
+               min: 0 0;
+               text_class: "button_anchor";
+            }
+            visible: 0;
+         }
+         desc { "visible";
+            inherit: "default";
+            rel1.offset: 2 0;
+            text.min: 1 1;
+            text.ellipsis: -1;
+            visible: 1;
+         }
+         desc { "textonly";
+            inherit: "default";
+            text.min: 1 1;
+            text.ellipsis: -1;
+            visible: 1;
+         }
+         desc { "disabled_visible";
+            inherit: "default";
+            rel1.offset: 0 0;
+            color_class: "button_text_anchor_disabled";
+            text.min: 1 1;
+            text.ellipsis: -1;
+            visible: 1;
+         }
+         desc { "disabled_textonly";
+            inherit: "default";
+            color_class: "button_text_anchor_disabled";
+            text.min: 1 1;
+            text.ellipsis: -1;
+            visible: 1;
+         }
+      }
+      text { "text2"; nomouse;
+         effect: GLOW;
+         scale: 1;
+         desc { "default";
+            fixed: 1 1;
+            rel1.to: "elm.text";
+            rel2.to: "elm.text";
+            color: COL_HI;
+            text { font: FN; size: 10;
+               text_source: "elm.text";
+               min: 1 1;
+               ellipsis: -1;
+               text_class: "button_anchor";
+            }
+            visible: 0;
+         }
+         desc { "clicked";
+            inherit: "default";
+            visible: 1;
+         }
+      }
+      rect { "event";
+         repeat_events: 1;
+         desc { "default";
+            color: 0 0 0 0;
+         }
+         desc { "disabled";
+            inherit: "default";
+            visible: 0;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "mouse,down,1"; source: "event";
+         action: SIGNAL_EMIT "elm,action,press" "elm";
+         after: "button_click_anim";
+      }
+      program { name: "button_click_anim";
+         action: STATE_SET "clicked" 0.0;
+         target: "text2";
+      }
+      program {
+         signal: "mouse,up,1"; source: "event";
+         action: SIGNAL_EMIT "elm,action,unpress" "elm";
+         after: "button_unclick_anim";
+      }
+      program { name: "button_unclick_anim";
+         action: STATE_SET "default" 0.0;
+         target: "text2";
+      }
+      program {
+         signal: "elm,anim,activate"; source: "elm";
+         action: STATE_SET "clicked" 0.0;
+         target: "base";
+         target: "text2";
+         after: "button_unpressed_anim";
+      }
+      program { name: "button_unpressed_anim";
+         action: STATE_SET "default" 0.0;
+         in: 0.5 0.0;
+         target: "base";
+         target: "text2";
+      }
+      program {
+         signal: "mouse,clicked,1"; source: "event";
+         action: SIGNAL_EMIT "elm,action,click" "elm";
+      }
+      program { name: "button_text_visible";
+         signal: "elm,state,text,visible"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m |= LABEL; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "button_text_hidden";
+         signal: "elm,state,text,hidden"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m &= ~LABEL; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "button_icon_visible";
+         signal: "elm,state,icon,visible"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m |= ICON; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "button_icon_hidden";
+         signal: "elm,state,icon,hidden"; source: "elm";
+         action:  STATE_SET "default" 0.0;
+         script {
+            new m = get_int(btmode);
+            m &= ~ICON; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "button_state_disabled";
+         signal: "elm,state,disabled"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m |= DISABLE; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "button_state_enabled";
+         signal: "elm,state,enabled"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m &= ~DISABLE; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+   }
+#undef ICON
+#undef LABEL
+#undef MASK
+#undef DISABLE
+}
+
+group { name: "elm/entry/cursor/enventor";
+   min: 1 0;
+   images.image: "white_bar_vert_glow.png" COMP;
+   parts {
+      part { name: "cursor"; mouse_events: 0;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.offset: -4 -4;
+            rel2.offset: 3 3;
+            image.normal: "white_bar_vert_glow.png";
+            image.border: 4 4 4 4;
+            fill.smooth: 0;
+            color: 255 255 255 0;
+            min: 9 10;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 255;
+         }
+      }
+      part { name: "clipper"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "cursor";
+            rel2.to: "cursor";
+            fixed: 1 1;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "selection,start"; source: "elm.text";
+         action: STATE_SET "hidden" 0.0;
+         target: "clipper";
+      }
+      program {
+         signal: "selection,cleared"; source: "elm.text";
+         action: STATE_SET "default" 0.0;
+         target: "clipper";
+      }
+      program {
+         signal: "elm,action,focus"; source: "elm";
+         action: ACTION_STOP;
+         target: "cursor_show";
+         target: "cursor_hide";
+         target: "cursor_show_timer";
+         target: "cursor_hide_timer";
+         after: "cursor_show";
+      }
+      program {
+         signal: "elm,action,unfocus"; source: "elm";
+         action: ACTION_STOP;
+         target: "cursor_show";
+         target: "cursor_hide";
+         target: "cursor_show_timer";
+         target: "cursor_hide_timer";
+         after: "cursor_hide_stop";
+      }
+      program {
+         signal: "elm,action,show,cursor"; source: "elm";
+         action: ACTION_STOP;
+         target: "cursor_show";
+         target: "cursor_hide";
+         target: "cursor_show_timer";
+         target: "cursor_hide_timer";
+         after: "cursor_show";
+      }
+      program { name: "cursor_hide_stop";
+         action: STATE_SET "default" 0.0;
+         target: "cursor";
+      }
+      program { name: "cursor_show";
+         action: STATE_SET "visible" 0.0;
+         target: "cursor";
+         after: "cursor_show_timer";
+      }
+      program { name: "cursor_hide";
+         action: STATE_SET "default" 0.0;
+         target: "cursor";
+         transition: SINUSOIDAL 0.2;
+         after: "cursor_hide_timer";
+      }
+      program { name: "cursor_show_timer";
+         in: 0.5 0.0;
+         after: "cursor_hide";
+      }
+      program { name: "cursor_hide_timer";
+         in: 0.2 0.0;
+         after: "cursor_show";
+      }
+   }
+}
+
+group { name: "elm/entry/selection/enventor";
+   parts {
+      part { name: "base"; type: RECT;
+         description { state: "default" 0.0;
+            color: 51 153 255 255;
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/anchor/enventor";
+   images.image: "horizontal_separated_bar_small_glow.png" COMP;
+   parts {
+      part { name: "bar";
+         description { state: "default" 0.0;
+            image.normal: "horizontal_separated_bar_small_glow.png";
+            image.border: 4 4 4 4;
+            fill.smooth: 0;
+            rel1.relative: 0.0 1.0;
+            rel1.offset: -3 -5;
+            rel2.offset: 2 4;
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/base/enventor";
+   sounds {   
+      sample { name: "key-tap1" LOSSY 64;
+         source: "kbd-tap.wav";
+      }
+      sample { name: "key-tap2" LOSSY 64;
+         source: "kbd-tap2.wav";
+      }
+      sample { name: "key-tap3" LOSSY 64;
+         source: "kbd-tap3.wav";
+      }
+      sample { name: "key-tap4" LOSSY 64;
+         source: "kbd-tap4.wav";
+      }
+      sample { name: "key-tap5" LOSSY 64;
+         source: "kbd-tap5.wav";
+      }
+   }
+
+   styles {
+      style { name: "entry_style";
+         base: "font="FN" font_size=10 color=#ffffff style=shadow,bottom shadow_color=#00000080 wrap=word text_class=enventor_entry color_class=enventor_entry left_margin=2 right_margin=2";
+         ENABLED_TEXTBLOCK_TAGS
+      }
+      style { name: "entry_nowrap_style";
+         base: "font="FN" font_size=10 color=#ffffff text_class=enventor_entry color_class=enventor_entry left_margin=2 right_margin=2";
+         ENABLED_TEXTBLOCK_TAGS
+      }
+      style { name: "entry_disabled_style";
+         base: "font="FN" font_size=10 color=#151515 style=shadow,bottom shadow_color=#ffffff19 wrap=word text_class=enventor_entry color_class=enventor_entry_disabled left_margin=2 right_margin=2";
+         DISABLED_TEXTBLOCK_TAGS
+      }
+      style { name: "entry_nowrap_disabled_style";
+         base: "font="FN" font_size=10 color=#151515 style=shadow,bottom shadow_color=#ffffff19 text_class=enventor_entry color_class=enventor_entry_disabled left_margin=2 right_margin=2";
+         DISABLED_TEXTBLOCK_TAGS
+      }
+      style { name: "entry_guide_style";
+         base: "font="FN" font_size=10 color=#000000 style=shadow,bottom shadow_color=#ffffff19 wrap=word text_class=enventor_entry color_class=enventor_entry_guide left_margin=2 right_margin=2 ellipsis=0.0";
+         DISABLED_TEXTBLOCK_TAGS
+      }
+      style { name: "entry_console_style";
+         base: "font="FN" font_size=11 color=#666666 wrap=word left_margin=15 right_margin=15";
+         DISABLED_TEXTBLOCK_TAGS
+      }
+   }
+//   data.item: "context_menu_orientation" "horizontal";
+   parts {
+      part { name: "elm.guide"; type: TEXTBLOCK; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "elm.text";
+            rel2.to: "elm.text";
+            text { style: "entry_guide_style";
+               min: 0 1;
+               align: 0.0 0.0;
+            }
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "elm.text"; type: TEXTBLOCK;
+         scale: 1;
+         entry_mode: EDITABLE;
+         select_mode: DEFAULT;
+//         select_mode: EXPLICIT;
+         cursor_mode: BEFORE;
+         multiline: 1;
+         source: "elm/entry/selection/enventor"; // selection under
+//         source2: "X"; // selection over
+//         source3: "X"; // cursor under
+         source4: "elm/entry/cursor/enventor"; // cursorover
+//         source5: "elm/entry/anchor/enventor"; // anchor under
+         source6: "elm/entry/anchor/enventor"; // anchor over
+         description { state: "default" 0.0;
+            /* we gotta use 0 0 here, because of scrolled entries */
+            fixed: 0 0;
+            rel1.offset: 2 2;
+            rel2.offset: -3 -3;
+            text { style: "entry_style";
+               min: 0 1;
+               align: 0.0 0.0;
+            }
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            text { style: "entry_disabled_style";
+               min: 0 1;
+            }
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "load"; source: "";
+         action: FOCUS_SET;
+         target: "elm.text";
+      }
+      program {
+         signal: "elm,state,disabled"; source: "elm";
+         action: STATE_SET "disabled" 0.0;
+         target: "elm.text";
+      }
+      program {
+         signal: "elm,state,enabled"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "elm.text";
+      }
+      program {
+         signal: "elm,guide,disabled"; source: "elm";
+         action: STATE_SET "hidden" 0.0;
+         target: "elm.guide";
+      }
+      program {
+         signal: "elm,guide,enabled"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "elm.guide";
+      }
+      program { name: "key-down";
+         signal: "entry,keydown"; source: "elm.text";
+         script {
+            new buf[32];
+            snprintf(buf, 31, "key-down%i", (rand() % 5) + 1);
+            run_program(get_program_id(buf));
+         }
+      }
+      program { name: "key-down1";
+         action: PLAY_SAMPLE "key-tap1" 1.0;
+      }
+      program { name: "key-down2";
+         action: PLAY_SAMPLE "key-tap2" 1.0;
+      }
+      program { name: "key-down3";
+         action: PLAY_SAMPLE "key-tap3" 1.0;
+      }
+      program { name: "key-down4";
+         action: PLAY_SAMPLE "key-tap4" 1.0;
+      }
+      program { name: "key-down5";
+         action: PLAY_SAMPLE "key-tap5" 1.0;
+      }
+   }
+}
+
+group { name: "elm/entry/base-nowrap/enventor";
+   inherit: "elm/entry/base/enventor";
+   parts {
+      part { name: "elm.guide"; type: TEXTBLOCK; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "elm.text";
+            rel2.to: "elm.text";
+            text { style: "entry_guide_style";
+               min: 0 1;
+               align: 0.0 0.0;
+            }
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "elm.text";
+         description { state: "default" 0.0;
+            text { style: "entry_nowrap_style";
+               min: 1 1;
+               ellipsis: -1;
+               align: 0.0 0.0;
+            }
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            text { style: "entry_nowrap_disabled_style";
+               min: 0 1;
+            }
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/base-noedit/enventor_console";
+   inherit: "elm/entry/base/enventor";
+   parts {
+      part { name: "elm.text";
+         entry_mode: PLAIN;
+         description { state: "default" 0.0;
+            text { style: "entry_console_style";
+               min: 0 1;
+               align: 0.0 0.0;
+            }
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/base-nowrap-noedit/enventor";
+   inherit: "elm/entry/base/enventor";
+   parts {
+      part { name: "elm.text";
+         entry_mode: PLAIN;
+         source: "elm/entry/selection/enventor"; // selection under
+         source4: ""; // cursorover
+         source6: "elm/entry/anchor/enventor"; // anchor under
+         description { state: "default" 0.0;
+            text { style: "entry_style";
+               min: 1 1;
+               ellipsis: -1;
+               align: 0.0 0.0;
+            }
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            text { style: "entry_disabled_style";
+            }
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/base/enventor_setting";
+   inherit: "elm/entry/base/enventor";
+   styles {
+      style { name: "setting_entry_style";
+         base: "font="FN" font_size=10 color=#000000 wrap=word text_class=enventor_setting_entry color_class=enventor_setting_entry left_margin=2 right_margin=2";
+         ENABLED_TEXTBLOCK_TAGS
+      }
+      style { name: "setting_entry_disabled_style";
+         base: "font="FN" font_size=10 color=#151515 style=shadow,bottom shadow_color=#ffffff19 wrap=word text_class=enventor_setting_entry color_class=enventor_setting_entry_disabled left_margin=2 right_margin=2";
+         DISABLED_TEXTBLOCK_TAGS
+      }
+      style { name: "setting_entry_guide_style";
+         base: "font="FN" font_size=10 color=#000000 style=shadow,bottom shadow_color=#ffffff19 wrap=word text_class=enventor_setting_entry color_class=enventor_setting_entry_guide left_margin=2 right_margin=2 ellipsis=0.0";
+         DISABLED_TEXTBLOCK_TAGS
+      }
+   }
+//   data.item: "context_menu_orientation" "horizontal";
+   parts {
+      part { name: "elm.guide"; type: TEXTBLOCK; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "elm.text";
+            rel2.to: "elm.text";
+            text { style: "setting_entry_guide_style";
+               min: 0 1;
+               align: 0.0 0.0;
+            }
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/base-nowrap-noedit/enventor_setting";
+   inherit: "elm/entry/base/enventor_setting";
+   parts {
+      part { name: "elm.text";
+         entry_mode: PLAIN;
+         source: "elm/entry/selection/enventor"; // selection under
+         source4: ""; // cursorover
+         source6: "elm/entry/anchor/enventor"; // anchor under
+         description { state: "default" 0.0;
+            text { style: "setting_entry_style";
+               min: 1 1;
+               ellipsis: -1;
+               align: 0.0 0.0;
+            }
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            text { style: "setting_entry_disabled_style";
+            }
+         }
+      }
+   }
+}
+
+
+group { name: "elm/toolbar/item/enventor";
+   data {
+      item: "focusraise" "on";
+      item: "transition_animation_on" "1";
+   }
+   script {
+      public g_selected = 0;
+      public btmode;
+      public eval_mode(m) {
+         new m1 = m & 3;
+         new d = m & 4;
+         if (m1 == (1 | 2)) {
+            if (!d) {
+               set_state(PART:"elm.swallow.icon_new", "default", 0.0);
+               set_state(PART:"elm.text", "default", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.icon_new", "default", 0.0);
+               set_state(PART:"elm.text", "disabled", 0.0);
+            }
+         } else if (m1 == (1)) {
+            if (!d) {
+               set_state(PART:"elm.swallow.icon_new", "icononly", 0.0);
+               set_state(PART:"elm.text", "icononly", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.icon_new", "icononly", 0.0);
+               set_state(PART:"elm.text", "icononly", 0.0);
+            }
+         } else if (m1 == (2)) {
+            if (!d) {
+               set_state(PART:"elm.swallow.icon_new", "noicon", 0.0);
+               set_state(PART:"elm.text", "noicon", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.icon_new", "noicon", 0.0);
+               set_state(PART:"elm.text", "noicon_disabled", 0.0);
+            }
+         } else {
+            if (!d) {
+               set_state(PART:"elm.swallow.icon_new", "noicon", 0.0);
+               set_state(PART:"elm.text", "noicon", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.icon_new", "noicon", 0.0);
+               set_state(PART:"elm.text", "noicon_disabled", 0.0);
+            }
+         }
+      }
+   }
+   parts {
+      part { name: "base";
+         type: SPACER;
+         description { state: "default" 0.0;
+            min: 0 32;
+         }
+      }
+      part { name: "elm.swallow.icon";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+         }
+      }
+      part { name: "bg";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 255 255 255 255;
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+         }
+         description { state: "hover" 0.0;
+            color: 205 233 255 255;
+         }
+      }
+      part { name: "bottom_line";
+         type: RECT;
+         description { state: "default" 0.0;
+            rel1.relative: 0.0 1.0;
+            align: 0.5 1.0;
+            min: 0 1;
+            max: -1 1;
+            fixed: 0 1;
+            color: 173 173 173 255;
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+            min: 0 2;
+            max: -1 2;
+            color: 0 138 238 255;
+         }
+      }
+      part { name: "elm.swallow.icon_new";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+         }
+         description { state: "noicon" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+         description { state: "icononly" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "text_clip1";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 255 255 255 255;
+         }
+         description { state: "animation" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         clip_to: "text_clip1";
+         description { state: "default" 0.0;
+            color: 88 88 88 255;
+            text {
+               font: FN;
+               size: 13;
+               min: 1 1;
+               ellipsis: -1.0;
+            }
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+            color: 0 138 238 255;
+            text {
+               font: FNBD;
+               size: 13;
+               min: 1 1;
+               ellipsis: -1.0;
+            }
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            color: 21 21 21 255;
+            color3: 255 255 255 25;
+         }
+         description { state: "noicon" 0.0;
+            inherit: "default" 0.0;
+         }
+         description { state: "noicon_disabled" 0.0;
+            inherit: "disabled" 0.0;
+         }
+         description { state: "icononly" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+            fixed: 1 1;
+         }
+      }
+      part { name: "event";
+         type: RECT;
+         ignore_flags: "ON_HOLD";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "elm,orient,horizontal";
+         source: "elm";
+         action: STATE_SET "default" 0.00;
+         target: "base";
+      }
+      program { name: "st0";
+         signal: "load";
+         source: "";
+         script {
+            set_int(btmode, 2 | 1);
+         }
+      }
+      program {
+         signal: "elm,state,selected";
+         source: "elm";
+         script {
+            set_int(g_selected, 1);
+            set_state(PART:"elm.text", "selected", 0.0);
+            set_state(PART:"bg", "selected", 0.0);
+            set_state(PART:"bottom_line", "selected", 0.0);
+         }
+      }
+      program {
+         signal: "elm,state,unselected";
+         source: "elm";
+         script {
+            set_int(g_selected, 0);
+            set_state(PART:"elm.text", "default", 0.0);
+            set_state(PART:"bg", "default", 0.0);
+            set_state(PART:"bottom_line", "default", 0.0);
+         }
+      }
+      program {
+         signal: "mouse,up,1";
+         source: "event";
+         action: SIGNAL_EMIT "elm,action,click" "elm";
+      }
+      program {
+         signal: "mouse,in";
+         source: "event";
+         script {
+            if (get_int(g_selected) == 0) {
+               set_state(PART:"bg", "hover", 0.0);
+            }
+            emit("elm,mouse,in", "elm");
+         }
+      }
+      program { name: "mouse,out";
+         signal: "mouse,out";
+         source: "event";
+         script {
+            if (get_int(g_selected) == 0) {
+               set_state(PART:"bg", "default", 0.0);
+            }
+            emit("elm,mouse,out", "elm");
+         }
+      }
+      program { name: "st1";
+         signal: "elm,text,hidden";
+         source: "elm";
+         script {
+            new m = get_int(btmode);
+            m &= ~2; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "st2";
+         signal: "elm,text,visible";
+         source: "elm";
+         script {
+            new m = get_int(btmode);
+            m |= 2; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "st3";
+         signal: "elm,icon,hidden";
+         source: "elm";
+         script {
+            new m = get_int(btmode);
+            m |= 1; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "st4";
+         signal: "elm,icon,visible";
+         source: "elm";
+         script {
+            new m = get_int(btmode);
+            m &= ~1; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "st5";
+         signal: "elm,state,disabled";
+         source: "elm";
+         script {
+            new m = get_int(btmode);
+            m |= 4; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "st6";
+         signal: "elm,state,enabled";
+         source: "elm";
+         script {
+            new m = get_int(btmode);
+            m &= ~4; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program {
+         signal: "elm,state,label_set,forward";
+         source: "elm";
+         after: "label_set,animation";
+      }
+      program {
+         signal: "elm,state,label_set,backward";
+         source: "elm";
+         after: "label_set,animation";
+      }
+      program { name: "label_set,animation";
+         signal: "elm,state,label_set";
+         source: "elm";
+         action: STATE_SET "animation" 0.00;
+         transition: LINEAR 0.20000;
+         target: "text_clip1";
+         after: "label_set,animation,done";
+      }
+      program {
+         signal: "elm,state,label,reset";
+         source: "elm";
+         action: STATE_SET "default" 0.00;
+         target: "text_clip1";
+      }
+      program { name: "label_set,animation,done";
+         action: SIGNAL_EMIT "elm,state,label_set,done" "elm";
+      }
+   }
+}
+
+group { name: "elm/toolbar/base/enventor";
+   parts {
+      part { name: "base";
+         type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+         }
+      }
+      part { name: "clipper";
+         type: RECT;
+         description { state: "default" 0.0;
+            rel1 {
+               to: "base";
+            }
+            rel2 {
+               to: "base";
+            }
+         }
+      }
+      part { name: "elm.swallow.content";
+         type: SWALLOW;
+         scale: 1;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+         }
+      }
+   }
+}
+
+group { name: "elm/radio/base/enventor";
+   images.image: "check.png" COMP;
+   script {
+   public btmode;
+   public eval_mode(m) {
+      new m1 = m & 3;
+      new d = m & 4;
+      if (m1 == (1 | 2)) {
+         if (!d) {
+            set_state(PART:"indicator", "default", 0.0);
+            set_state(PART:"clip", "default", 0.0);
+            set_state(PART:"event", "default", 0.0);
+         } else {
+            set_state(PART:"indicator", "disabled", 0.0);
+            set_state(PART:"clip", "disabled", 0.0);
+            set_state(PART:"event", "disabled", 0.0);
+         }
+      } else if (m1 == (1)) {
+         if (!d) {
+            set_state(PART:"indicator", "default", 0.0);
+            set_state(PART:"clip", "default", 0.0);
+            set_state(PART:"event", "default", 0.0);
+         } else {
+            set_state(PART:"indicator", "disabled", 0.0);
+            set_state(PART:"clip", "disabled", 0.0);
+            set_state(PART:"event", "disabled", 0.0);
+         }
+      } else if (m1 == (2)) {
+         if (!d) {
+            set_state(PART:"indicator", "default", 0.0);
+            set_state(PART:"clip", "default", 0.0);
+            set_state(PART:"event", "default", 0.0);
+         } else {
+            set_state(PART:"indicator", "disabled", 0.0);
+            set_state(PART:"clip", "disabled", 0.0);
+            set_state(PART:"event", "disabled", 0.0);
+         }
+      } else {
+         if (!d) {
+            set_state(PART:"indicator", "default", 0.0);
+            set_state(PART:"clip", "default", 0.0);
+            set_state(PART:"event", "default", 0.0);
+         } else {
+            set_state(PART:"indicator", "disabled", 0.0);
+            set_state(PART:"clip", "disabled", 0.0);
+            set_state(PART:"event", "disabled", 0.0);
+         }
+      }
+   }
+      }
+   parts {
+      part { name: "indicator";
+         type: IMAGE;
+         mouse_events: 0;
+         scale: 1;
+         clip_to: "clip";
+         description { state: "default" 0.0;
+            visible: 0;
+            fixed: 1 1;
+            min: 12 12;
+            max: 12 12;
+            image.normal: "check.png";
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "selected" 0.0;
+         }
+      }
+      part { name: "clip";
+         type: RECT;
+         description { state: "default" 0.0;
+         }
+         description { state: "disabled" 0.0;
+            color: 64 64 64 154;
+         }
+      }
+      part { name: "event";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            visible: 0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program { name: "program_0x18e8dd0";
+         signal: "mouse,clicked,1";
+         source: "event";
+         action: SIGNAL_EMIT "elm,action,radio,toggle" "elm";
+      }
+      program { name: "program_0x18e8ff0";
+         signal: "elm,state,radio,on";
+         source: "elm";
+         action: STATE_SET "selected" 0.00;
+         target: "indicator";
+      }
+      program { name: "program_0x18e92d0";
+         signal: "elm,state,radio,off";
+         source: "elm";
+         action: STATE_SET "default" 0.00;
+         target: "indicator";
+      }
+      program { name: "program_0x18ea520";
+         signal: "elm,state,enabled";
+         source: "elm";
+         script {
+            new m = get_int(btmode);
+            m |= 2; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program { name: "program_0x18ea1e0";
+         signal: "elm,state,disabled";
+         source: "elm";
+         script {
+            new m = get_int(btmode);
+            m &= ~2; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+   }
+}
+
+group { name: "elm/button/base/decrease/enventor";
+   inherit: "elm/button/base/enventor";
+   images {
+      image: "tool_zoom_out_nor.png" COMP;
+      image: "tool_zoom_out_mv.png" COMP;
+   }
+   parts {
+      part { name: "dec_image";
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            min: 7 7;
+            max: 7 7;
+            image {
+               normal: "tool_zoom_out_nor.png";
+            }
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image {
+               normal: "tool_zoom_out_mv.png";
+            }
+         }
+      }
+   }
+   programs {
+      program { name: "button_click_anim";
+         signal: "mouse,down,1";
+         source: "dec_image";
+         action: STATE_SET "clicked";
+         target: "dec_image";
+      }
+      program { name: "button_unclick_anim";
+         signal: "mouse,up,1";
+         source: "dec_image";
+         action: STATE_SET "default";
+         target: "dec_image";
+      }
+   }
+}
+
+group { name: "elm/button/base/increase/enventor";
+   inherit: "elm/button/base/enventor";
+   images {
+      image: "tool_zoom_in_nor.png" COMP;
+      image: "tool_zoom_in_mv.png" COMP;
+   }
+   parts {
+      part { name: "inc_image";
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            min: 7 7;
+            max: 7 7;
+            image {
+               normal: "tool_zoom_in_nor.png";
+            }
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image {
+               normal: "tool_zoom_in_mv.png";
+            }
+         }
+      }
+   }
+   programs {
+      program { name: "button_click_anim";
+         signal: "mouse,down,1";
+         source: "inc_image";
+         action: STATE_SET "clicked";
+         target: "inc_image";
+      }
+      program { name: "button_unclick_anim";
+         signal: "mouse,up,1";
+         source: "inc_image";
+         action: STATE_SET "default";
+         target: "inc_image";
+      }
+   }
+}
diff --git a/data/themes/elm/Makefile.am b/data/themes/elm/Makefile.am
new file mode 100644 (file)
index 0000000..a260840
--- /dev/null
@@ -0,0 +1,34 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = images fonts
+
+EDJE_CC = @edje_cc@
+EDJE_FLAGS = -id $(top_srcdir)/data/themes/elm/images \
+             -fd $(top_srcdir)/data/themes/elm/fonts
+
+filesdir = $(datadir)/$(PACKAGE)/themes/elm
+files_DATA = enventor.edj
+
+EXTRA_DIST = enventor.edc \
+             button.edc \
+             entry.edc \
+             panes.edc \
+             scroller.edc \
+             list.edc \
+             slider.edc \
+             check.edc \
+             hover.edc \
+             menu.edc \
+             colorsel.edc \
+             spinner.edc \
+             tooltip.edc \
+             focus.edc \
+             label.edc
+
+enventor.edj: Makefile $(EXTRA_DIST)
+       $(EDJE_CC) $(EDJE_FLAGS) \
+       $(top_srcdir)/data/themes/elm/enventor.edc \
+       $(top_builddir)/data/themes/elm/enventor.edj
+
+clean-local:
+       rm -f *.edj
diff --git a/data/themes/elm/button.edc b/data/themes/elm/button.edc
new file mode 100644 (file)
index 0000000..e968bb3
--- /dev/null
@@ -0,0 +1,2033 @@
+#define FN_COL_DEFAULT 255 255 255 255; color3: 0 0 0 128
+#define FN_COL_DISABLE 21 21 21 255; color3: 255 255 255 25
+
+group { name: "elm/button/base/default";
+   alias: "elm/button/base/anchor";
+   alias: "elm/button/base/fileselector/default";
+   alias: "elm/button/base/fileselector/actions/default";
+   images {
+      image: "btn_widget.png" COMP;
+      image: "btn_widget_push.png" COMP;
+      image: "btn_widget_disable.png" COMP;
+      image: "btn_widget_hover.png" COMP;
+   }
+   parts {
+      part { name: "button_image";
+         mouse_events: 1;
+         description { state: "default" 0.0;
+            min: 9 9;
+            image {
+               normal: "btn_widget.png";
+               border: 3 3 3 3;
+            }
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image {
+               normal: "btn_widget_push.png";
+               border: 3 3 3 3;
+            }
+         }
+         description { state: "disabled" 0.0;
+            inherit:  "default" 0.0;
+            image {
+               normal: "btn_widget_disable.png";
+               border: 3 3 3 3;
+            }
+         }
+         description { state: "hovered" 0.0;
+            inherit:  "default" 0.0;
+            image {
+               normal: "btn_widget_hover.png";
+               border: 3 3 3 3;
+            }
+         }
+      }
+      part { name: "elm.swallow.content";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            fixed: 1 0;
+            visible: 0;
+            align: 0.0 0.5;
+            rel1.offset: 4 4;
+            rel2.offset: 3 -5;
+            rel2.relative: 0.0 1.0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            fixed: 1 0;
+            visible: 1;
+            aspect: 1.0 1.0;
+                    //               aspect_preference: VERTICAL;
+            rel2.offset: 4 -5;
+         }
+         description { state: "icononly" 0.0;
+            inherit: "default" 0.0;
+            fixed: 0 0;
+            visible: 1;
+            align: 0.5 0.5;
+                   //               aspect: 1.0 1.0;
+            rel2.offset: -5 -5;
+            rel2.relative: 1.0 1.0;
+            //               aspect_preference: VERTICAL;
+         }
+      }
+      part {
+         name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            rel1.to_x: "elm.swallow.content";
+            rel1.relative: 1.0 0.0;
+            rel1.offset: 0 4;
+            rel2.offset: -5 -5;
+            color: COL_NM;
+            text {
+               font: FN;
+               size: 13;
+               min: 0 0;
+               align: 0.5 0.5;
+               text_class: "button";
+               ellipsis: -1;
+            }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            text.min: 1 1;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+         }
+         description { state: "disabled_visible" 0.0;
+            inherit: "default" 0.0;
+            color: 128 128 128 255;
+            visible: 1;
+            text.min: 1 1;
+         }
+      }
+      part { name: "over2";
+         type: RECT;
+         mouse_events: 1;
+         repeat_events: 1;
+         ignore_flags: ON_HOLD;
+         description { state: "default";
+            color: 0 0 0 0;
+         }
+         description { state: "disabled";
+            inherit:  "default";
+            visible: 0;
+         }
+      }
+      part { name: "over3";
+         type: RECT;
+         mouse_events: 1;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit:  "default" 0.0;
+         }
+      }
+      part { name: "disabler";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            visible: 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      // used to force sizing of icon to follow label sizing nearby
+      part { name: "sizer.content"; type: TEXT;
+         mouse_events:  0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            text {
+               font: FN;
+               size: 10;
+               min: 0 0;
+               text_class: "button";
+               ellipsis: -1;
+            }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            text {
+               min: 1 1;
+               text: "M";
+            }
+         }
+         description { state: "icononly" 0.0;
+            inherit: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            text {
+               min: 1 1;
+               text: "M";
+            }
+         }
+      }
+      // end sizer
+   }
+   programs {
+      program {
+         name:   "button_mouse_in";
+         signal: "mouse,in";
+         source: "over2";
+         action: STATE_SET "hovered" 0.0;
+         target: "button_image";
+      }
+      program {
+         name:   "button_mouse_out";
+         signal: "mouse,out";
+         source: "over2";
+         action: STATE_SET "default" 0.0;
+         target: "button_image";
+      }
+      program {
+         name:   "button_click";
+         signal: "mouse,down,1";
+         source: "over2";
+         action: SIGNAL_EMIT "elm,action,press" "";
+         after: "button_click_anim";
+      }
+      program {
+         name:   "button_click_anim";
+         action: STATE_SET "clicked" 0.0;
+         target: "button_image";
+      }
+      program {
+         name:   "button_unclick";
+         signal: "mouse,up,1";
+         source: "over3";
+         action: SIGNAL_EMIT "elm,action,unpress" "";
+         after: "button_unclick_anim";
+      }
+      program {
+         name:   "button_pressed_anim";
+         signal: "elm,anim,activate";
+         source: "elm";
+         action: STATE_SET "clicked" 0.0;
+         target: "button_image";
+         target: "over3";
+         after: "button_unpressed_anim";
+      }
+      program {
+         name:   "button_unpressed_anim";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         target: "button_image";
+         target: "over3";
+      }
+      program {
+         name:   "button_unclick_anim";
+         action: STATE_SET "default" 0.0;
+         target: "button_image";
+      }
+      program {
+         name:   "button_click2";
+         signal: "mouse,down,1";
+         source: "over3";
+         action: STATE_SET "clicked" 0.0;
+         target: "over3";
+      }
+      program {
+         name:   "button_unclick2";
+         signal: "mouse,up,1";
+         source: "over3";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         target: "over3";
+      }
+      program {
+         name:   "button_unclick3";
+         signal: "mouse,clicked,1";
+         source: "over2";
+         action: SIGNAL_EMIT "elm,action,click" "";
+      }
+      program { name: "text_show";
+         signal: "elm,state,text,visible";
+         source: "elm";
+         script {
+            new st[31];
+            new Float:vl;
+            get_state(PART:"elm.swallow.content", st, 30, vl);
+            if (!strcmp(st, "icononly")) {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"sizer.content", "visible", 0.0);
+            }
+            get_state(PART:"elm.text", st, 30, vl);
+            if (!strcmp(st, "disabled") || (!strcmp(st, "disabled_visible")))
+              set_state(PART:"elm.text", "disabled_visible", 0.0);
+            else
+              set_state(PART:"elm.text", "visible", 0.0);
+         }
+      }
+      program { name: "text_hide";
+         signal: "elm,state,text,hidden";
+         source: "elm";
+         script {
+            new st[31];
+            new Float:vl;
+            get_state(PART:"elm.swallow.content", st, 30, vl);
+            if (!strcmp(st, "visible")) {
+               set_state(PART:"elm.swallow.content", "icononly", 0.0);
+               set_state(PART:"sizer.content", "icononly", 0.0);
+            }
+            set_state(PART:"elm.text", "default", 0.0);
+            get_state(PART:"elm.text", st, 30, vl);
+            if (!strcmp(st, "default") || (!strcmp(st, "visible")))
+              set_state(PART:"elm.text", "default", 0.0);
+            else
+              set_state(PART:"elm.text", "disabled", 0.0);
+         }
+      }
+      program { name: "icon_show";
+         signal: "elm,state,icon,visible";
+         source: "elm";
+         script {
+            new st[31];
+            new Float:vl;
+            get_state(PART:"elm.text", st, 30, vl);
+            if (!strcmp(st, "visible")) {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"sizer.content", "visible", 0.0);
+            }
+            else {
+               set_state(PART:"elm.swallow.content", "icononly", 0.0);
+               set_state(PART:"sizer.content", "icononly", 0.0);
+            }
+         }
+      }
+      program { name: "icon_hide";
+         signal: "elm,state,icon,hidden";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "elm.swallow.content";
+         target: "sizer.content";
+      }
+      program { name: "disable";
+         signal: "elm,state,disabled";
+         source: "elm";
+         script {
+            new st[31];
+            new Float:vl;
+            set_state(PART:"button_image", "disabled", 0.0);
+            set_state(PART:"over2", "disabled", 0.0);
+            set_state(PART:"disabler", "disabled", 0.0);
+            get_state(PART:"elm.text", st, 30, vl);
+            if (!strcmp(st, "visible") || !strcmp(st, "disabled_visible"))
+              set_state(PART:"elm.text", "disabled_visible", 0.0);
+            else
+              set_state(PART:"elm.text", "disabled", 0.0);
+         }
+      }
+      program { name: "enable";
+         signal: "elm,state,enabled";
+         source: "elm";
+         script {
+            new st[31];
+            new Float:vl;
+            set_state(PART:"button_image", "default", 0.0);
+            set_state(PART:"over2", "default", 0.0);
+            set_state(PART:"disabler", "default", 0.0);
+            get_state(PART:"elm.text", st, 30, vl);
+            if (!strcmp(st, "visible") || !strcmp(st, "disabled_visible"))
+              set_state(PART:"elm.text", "visible", 0.0);
+            else
+              set_state(PART:"elm.text", "default", 0.0);
+         }
+      }
+   }
+}
+
+group { name: "elm/button/base/tools";
+   script {
+      public disabled = 0;
+   }
+   parts {
+      rect { "icon_highlight";
+         desc { "default";
+         }
+         //This status is for tools selected effect
+         desc { "selected";
+            inherit: "default" 0.0;
+            color: 0 113 130 255;
+         }
+         desc { "clicked";
+            inherit: "selected" 0.0;
+         }
+      }
+      rect { "icon_clip";
+         clip_to: "icon_highlight";
+         desc { "default";
+         }
+         desc { "disabled";
+            inherit: "default";
+            color: 255 255 255 64;
+         }
+      }
+
+      part { name: "base";
+         type: SPACER;
+         description { state: "default" 0.0;
+              rel1.to:"elm.swallow.content";
+              rel2.to:"elm.text";
+         }
+      }
+      part { name: "elm.swallow.content";
+         type: SWALLOW;
+         clip_to: "icon_clip";
+         description { state: "default" 0.0;
+            min: 16 16;
+            max: 16 16;
+            fixed: 1 1;
+            align: 0.0 0.5;
+            rel2.relative: 0.0 1.0;
+            aspect: 1.0 1.0;
+            visible: 0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.content_hover";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            min: 16 16;
+            max: 16 16;
+            fixed: 1 1;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            aspect: 1.0 1.0;
+            visible: 0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.content_push";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            min: 16 16;
+            max: 16 16;
+            fixed: 1 1;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            aspect: 1.0 1.0;
+            visible: 0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.content_disable";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            min: 16 16;
+            max: 16 16;
+            fixed: 1 1;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            aspect: 1.0 1.0;
+            visible: 0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "padding";
+         type: SPACER;
+         description { state: "default" 0.0;
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            rel1.to_x: "elm.swallow.content";
+            rel2.to_x: "elm.swallow.content";
+            min: 4 0;
+            fixed: 1 0;
+            align: 0.0 0.5;
+         }
+      }
+      part {
+         name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.relative: 1.0 0.0;
+            rel1.to_x: "padding";
+            align: 0.0 0.5;
+            color: COL_WH;
+            text {
+               font: FN;
+               size: 13;
+               min: 1 1;
+               align: 0.0 0.5;
+               text_class: "button";
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "over2";
+         type: RECT;
+         mouse_events: 1;
+         repeat_events: 1;
+         ignore_flags: ON_HOLD;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit:  "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "over3";
+         type: RECT;
+         mouse_events: 1;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit:  "default" 0.0;
+         }
+      }
+      part { name: "disabler";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            visible: 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      // used to force sizing of icon to follow label sizing nearby
+      part { name: "sizer.content"; type: TEXT;
+         mouse_events:  0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            text {
+               font: FN;
+               size: 10;
+               min: 0 0;
+               text_class: "button";
+               ellipsis: -1;
+            }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            text {
+               min: 1 1;
+               text: "M";
+            }
+         }
+         description { state: "icononly" 0.0;
+            inherit: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            text {
+               min: 1 1;
+               text: "M";
+            }
+         }
+      }
+   }
+   programs {
+      program {
+         name:   "button_mouse_in";
+         signal: "mouse,in";
+         source: "over2";
+         script {
+            if (get_int(disabled) == 0) {
+               set_state(PART:"elm.swallow.content", "default", 0.0);
+               set_state(PART:"elm.swallow.content_hover", "visible", 0.0);
+               set_state(PART:"elm.swallow.content_push", "default", 0.0);
+               set_state(PART:"elm.swallow.content_disable", "default", 0.0);
+            }
+         }
+      }
+      program {
+         name:   "button_mouse_out";
+         signal: "mouse,out";
+         source: "over2";
+         script {
+            if (get_int(disabled) == 0) {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+               set_state(PART:"elm.swallow.content_push", "default", 0.0);
+               set_state(PART:"elm.swallow.content_disable", "default", 0.0);
+            }
+         }
+      }
+      program {
+         name:   "button_click";
+         signal: "mouse,down,1";
+         source: "over2";
+         action: SIGNAL_EMIT "elm,action,press" "";
+         after: "button_click_anim";
+      }
+      program {
+         name:   "button_click_anim";
+         script {
+            if (get_int(disabled) == 0) {
+               set_state(PART:"elm.swallow.content", "default", 0.0);
+               set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+               set_state(PART:"elm.swallow.content_push", "visible", 0.0);
+               set_state(PART:"elm.swallow.content_disable", "default", 0.0);
+            }
+         }
+      }
+      program {
+         name:   "button_unclick";
+         signal: "mouse,up,1";
+         source: "over3";
+         action: SIGNAL_EMIT "elm,action,unpress" "";
+         after: "button_unclick_anim";
+      }
+      program {
+         name:   "button_pressed_anim";
+         signal: "elm,anim,activate";
+         source: "elm";
+         script {
+            set_state(PART:"elm.swallow.content", "default", 0.0);
+            set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+            set_state(PART:"elm.swallow.content_push", "visible", 0.0);
+            set_state(PART:"elm.swallow.content_disable", "default", 0.0);
+            set_state(PART:"over3", "clicked", 0.0);
+            run_program(PROGRAM:"button_unpressed_anim");
+         }
+      }
+      program {
+         name:   "button_unpressed_anim";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         script {
+            set_state(PART:"elm.swallow.content", "visible", 0.0);
+            set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+            set_state(PART:"elm.swallow.content_push", "default", 0.0);
+            set_state(PART:"elm.swallow.content_disable", "default", 0.0);
+            set_state(PART:"over3", "default", 0.0);
+         }
+      }
+      program {
+         name:   "button_unclick_anim";
+         script {
+            if (get_int(disabled) == 0) {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+               set_state(PART:"elm.swallow.content_push", "default", 0.0);
+               set_state(PART:"elm.swallow.content_disable", "default", 0.0);
+            }
+         }
+      }
+      program {
+         signal: "icon,highlight,enabled"; source: "";
+         action: STATE_SET "selected" "0.0";
+         target: "icon_highlight";
+      }
+      program {
+         signal: "icon,highlight,disabled"; source: "";
+         action: STATE_SET "default" "0.0";
+         target: "icon_highlight";
+      }
+      program {
+         name:   "button_click2";
+         signal: "mouse,down,1";
+         source: "over3";
+         action: STATE_SET "clicked" 0.0;
+         target: "over3";
+      }
+      program {
+         name:   "button_unclick2";
+         signal: "mouse,up,1";
+         source: "over3";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         target: "over3";
+      }
+      program {
+         name:   "button_unclick3";
+         signal: "mouse,clicked,1";
+         source: "over2";
+         action: SIGNAL_EMIT "elm,action,click" "";
+      }
+      program { name: "text_show";
+         signal: "elm,state,text,visible";
+         source: "elm";
+         action:  STATE_SET "visible" 0.0;
+         target: "sizer.content";
+      }
+      program { name: "text_hide";
+         signal: "elm,state,text,hidden";
+         source: "elm";
+         action:  STATE_SET "icononly" 0.0;
+         target: "sizer.content";
+      }
+      program { name: "icon_show";
+         signal: "elm,state,icon,visible";
+         source: "elm";
+         action:  STATE_SET "visible" 0.0;
+         target: "elm.swallow.content";
+         target: "sizer.content";
+      }
+      program { name: "icon_hide";
+         signal: "elm,state,icon,hidden";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "elm.swallow.content";
+         target: "sizer.content";
+      }
+      program { name: "disable";
+         signal: "elm,state,disabled";
+         source: "elm";
+         script {
+            set_state(PART:"elm.swallow.content", "default", 0.0);
+            set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+            set_state(PART:"elm.swallow.content_push", "default", 0.0);
+            set_state(PART:"elm.swallow.content_disable", "visible", 0.0);
+            set_state(PART:"over2", "disabled", 0.0);
+            set_state(PART:"disabler", "disabled", 0.0);
+            set_int(disabled, 1);
+         }
+      }
+      program { name: "enable";
+         signal: "elm,state,enabled";
+         source: "elm";
+         script {
+            set_state(PART:"elm.swallow.content", "visible", 0.0);
+            set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+            set_state(PART:"elm.swallow.content_push", "default", 0.0);
+            set_state(PART:"elm.swallow.content_disable", "default", 0.0);
+            set_state(PART:"over2", "default", 0.0);
+            set_state(PART:"disabler", "default", 0.0);
+            set_int(disabled, 0);
+         }
+      }
+   }
+}
+
+group { name: "elm/button/base/slider";
+   parts {
+      part { name: "base";
+         type: SPACER;
+         description { state: "default" 0.0;
+              rel1.to:"elm.swallow.content";
+              rel2.to:"elm.swallow.content";
+         }
+      }
+      part { name: "elm.swallow.content";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            min: 16 30;
+            max: 16 30;
+            fixed: 1 1;
+            align: 0.0 0.5;
+            rel2.relative: 0.0 1.0;
+            aspect: 1.0 1.0;
+            visible: 0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.content_hover";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            min: 16 30;
+            max: 16 30;
+            fixed: 1 1;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            aspect: 1.0 1.0;
+            visible: 0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.content_push";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            min: 16 30;
+            max: 16 30;
+            fixed: 1 1;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            aspect: 1.0 1.0;
+            visible: 0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "over2";
+         type: RECT;
+         mouse_events: 1;
+         repeat_events: 1;
+         ignore_flags: ON_HOLD;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit:  "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "over3";
+         type: RECT;
+         mouse_events: 1;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit:  "default" 0.0;
+         }
+      }
+      part { name: "disabler";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            visible: 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+   }
+   programs {
+      program {
+         name:   "button_mouse_in";
+         signal: "mouse,in";
+         source: "over2";
+         script {
+            set_state(PART:"elm.swallow.content", "default", 0.0);
+            set_state(PART:"elm.swallow.content_hover", "visible", 0.0);
+            set_state(PART:"elm.swallow.content_push", "default", 0.0);
+         }
+      }
+      program {
+         name:   "button_mouse_out";
+         signal: "mouse,out";
+         source: "over2";
+         script {
+            set_state(PART:"elm.swallow.content", "visible", 0.0);
+            set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+            set_state(PART:"elm.swallow.content_push", "default", 0.0);
+         }
+      }
+      program {
+         name:   "button_click";
+         signal: "mouse,down,1";
+         source: "over2";
+         action: SIGNAL_EMIT "elm,action,press" "";
+         after: "button_click_anim";
+      }
+      program {
+         name:   "button_click_anim";
+         script {
+            set_state(PART:"elm.swallow.content", "default", 0.0);
+            set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+            set_state(PART:"elm.swallow.content_push", "visible", 0.0);
+         }
+      }
+      program {
+         name:   "button_unclick";
+         signal: "mouse,up,1";
+         source: "over3";
+         action: SIGNAL_EMIT "elm,action,unpress" "";
+         after: "button_unclick_anim";
+      }
+      program {
+         name:   "button_pressed_anim";
+         signal: "elm,anim,activate";
+         source: "elm";
+         script {
+            set_state(PART:"elm.swallow.content", "default", 0.0);
+            set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+            set_state(PART:"elm.swallow.content_push", "visible", 0.0);
+            set_state(PART:"over3", "clicked", 0.0);
+            run_program(PROGRAM:"button_unpressed_anim");
+         }
+      }
+      program {
+         name:   "button_unpressed_anim";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         script {
+            set_state(PART:"elm.swallow.content", "visible", 0.0);
+            set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+            set_state(PART:"elm.swallow.content_push", "default", 0.0);
+            set_state(PART:"over3", "default", 0.0);
+         }
+      }
+      program {
+         name:   "button_unclick_anim";
+         script {
+            set_state(PART:"elm.swallow.content", "visible", 0.0);
+            set_state(PART:"elm.swallow.content_hover", "default", 0.0);
+            set_state(PART:"elm.swallow.content_push", "default", 0.0);
+         }
+      }
+      program {
+         name:   "button_click2";
+         signal: "mouse,down,1";
+         source: "over3";
+         action: STATE_SET "clicked" 0.0;
+         target: "over3";
+      }
+      program {
+         name:   "button_unclick2";
+         signal: "mouse,up,1";
+         source: "over3";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         target: "over3";
+      }
+      program {
+         name:   "button_unclick3";
+         signal: "mouse,clicked,1";
+         source: "over2";
+         action: SIGNAL_EMIT "elm,action,click" "";
+      }
+      program { name: "icon_show";
+         signal: "elm,state,icon,visible";
+         source: "elm";
+         action:  STATE_SET "visible" 0.0;
+         target: "elm.swallow.content";
+      }
+      program { name: "icon_hide";
+         signal: "elm,state,icon,hidden";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "elm.swallow.content";
+      }
+      program { name: "disable";
+         signal: "elm,state,disabled";
+         source: "elm";
+         script {
+            set_state(PART:"over2", "disabled", 0.0);
+            set_state(PART:"disabler", "disabled", 0.0);
+         }
+      }
+      program { name: "enable";
+         signal: "elm,state,enabled";
+         source: "elm";
+         script {
+            set_state(PART:"over2", "visible", 0.0);
+            set_state(PART:"disabler", "visible", 0.0);
+         }
+      }
+   }
+}
+
+group { name: "elm/button/base/focus";
+   parts {
+      part { name: "button_image";
+         type: RECT;
+         mouse_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+         }
+         description { state: "disabled" 0.0;
+            inherit:  "default" 0.0;
+         }
+         description { state: "hovered" 0.0;
+            inherit:  "default" 0.0;
+         }
+      }
+      part { name: "elm.swallow.content";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            fixed: 1 0;
+            visible: 0;
+            align: 0.0 0.5;
+            rel2.relative: 0.0 1.0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            fixed: 1 0;
+            visible: 1;
+            aspect: 1.0 1.0;
+                    //               aspect_preference: VERTICAL;
+         }
+         description { state: "icononly" 0.0;
+            inherit: "default" 0.0;
+            fixed: 0 0;
+            visible: 1;
+            align: 0.5 0.5;
+                   //               aspect: 1.0 1.0;
+            rel2.relative: 1.0 1.0;
+            //               aspect_preference: VERTICAL;
+         }
+      }
+      part {
+         name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            rel1.to_x: "elm.swallow.content";
+            rel1.relative: 1.0 0.0;
+            color: COL_NM;
+            text {
+               font: FN;
+               size: 13;
+               min: 0 0;
+               align: 0.5 0.5;
+               text_class: "button";
+               ellipsis: -1;
+            }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            text.min: 1 1;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+         }
+         description { state: "disabled_visible" 0.0;
+            inherit: "default" 0.0;
+            color: 128 128 128 255;
+            visible: 1;
+            text.min: 1 1;
+         }
+      }
+      part { name: "over2";
+         type: RECT;
+         mouse_events: 1;
+         repeat_events: 1;
+         ignore_flags: ON_HOLD;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit:  "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "over3";
+         type: RECT;
+         mouse_events: 1;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit:  "default" 0.0;
+         }
+      }
+      part { name: "disabler";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            visible: 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      // used to force sizing of icon to follow label sizing nearby
+      part { name: "sizer.content"; type: TEXT;
+         mouse_events:  0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            text {
+               font: FN;
+               size: 10;
+               min: 0 0;
+               text_class: "button";
+               ellipsis: -1;
+            }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            text {
+               min: 1 1;
+               text: "M";
+            }
+         }
+         description { state: "icononly" 0.0;
+            inherit: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            text {
+               min: 1 1;
+               text: "M";
+            }
+         }
+      }
+      // end sizer
+   }
+   programs {
+      program {
+         name:   "button_mouse_in";
+         signal: "mouse,in";
+         source: "over2";
+         action: STATE_SET "hovered" 0.0;
+         target: "button_image";
+      }
+      program {
+         name:   "button_mouse_out";
+         signal: "mouse,out";
+         source: "over2";
+         action: STATE_SET "default" 0.0;
+         target: "button_image";
+      }
+      program {
+         name:   "button_click";
+         signal: "mouse,down,1";
+         source: "over2";
+         action: SIGNAL_EMIT "elm,action,press" "";
+         after: "button_click_anim";
+      }
+      program {
+         name:   "button_click_anim";
+         action: STATE_SET "clicked" 0.0;
+         target: "button_image";
+      }
+      program {
+         name:   "button_unclick";
+         signal: "mouse,up,1";
+         source: "over3";
+         action: SIGNAL_EMIT "elm,action,unpress" "";
+         after: "button_unclick_anim";
+      }
+      program {
+         name:   "button_pressed_anim";
+         signal: "elm,anim,activate";
+         source: "elm";
+         action: STATE_SET "clicked" 0.0;
+         target: "button_image";
+         target: "over3";
+         after: "button_unpressed_anim";
+      }
+      program {
+         name:   "button_unpressed_anim";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         target: "button_image";
+         target: "over3";
+      }
+      program {
+         name:   "button_unclick_anim";
+         action: STATE_SET "default" 0.0;
+         target: "button_image";
+      }
+      program {
+         name:   "button_click2";
+         signal: "mouse,down,1";
+         source: "over3";
+         action: STATE_SET "clicked" 0.0;
+         target: "over3";
+      }
+      program {
+         name:   "button_unclick2";
+         signal: "mouse,up,1";
+         source: "over3";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         target: "over3";
+      }
+      program {
+         name:   "button_unclick3";
+         signal: "mouse,clicked,1";
+         source: "over2";
+         action: SIGNAL_EMIT "elm,action,click" "";
+      }
+      program { name: "text_show";
+         signal: "elm,state,text,visible";
+         source: "elm";
+         script {
+            new st[31];
+            new Float:vl;
+            get_state(PART:"elm.swallow.content", st, 30, vl);
+            if (!strcmp(st, "icononly")) {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"sizer.content", "visible", 0.0);
+            }
+            get_state(PART:"elm.text", st, 30, vl);
+            if (!strcmp(st, "disabled") || (!strcmp(st, "disabled_visible")))
+              set_state(PART:"elm.text", "disabled_visible", 0.0);
+            else
+              set_state(PART:"elm.text", "visible", 0.0);
+         }
+      }
+      program { name: "text_hide";
+         signal: "elm,state,text,hidden";
+         source: "elm";
+         script {
+            new st[31];
+            new Float:vl;
+            get_state(PART:"elm.swallow.content", st, 30, vl);
+            if (!strcmp(st, "visible")) {
+               set_state(PART:"elm.swallow.content", "icononly", 0.0);
+               set_state(PART:"sizer.content", "icononly", 0.0);
+            }
+            set_state(PART:"elm.text", "default", 0.0);
+            get_state(PART:"elm.text", st, 30, vl);
+            if (!strcmp(st, "default") || (!strcmp(st, "visible")))
+              set_state(PART:"elm.text", "default", 0.0);
+            else
+              set_state(PART:"elm.text", "disabled", 0.0);
+         }
+      }
+      program { name: "icon_show";
+         signal: "elm,state,icon,visible";
+         source: "elm";
+         script {
+            new st[31];
+            new Float:vl;
+            get_state(PART:"elm.text", st, 30, vl);
+            if (!strcmp(st, "visible")) {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"sizer.content", "visible", 0.0);
+            }
+            else {
+               set_state(PART:"elm.swallow.content", "icononly", 0.0);
+               set_state(PART:"sizer.content", "icononly", 0.0);
+            }
+         }
+      }
+      program { name: "icon_hide";
+         signal: "elm,state,icon,hidden";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "elm.swallow.content";
+         target: "sizer.content";
+      }
+      program { name: "disable";
+         signal: "elm,state,disabled";
+         source: "elm";
+         script {
+            new st[31];
+            new Float:vl;
+            set_state(PART:"button_image", "disabled", 0.0);
+            set_state(PART:"over2", "disabled", 0.0);
+            set_state(PART:"disabler", "disabled", 0.0);
+            get_state(PART:"elm.text", st, 30, vl);
+            if (!strcmp(st, "visible") || !strcmp(st, "disabled_visible"))
+              set_state(PART:"elm.text", "disabled_visible", 0.0);
+            else
+              set_state(PART:"elm.text", "disabled", 0.0);
+         }
+      }
+      program { name: "enable";
+         signal: "elm,state,enabled";
+         source: "elm";
+         script {
+            new st[31];
+            new Float:vl;
+            set_state(PART:"button_image", "default", 0.0);
+            set_state(PART:"over2", "default", 0.0);
+            set_state(PART:"disabler", "default", 0.0);
+            get_state(PART:"elm.text", st, 30, vl);
+            if (!strcmp(st, "visible") || !strcmp(st, "disabled_visible"))
+              set_state(PART:"elm.text", "visible", 0.0);
+            else
+              set_state(PART:"elm.text", "default", 0.0);
+         }
+      }
+   }
+}
+
+group { name: "elm/button/base/dropdown";
+   inherit: "elm/button/base/default";
+   images.image: "dropdown_arrow.png" COMP;
+   parts {
+      part {
+         name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            rel1.to_x: "elm.swallow.content";
+            rel1.relative: 1.0 0.0;
+            rel1.offset: 0 4;
+            rel2.to_x: "arrow";
+            rel2.relative: 0.0 1.0;
+            rel2.offset: -5 -5;
+            color: COL_NM;
+            text {
+               font: FN;
+               size: 13;
+               min: 0 0;
+               align: 0.0 0.5;
+               text_class: "button";
+            }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            text.min: 0 1;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+         }
+         description { state: "disabled_visible" 0.0;
+            inherit: "default" 0.0;
+            color: 128 128 128 255;
+            visible: 1;
+            text.min: 0 1;
+         }
+      }
+      part { name: "arrow";
+         type: IMAGE;
+         repeat_events: 1;
+         scale: 1;
+         description { state: "default" 0.0;
+            align: 1.0 0.5;
+            min: 8 4;
+            max: 8 4;
+            rel1.to: "button_image";
+            rel2 {
+               offset: -9 -1;
+               to: "button_image";
+            }
+            image.normal: "dropdown_arrow.png";
+         }
+      }
+   }
+}
+
+group { name: "elm/button/base/colorselector/left/default";
+   inherit: "elm/button/base/default";
+   images.image: "colorbar_btn_l_nor.png" COMP;
+   images.image: "colorbar_btn_l_sel.png" COMP;
+   images.image: "colorbar_btn_l_mv.png" COMP;
+   images.image: "color_btn_widget.png" COMP;
+   images.image: "color_btn_widget_disable.png" COMP;
+   images.image: "color_btn_widget_hover.png" COMP;
+   images.image: "color_btn_widget_push.png" COMP;
+   parts {
+      part { name: "button_image";
+         mouse_events: 1;
+         description { state: "default" 0.0;
+            min: 9 9;
+            image {
+               normal: "color_btn_widget.png";
+               border: 3 3 3 3;
+            }
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image {
+               normal: "color_btn_widget_push.png";
+               border: 3 3 3 3;
+            }
+         }
+         description { state: "disabled" 0.0;
+            inherit:  "default" 0.0;
+            image {
+               normal: "color_btn_widget_disable.png";
+               border: 3 3 3 3;
+            }
+         }
+         description { state: "hovered" 0.0;
+            inherit:  "default" 0.0;
+            image {
+               normal: "color_btn_widget_hover.png";
+               border: 3 3 3 3;
+            }
+         }
+      }
+      image { "ic"; nomouse;
+         desc { "default";
+            min: 22 22;
+            max: 22 22;
+            fixed: 1 1;
+            image.normal: "colorbar_btn_l_nor.png";
+         }
+         desc { "hovered";
+            inherit: "default";
+            image.normal: "colorbar_btn_l_mv.png";
+         }
+         desc { "selected";
+            inherit: "default";
+            image.normal: "colorbar_btn_l_sel.png";
+         }
+      }
+   }
+   programs {
+      program {
+         name: "button_mouse_in2";
+         signal: "mouse,in";
+         source: "over2";
+         action: STATE_SET "hovered" 0.0;
+         target: "ic";
+      }
+      program {
+         name: "button_mouse_out2";
+         signal: "mouse,out";
+         source: "over2";
+         action: STATE_SET "default" 0.0;
+         target: "ic";
+         target: "button_image";
+      }
+      program {
+         name: "button_click2";
+         signal: "mouse,down,1";
+         source: "over2";
+         action: STATE_SET "selected" 0.0;
+         target: "ic";
+      }
+   }
+}
+
+group { name: "elm/button/base/colorselector/right/default";
+   inherit: "elm/button/base/default";
+   images.image: "colorbar_btn_r_nor.png" COMP;
+   images.image: "colorbar_btn_r_sel.png" COMP;
+   images.image: "colorbar_btn_r_mv.png" COMP;
+   images.image: "color_btn_widget.png" COMP;
+   images.image: "color_btn_widget_disable.png" COMP;
+   images.image: "color_btn_widget_hover.png" COMP;
+   images.image: "color_btn_widget_push.png" COMP;
+   parts {
+      part { name: "button_image";
+         mouse_events: 1;
+         description { state: "default" 0.0;
+            min: 9 9;
+            image {
+               normal: "color_btn_widget.png";
+               border: 3 3 3 3;
+            }
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image {
+               normal: "color_btn_widget_push.png";
+               border: 3 3 3 3;
+            }
+         }
+         description { state: "disabled" 0.0;
+            inherit:  "default" 0.0;
+            image {
+               normal: "color_btn_widget_disable.png";
+               border: 3 3 3 3;
+            }
+         }
+         description { state: "hovered" 0.0;
+            inherit:  "default" 0.0;
+            image {
+               normal: "color_btn_widget_hover.png";
+               border: 3 3 3 3;
+            }
+         }
+      }
+      image { "ic"; nomouse;
+         desc { "default";
+            min: 22 22;
+            max: 22 22;
+            fixed: 1 1;
+            image.normal: "colorbar_btn_r_nor.png";
+         }
+         desc { "hovered";
+            inherit: "default";
+            image.normal: "colorbar_btn_r_mv.png";
+         }
+         desc { "selected";
+            inherit: "default";
+            image.normal: "colorbar_btn_r_sel.png";
+         }
+      }
+   }
+   programs {
+      program {
+         name: "button_mouse_in2";
+         signal: "mouse,in";
+         source: "over2";
+         action: STATE_SET "hovered" 0.0;
+         target: "ic";
+      }
+      program {
+         name: "button_mouse_out2";
+         signal: "mouse,out";
+         source: "over2";
+         action: STATE_SET "default" 0.0;
+         target: "ic";
+         target: "button_image";
+      }
+      program {
+         name: "button_click2";
+         signal: "mouse,down,1";
+         source: "over2";
+         action: STATE_SET "selected" 0.0;
+         target: "ic";
+      }
+   }
+}
+
+group { name: "elm/button/base/spinner/increase/default";
+      alias: "elm/button/base/spinner/increase/colorselector/default";
+      alias: "elm/button/base/calendar/increase/default";
+      alias: "elm/button/base/calendar/increase/double_spinners";
+      images.image: "sym_right_light_normal.png" COMP;
+      images.image: "sym_right_glow_normal.png" COMP;
+      images.image: "sym_right_dark_normal.png" COMP;
+      script {
+         public mouse_down = 0;
+         public multi_down = 0;
+      }
+      parts {
+         part { name: "arrow.image";
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 19 24;
+               max: 19 24;
+               image.normal: "sym_right_light_normal.png";
+            }
+            description { state: "pressed" 0.0;
+               inherit: "default" 0.0;
+               image.normal: "sym_right_glow_normal.png";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default" 0.0;
+               image.normal: "sym_right_dark_normal.png";
+            }
+         }
+         part { name: "over";
+            type: RECT;
+            repeat_events: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+         }
+         part { name: "disabler";
+            type: RECT;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+               visible: 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+      }
+      programs {
+         program { name: "button_press";
+            signal: "mouse,down,1";
+            source: "over";
+            script {
+               if ((get_int(multi_down) == 0) &&
+                   (get_int(mouse_down) == 0)) {
+                     set_int(mouse_down, 1);
+                     run_program(PROGRAM:"button_press2");
+               }
+            }
+         }
+         program { name: "button_press2";
+            action: SIGNAL_EMIT "elm,action,press" "";
+            after: "button_press_anim";
+         }
+         program { name: "button_press_anim";
+            action: STATE_SET "pressed" 0.0;
+            target: "arrow.image";
+         }
+         program { name: "button_unpress";
+            signal: "mouse,up,1";
+            source: "over";
+            script {
+               if (get_int(mouse_down) == 1) {
+                     set_int(mouse_down, 0);
+                     run_program(PROGRAM:"button_unpress2");
+                     run_program(PROGRAM:"button_unpress_anim");
+               }
+            }
+         }
+         program { name: "button_unpress2";
+            action: SIGNAL_EMIT "elm,action,unpress" "";
+         }
+         program { name: "button_unpress_anim";
+            action: STATE_SET "default" 0.0;
+            target: "arrow.image";
+         }
+         program { name: "button_click";
+            signal: "mouse,clicked,1";
+            source: "over";
+            script {
+               if (get_int(multi_down) == 0) {
+                 run_program(PROGRAM:"button_click2");
+               }
+            }
+         }
+         program { name: "action_unpressed";
+            signal: "elm,action,unpressed";
+            source: "elm";
+            after: "button_unpress_anim";
+         }
+         program { name: "action_pressed";
+            signal: "elm,action,pressed";
+            source: "elm";
+            after: "button_press_anim";
+         }
+         program { name: "button_click2";
+            action: SIGNAL_EMIT "elm,action,click" "";
+         }
+         program { name: "access_pressed";
+            signal: "elm,action,anim,activate";
+            source: "elm";
+            action: STATE_SET "pressed" 0.0;
+            target: "arrow.image";
+            after: "access_pressed_anim";
+         }
+         program { name: "access_pressed_anim";
+            action: STATE_SET "default" 0.0;
+            transition: DECELERATE 0.1;
+            target: "arrow.image";
+         }
+         program { name: "disable";
+            signal: "elm,state,disabled";
+            source: "elm";
+            action: STATE_SET "disabled" 0.0;
+            target: "arrow.image";
+            target: "disabler";
+         }
+         program { name: "enable";
+            signal: "elm,state,enabled";
+            source: "elm";
+            action: STATE_SET "default" 0.0;
+            target: "arrow.image";
+            target: "disabler";
+         }
+         program {
+            name: "multi_down";
+            signal: "elm,action,multi,down";
+            source: "elm";
+            script {
+               set_int(multi_down, 1);
+            }
+         }
+         program {
+            name: "multi_up";
+            signal: "elm,action,multi,up";
+            source: "elm";
+            script {
+               set_int(multi_down, 0);
+            }
+         }
+      }
+   }
+
+   group { name: "elm/button/base/spinner/decrease/default";
+      alias: "elm/button/base/spinner/decrease/colorselector/default";
+      inherit: "elm/button/base/spinner/increase/default";
+      alias: "elm/button/base/calendar/decrease/default";
+      alias: "elm/button/base/calendar/decrease/double_spinners";
+      images.image: "sym_left_light_normal.png" COMP;
+      images.image: "sym_left_glow_normal.png" COMP;
+      images.image: "sym_left_dark_normal.png" COMP;
+      parts {
+         part { name: "arrow.image";
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 19 24;
+               max: 19 24;
+               image.normal: "sym_left_light_normal.png";
+            }
+            description { state: "pressed" 0.0;
+               inherit: "default" 0.0;
+               image.normal: "sym_left_glow_normal.png";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default" 0.0;
+               image.normal: "sym_left_dark_normal.png";
+            }
+         }
+      }
+   }
+
+
+
+   group { name: "elm/button/base/spinner/decrease/color_input";
+      inherit: "elm/button/base/spinner/decrease/default";
+      parts {
+         part { name: "arrow.image";
+            scale: 1;
+            description { state: "default" 0.0;
+            }
+         }
+      }
+   }
+
+   group { name: "elm/button/base/spinner/increase/color_input";
+      inherit: "elm/button/base/spinner/increase/default";
+      parts {
+         part { name: "arrow.image";
+            scale: 1;
+            description { state: "default" 0.0;
+            }
+         }
+      }
+   }
+
+
+   group { name: "elm/button/base/spinner/default";
+      alias: "elm/button/base/spinner/colorselector/default";
+      alias: "elm/button/base/spinner/vertical";
+      alias: "elm/button/base/spinner/color_input";
+      parts {
+         part { name: "bg";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+            }
+         }
+         part { name: "elm.text";
+            type: TEXT;
+            scale: 1;
+            description { state: "default" 0.0;
+               color: 91 91 91 255;
+               rel1.to: "bg";
+               rel2.to: "bg";
+               text { font: FN; size: 13;
+                  min: 1 1;
+                  text_class: "spinner";
+                  ellipsis: -1;
+               }
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default" 0.0 ;
+               color: FN_COL_DISABLE;
+            }
+         }
+         part { name: "over";
+            type: RECT;
+            repeat_events: 1;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+         }
+         part { name: "disabler";
+            type: RECT;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+               visible: 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+      }
+      programs {
+         program { name: "button_click";
+            signal: "mouse,clicked,1";
+            source: "over";
+            script {
+                 run_program(PROGRAM:"button_click2");
+            }
+         }
+         program { name: "button_click2";
+            action: SIGNAL_EMIT "elm,action,click" "";
+         }
+         program { name: "disable";
+            signal: "elm,state,disabled";
+            source: "elm";
+            action: STATE_SET "disabled" 0.0;
+            target: "disabler";
+            target: "elm.text";
+         }
+         program { name: "enable";
+            signal: "elm,state,enabled";
+            source: "elm";
+            action: STATE_SET "default" 0.0;
+            target: "disabler";
+            target: "elm.text";
+         }
+      }
+   }
+   group { name: "elm/button/base/help";
+      inherit: "elm/button/base/default";
+      images {
+         image: "btn_help_widget.png" COMP;
+         image: "btn_help_widget_push.png" COMP;
+         image: "btn_help_widget_hover.png" COMP;
+      }
+      parts {
+         part { name: "button_image";
+            mouse_events: 1;
+            description { state: "default" 0.0;
+               min: 9 9;
+               image {
+                  normal: "btn_help_widget.png";
+                  border: 3 3 3 3;
+               }
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default" 0.0;
+               image {
+                  normal: "btn_help_widget_push.png";
+                  border: 3 3 3 3;
+               }
+            }
+            description { state: "disabled" 0.0;
+               inherit:  "default" 0.0;
+               image {
+                  normal: "btn_help_widget.png";
+                  border: 3 3 3 3;
+               }
+            }
+            description { state: "hovered" 0.0;
+               inherit:  "default" 0.0;
+               image {
+                  normal: "btn_help_widget_hover.png";
+                  border: 3 3 3 3;
+               }
+            }
+            description { state: "visible" 0.0;
+               inherit:  "default" 0.0;
+               image {
+                  normal: "btn_help_widget.png";
+               }
+            }
+         }
+         part { name: "over2";
+            mouse_events: 1;
+            repeat_events: 1;
+            ignore_flags: ON_HOLD;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit:  "default" 0.0;
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit:  "default" 0.0;
+            }
+         }
+         part { name: "disabler";
+            type: RECT;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+               visible: 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default" 0.0;
+            }
+         }
+      }
+   }
+   group { name: "elm/button/base/tab_left";
+      inherit: "elm/button/base/default";
+      images {
+         image: "btn_tab_left.png" COMP;
+         image: "btn_tab_left_push.png" COMP;
+         image: "btn_tab_left_hover.png" COMP;
+      }
+      parts {
+         part { name: "button_image";
+            mouse_events: 1;
+            description { state: "default" 0.0;
+               min: 30 30;
+               image {
+                  normal: "btn_tab_left.png";
+                  border: 1 1 1 3;
+               }
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default" 0.0;
+               image {
+                  normal: "btn_tab_left_push.png";
+                  border: 1 1 1 3;
+               }
+            }
+            description { state: "disabled" 0.0;
+               inherit:  "default" 0.0;
+               image {
+                  normal: "btn_tab_left.png";
+                  border: 1 1 1 3;
+               }
+            }
+            description { state: "hovered" 0.0;
+               inherit:  "default" 0.0;
+               image {
+                  normal: "btn_tab_left_hover.png";
+                  border: 1 1 1 3;
+               }
+            }
+            description { state: "visible" 0.0;
+               inherit:  "default" 0.0;
+               image {
+                  normal: "btn_tab_left.png";
+               }
+            }
+         }
+         part { name: "over2";
+            mouse_events: 1;
+            repeat_events: 1;
+            ignore_flags: ON_HOLD;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit:  "default" 0.0;
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit:  "default" 0.0;
+            }
+         }
+         part { name: "disabler";
+            type: RECT;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+               visible: 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default" 0.0;
+            }
+         }
+      }
+   }
+   group { name: "elm/button/base/tab_right";
+      inherit: "elm/button/base/default";
+      images {
+         image: "btn_tab_right.png" COMP;
+         image: "btn_tab_right_push.png" COMP;
+         image: "btn_tab_right_hover.png" COMP;
+      }
+      parts {
+         part { name: "button_image";
+            mouse_events: 1;
+            description { state: "default" 0.0;
+               min: 30 30;
+               image {
+                  normal: "btn_tab_right.png";
+                  border: 1 1 1 3;
+               }
+            }
+            description { state: "clicked" 0.0;
+               inherit: "default" 0.0;
+               image {
+                  normal: "btn_tab_right_push.png";
+                  border: 1 1 1 3;
+               }
+            }
+            description { state: "disabled" 0.0;
+               inherit:  "default" 0.0;
+               image {
+                  normal: "btn_tab_right.png";
+                  border: 1 1 1 3;
+               }
+            }
+            description { state: "hovered" 0.0;
+               inherit:  "default" 0.0;
+               image {
+                  normal: "btn_tab_right_hover.png";
+                  border: 1 1 1 3;
+               }
+            }
+            description { state: "visible" 0.0;
+               inherit:  "default" 0.0;
+               image {
+                  normal: "btn_tab_right.png";
+               }
+            }
+         }
+         part { name: "over2";
+            mouse_events: 1;
+            repeat_events: 1;
+            ignore_flags: ON_HOLD;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit:  "default" 0.0;
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit:  "default" 0.0;
+            }
+         }
+         part { name: "disabler";
+            type: RECT;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+               visible: 0;
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default" 0.0;
+            }
+         }
+      }
+   }
+
+group { name: "elm/button/base/refresh";
+   inherit: "elm/button/base/default";
+   parts {
+      part { name: "button_image";
+         type: SPACER;
+         description { state: "default" 0.0;
+         }
+         description { state: "clicked" 0.0;
+         }
+         description { state: "disabled" 0.0;
+         }
+         description { state: "hovered" 0.0;
+         }
+      }
+      part { name: "elm.swallow.content";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            visible: 0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            aspect: 1.0 1.0;
+         }
+         description { state: "icononly" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            aspect: 1.0 1.0;
+         }
+      }
+   }
+}
diff --git a/data/themes/elm/check.edc b/data/themes/elm/check.edc
new file mode 100644 (file)
index 0000000..fa58994
--- /dev/null
@@ -0,0 +1,502 @@
+group { name: "elm/check/base/default";
+   images.image: "check_nor.png" COMP;
+   images.image: "check_sel.png" COMP;
+#define ICON     1
+#define LABEL    2
+#define MASK     3
+#define DISABLE  4
+   script {
+      public btmode;
+      public eval_mode(m) {
+         new m1 = m & MASK;
+         new d = m & DISABLE;
+         if (m1 == (ICON | LABEL)) {
+            if (!d) {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"sizer.content", "visible", 0.0);
+               set_state(PART:"elm.text", "visible", 0.0);
+               set_state(PART:"shadow", "default", 0.0);
+               set_state(PART:"base", "default", 0.0);
+               set_state(PART:"clip", "default", 0.0);
+               set_state(PART:"event", "default", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"sizer.content", "visible", 0.0);
+               set_state(PART:"elm.text", "disabled_visible", 0.0);
+               set_state(PART:"shadow", "disabled", 0.0);
+               set_state(PART:"base", "disabled", 0.0);
+               set_state(PART:"clip", "disabled", 0.0);
+               set_state(PART:"event", "disabled", 0.0);
+            }
+         } else if (m1 == (ICON)) {
+            if (!d) {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"sizer.content", "icononly", 0.0);
+               set_state(PART:"elm.text", "default", 0.0);
+               set_state(PART:"shadow", "default", 0.0);
+               set_state(PART:"base", "default", 0.0);
+               set_state(PART:"clip", "default", 0.0);
+               set_state(PART:"event", "default", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.content", "visible", 0.0);
+               set_state(PART:"sizer.content", "icononly", 0.0);
+               set_state(PART:"elm.text", "disabled", 0.0);
+               set_state(PART:"shadow", "disabled", 0.0);
+               set_state(PART:"base", "disabled", 0.0);
+               set_state(PART:"clip", "disabled", 0.0);
+               set_state(PART:"event", "disabled", 0.0);
+            }
+         } else if (m1 == (LABEL)) {
+            if (!d) {
+               set_state(PART:"elm.swallow.content", "default", 0.0);
+               set_state(PART:"sizer.content", "default", 0.0);
+               set_state(PART:"elm.text", "visible", 0.0);
+               set_state(PART:"shadow", "default", 0.0);
+               set_state(PART:"base", "default", 0.0);
+               set_state(PART:"clip", "default", 0.0);
+               set_state(PART:"event", "default", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.content", "default", 0.0);
+               set_state(PART:"sizer.content", "default", 0.0);
+               set_state(PART:"elm.text", "disabled_visible", 0.0);
+               set_state(PART:"shadow", "disabled", 0.0);
+               set_state(PART:"base", "disabled", 0.0);
+               set_state(PART:"clip", "disabled", 0.0);
+               set_state(PART:"event", "disabled", 0.0);
+            }
+         } else {
+            if (!d) {
+               set_state(PART:"elm.swallow.content", "default", 0.0);
+               set_state(PART:"sizer.content", "default", 0.0);
+               set_state(PART:"elm.text", "default", 0.0);
+               set_state(PART:"shadow", "default", 0.0);
+               set_state(PART:"base", "default", 0.0);
+               set_state(PART:"clip", "default", 0.0);
+               set_state(PART:"event", "default", 0.0);
+            } else {
+               set_state(PART:"elm.swallow.content", "default", 0.0);
+               set_state(PART:"sizer.content", "default", 0.0);
+               set_state(PART:"elm.text", "default", 0.0);
+               set_state(PART:"shadow", "disabled", 0.0);
+               set_state(PART:"base", "disabled", 0.0);
+               set_state(PART:"clip", "disabled", 0.0);
+               set_state(PART:"event", "disabled", 0.0);
+            }
+         }
+      }
+   }
+   parts {
+      part { name: "base"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "inset";
+            rel2.offset: -1 -1;
+            rel2.to: "inset";
+            color: 24 24 24 255;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            color: 64 64 64 255;
+         }
+      }
+      part { name: "shadow"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "check_nor.png";
+            image.border: 4 4 4 4;
+            rel1.to: "base";
+            rel2.to: "base";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "inset"; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 0;
+            rel1.offset: 2 2;
+            rel2.relative: 0.0 1.0;
+            rel2.offset: 2 -3;
+            align: 0.0 0.5;
+            min: 14 14;
+            max: 14 14;
+            image.normal: "check_nor.png";
+            image.border: 1 1 1 1;
+            image.middle: 0;
+            fill.smooth: 0;
+         }
+      }
+      part { name: "indicator"; mouse_events: 0;
+         scale: 1;
+         clip_to: "clip";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to: "base";
+            rel2.to: "base";
+            image.normal: "check_sel.png";
+            min: 14 14;
+            max: 14 14;
+            visible: 0;
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "clip"; type: RECT;
+         description { state: "default" 0.0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 64;
+         }
+      }
+      part { name: "elm.swallow.content"; type: SWALLOW;
+         scale: 1;
+         clip_to: "clip";
+         description { state: "default" 0.0;
+            fixed: 1 0;
+            visible: 0;
+            align: 0.0 0.5;
+            max: 0 0;
+            rel1.to_x: "inset";
+            rel1.relative: 1.0 0.0;
+            rel1.offset: 1 1;
+            rel2.to_x: "inset";
+            rel2.offset: 1 -2;
+            rel2.relative: 1.0 1.0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            aspect: 1.0 1.0;
+            min: 14 14;
+         }
+      }
+      part { name: "sizer.content"; type: TEXT; mouse_events:  0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            visible: 0;
+            text { font: FN; size: 10;
+               min: 0 0;
+               text_class: "check_text";
+            }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            text {
+               min: 1 1;
+               ellipsis: -1;
+               text: "M";
+            }
+         }
+         description { state: "icononly" 0.0;
+            inherit: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            text {
+               min: 1 1;
+               ellipsis: -1;
+               text: "M";
+            }
+         }
+      }
+      part { name: "elm.text"; type: TEXT; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.offset: 2 2;
+            rel1.to_x: "elm.swallow.content";
+            rel1.relative: 1.0 0.0;
+            rel2.offset: -3 -3;
+            color: 102 102 102 255;
+            color_class: "check_text";
+            text { font: FN; size: 13;
+              min: 0 0;
+              align: 0.0 0.5;
+              text_class: "check";
+              font: FN;
+            }
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            color_class: "check_text_disabled";
+            color3: 255 255 255 255;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            text.min: 1 1;
+            text.ellipsis: -1;
+         }
+         description { state: "disabled_visible" 0.0;
+            inherit: "default" 0.0;
+            color_class: "check_text_disabled";
+            color3: 255 255 255 255;
+            visible: 1;
+            text.min: 1 1;
+            text.ellipsis: -1;
+         }
+      }
+      part { name: "event"; type: RECT;
+         ignore_flags: ON_HOLD;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "mouse,clicked,1"; source: "event";
+         action: SIGNAL_EMIT "elm,action,check,toggle" "elm";
+      }
+      program {
+         signal: "elm,state,check,on"; source: "elm";
+         action:  STATE_SET "selected" 0.0;
+         target: "indicator";
+      }
+      program {
+         signal: "elm,state,check,off"; source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "indicator";
+      }
+      program {
+         signal: "elm,state,text,visible"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m |= LABEL; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program {
+         signal: "elm,state,text,hidden"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m &= ~LABEL; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program {
+         signal: "elm,state,icon,visible"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m |= ICON; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program {
+         signal: "elm,state,icon,hidden"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m &= ~ICON; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program {
+         signal: "elm,state,disabled"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m |= DISABLE; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+      program {
+         signal: "elm,state,enabled"; source: "elm";
+         script {
+            new m = get_int(btmode);
+            m &= ~DISABLE; set_int(btmode, m);
+            eval_mode(m);
+         }
+      }
+   }
+#undef ICON
+#undef LABEL
+#undef MASK
+#undef DISABLE
+}
+group { name: "elm/check/base/toggle";
+   images {
+      image: "toggle_on.png" COMP;
+      image: "toggle_off.png" COMP;
+   }
+   script {
+      public on;
+   }
+   parts {
+      part { name: "bg";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            visible: 0;
+            min: 0 25;
+         }
+      }
+      part { name: "clipper";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+         }
+      }
+      part { name: "onrect";
+         type: IMAGE;
+         scale: 1;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.relative: 1 0;
+            rel2.relative: 1 1;
+            min: 76 24;
+            max: 76 24;
+            align: 1 0.5;
+            fixed: 1 1;
+            image.normal: "toggle_on.png";
+         }
+         description { state: "hover" 0.0;
+            inherit: "default" 0.0;
+         }
+         description { state: "push" 0.0;
+            inherit: "default" 0.0;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "offrect";
+         type: IMAGE;
+         scale: 1;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.relative: 1 0;
+            rel2.relative: 1 1;
+            min: 76 24;
+            max: 76 24;
+            align: 1 0.5;
+            fixed: 1 1;
+            image.normal: "toggle_off.png";
+         }
+         description { state: "hover" 0.0;
+            inherit: "default" 0.0;
+         }
+         description { state: "push" 0.0;
+            inherit: "default" 0.0;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.relative: 0.0 0.0;
+            rel2.relative: 0.0 1.0;
+            color: 88 88 88 255;
+            text {
+               font: FNBD;
+               size: 13;
+               min: 1 1;
+               align: 0.0 0.5;
+               ellipsis: -1;
+            }
+            align: 0 0.5;
+            fixed: 1 0;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "mouse,down,1";
+         source: "onrect";
+         script {
+            set_state(PART:"onrect", "push", 0.0);
+         }
+      }
+      program {
+         signal: "mouse,up,1";
+         source: "onrect";
+         script {
+            set_state(PART:"onrect", "hidden", 0.0);
+            set_state(PART:"offrect", "default", 0.0);
+            set_int(on, 0);
+            emit("elm,action,check,off", "");
+         }
+      }
+      program {
+         signal: "mouse,down,1";
+         source: "offrect";
+         script {
+            set_state(PART:"offrect", "push", 0.0);
+         }
+      }
+      program {
+         signal: "mouse,up,1";
+         source: "offrect";
+         script {
+            set_state(PART:"onrect", "default", 0.0);
+            set_state(PART:"offrect", "hidden", 0.0);
+            set_int(on, 1);
+            emit("elm,action,check,on", "");
+         }
+      }
+      program {
+         signal: "mouse,in";
+         source: "onrect";
+         script {
+            set_state(PART:"onrect", "hover", 0.0);
+         }
+      }
+      program {
+         signal: "mouse,out";
+         source: "onrect";
+         script {
+            if (get_int(on) == 1) {
+               set_state(PART:"onrect", "default", 0.0);
+            }
+         }
+      }
+      program {
+         signal: "mouse,in";
+         source: "offrect";
+         script {
+            set_state(PART:"offrect", "hover", 0.0);
+         }
+      }
+      program {
+         signal: "mouse,out";
+         source: "offrect";
+         script {
+            if (get_int(on) == 0) {
+               set_state(PART:"offrect", "default", 0.0);
+            }
+         }
+      }
+      program { name: "check_on";
+         signal: "elm,state,check,on";
+         source: "elm";
+         script {
+            set_state(PART:"onrect", "default", 0.0);
+            set_state(PART:"offrect", "hidden", 0.0);
+            set_int(on, 1);
+         }
+      }
+      program { name: "check_off";
+         signal: "elm,state,check,off";
+         source: "elm";
+         script {
+            set_state(PART:"onrect", "hidden", 0.0);
+            set_state(PART:"offrect", "default", 0.0);
+            set_int(on, 0);
+         }
+      }
+   }
+}
diff --git a/data/themes/elm/colorsel.edc b/data/themes/elm/colorsel.edc
new file mode 100644 (file)
index 0000000..c68170d
--- /dev/null
@@ -0,0 +1,767 @@
+#define ASPECT_FILL(_ASPECT) \
+   aspect: _ASPECT _ASPECT; aspect_preference: NONE;
+#define TILED_PATTERN(_WIDTH, _HEIGHT) \
+   fill { size { relative: 0.0 0.0; offset: _WIDTH _HEIGHT; } }
+#define TILED_HORIZ(_WIDTH) \
+   fill { size { relative: 0.0 1.0; offset: _WIDTH 0; } }
+#define FIXED_SIZE(_WIDTH, _HEIGHT) \
+   min: _WIDTH _HEIGHT; max: _WIDTH _HEIGHT; fixed: 1 1;
+#define DARK_GREY_BG_COLOR 48 48 48 255
+#define DARK_GREY_BG_DISABLED_COLOR 64 64 64 255
+
+group { name: "elm/colorselector/palette/default";
+   data.item: "horizontal_pad" 0;
+   data.item: "vertical_pad" 0;
+   images.image: "bevel_dark_in.png" COMP;
+   parts {
+      part { name: "elm.picker"; type: SWALLOW;
+         description { state: "default" 0.0;
+            fixed: 0 1;
+            align: 0.5 0.0;
+            rel2.relative: 1.0 0.0;
+         }
+      }
+      part { name: "sep1";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to_y: "elm.picker";
+            rel1.offset: 4 4;
+            rel1.relative: 0.0 1.0;
+            rel2.to_y: "elm.picker";
+            rel2.offset: -5 5;
+            min: 2 2;
+            max: 99999 2;
+            image.normal: "bevel_dark_in.png";
+            image.border: 2 2 2 2;
+            fill.smooth: 0;
+         }
+         description { state: "off" 0.0;
+            inherit: "default" 0.0;
+            rel1.offset: 4 -2;
+            rel2.offset: -5 -1;
+            visible: 0;
+         }
+      }
+      part { name: "elm.palette"; type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 0.5 0.0;
+            rel1.to_y: "sep1";
+            rel1.relative: 0.0 1.0;
+            rel1.offset: 0 4;
+            rel2.to_y: "sep2";
+            rel2.relative: 1.0 0.0;
+            rel2.offset: -1 -5;
+         }
+         description { state: "off" 0.0;
+            inherit: "default" 0.0;
+            rel1.offset: 0 0;
+            rel2.offset: -1 -1;
+         }
+      }
+      part { name: "sep2";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to_y: "elm.selector";
+            rel1.offset: 4 -6;
+            rel2.to_y: "elm.selector";
+            rel2.offset: -5 -5;
+            rel2.relative: 1.0 0.0;
+            min: 2 2;
+            max: 99999 2;
+            image.normal: "bevel_dark_in.png";
+            image.border: 2 2 2 2;
+            fill.smooth: 0;
+         }
+         description { state: "off" 0.0;
+            inherit: "default" 0.0;
+            rel1.offset: 4 0;
+            rel2.offset: -5 1;
+            visible: 0;
+         }
+      }
+      part { name: "elm.selector"; type: SWALLOW;
+         description { state: "default" 0.0;
+            fixed: 0 1;
+            align: 0.0 1.0;
+            rel1.relative: 0.0 1.0;
+         }
+      }
+   }
+   programs {
+      program {
+         source: "elm"; signal: "elm,state,palette";
+         action: STATE_SET "off" 0.0;
+         target: "sep1";
+         target: "sep2";
+      }
+      program {
+         source: "elm"; signal: "elm,state,palette";
+         action: STATE_SET "default" 0.0;
+         target: "elm.palette";
+      }
+      
+      program {
+         source: "elm"; signal: "elm,state,components";
+         action: STATE_SET "off" 0.0;
+         target: "sep1";
+         target: "sep2";
+         target: "elm.palette";
+      }
+      
+      program {
+         source: "elm"; signal: "elm,state,both";
+         action: STATE_SET "off" 0.0;
+         target: "sep1";
+      }
+      program {
+         source: "elm"; signal: "elm,state,both";
+         action: STATE_SET "default" 0.0;
+         target: "elm.palette";
+         target: "sep2";
+      }
+      
+      program {
+         source: "elm"; signal: "elm,state,picker";
+         action: STATE_SET "off" 0.0;
+         target: "sep1";
+         target: "sep2";
+         target: "elm.palette";
+      }
+      
+      program {
+         source: "elm"; signal: "elm,state,all";
+         action: STATE_SET "default" 0.0;
+         target: "sep1";
+         target: "sep2";
+         target: "elm.palette";
+      }
+   }
+}
+
+group { name: "elm/colorselector/picker/base/default";
+   parts {
+      part { name: "elm.swallow.picker"; type: SWALLOW;
+         description { state: "default" 0.0;
+            min: 90 90;
+            rel2 {
+               relative: 0.0 1.0;
+               to_x: "elm.label.red";
+            }
+         }
+      }
+      part { name: "elm.label.red"; type: TEXT;
+         description { state: "default" 0.0;
+            align: 1.0 0.0;
+            min: 15 0;
+            max: 15 -1;
+            rel2 {
+               relative: 0.0 1.0;
+               to: "elm.swallow.red";
+            }
+            text {
+               font: FN;
+               size: 10;
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "elm.swallow.red"; type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 1.0 0.0;
+            min: 60 20;
+            max: 60 20;
+         }
+      }
+      part { name: "elm.label.green"; type: TEXT;
+         description { state: "default" 0.0;
+            min: 15 0;
+            max: 15 -1;
+            rel1 {
+               relative: 0.0 1.0;
+               to: "elm.label.red";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               to: "elm.swallow.green";
+            }
+            text {
+               font: FN;
+               size: 10;
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "elm.swallow.green"; type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 1.0 0.0;
+            min: 60 20;
+            max: 60 20;
+            rel1 {
+               relative: 0.0 1.0;
+               to: "elm.swallow.red";
+            }
+         }
+      }
+      part { name: "elm.label.blue"; type: TEXT;
+         description { state: "default" 0.0;
+            min: 15 0;
+            max: 15 -1;
+            rel1 {
+               relative: 0.0 1.0;
+               to: "elm.label.green";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               to: "elm.swallow.blue";
+            }
+            text {
+               font: FN;
+               size: 10;
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "elm.swallow.blue"; type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 1.0 0.0;
+            min: 60 20;
+            max: 60 20;
+            rel1 {
+               relative: 0.0 1.0;
+               to: "elm.swallow.green";
+            }
+         }
+      }
+      part { name: "elm.label.alpha"; type: TEXT;
+         description { state: "default" 0.0;
+            min: 15 0;
+            max: 15 -1;
+            rel1 {
+               relative: 0.0 1.0;
+               to: "elm.label.blue";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               to: "elm.swallow.alpha";
+            }
+            text {
+               font: FN;
+               size: 10;
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "elm.swallow.alpha"; type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 1.0 0.0;
+            min: 60 20;
+            max: 60 20;
+            rel1 {
+               relative: 0.0 1.0;
+               to: "elm.swallow.blue";
+            }
+         }
+      }
+   }
+}
+
+group { name: "elm/colorselector/picker/default";
+   images.image: "inset_shadow.png" COMP;
+   images.image: "bevel_in.png" COMP;
+   images.image: "dot_pattern.png" COMP;
+   parts {
+      part { name: "bg"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 20 20;
+            rel1.to: "elm.picker";
+            rel2.to: "elm.picker";
+            color: 48 48 48 255;
+         }
+      }
+      part { name: "pat";
+         description { state: "default" 0.0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            image.normal: "dot_pattern.png";
+            TILED_PATTERN(256, 256)
+         }
+      }
+      part { name: "clipper"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.picker";
+            rel2.to: "elm.picker";
+         }
+      }
+      part { name: "elm.picker"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.offset: 3 3;
+            rel2.offset: -4 -4;
+         }
+      }
+      part { name: "shadow"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "inset_shadow.png";
+            image.border: 5 5 7 3;
+            image.middle: 0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            fill.smooth: 0;
+            color: 255 255 255 128;
+         }
+      }
+      part { name: "inset"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "bevel_in.png";
+            image.border: 1 1 1 1;
+            image.middle: 0;
+            rel1.to: "bg";
+            rel1.offset: -1 -1;
+            rel2.to: "bg";
+            rel2.offset: 0 0;
+            fill.smooth: 0;
+         }
+      }
+   }
+}
+
+group { name: "elm/colorselector/bg/default";
+   parts {
+      part { name: "elm.colorbar_0"; type: SWALLOW;
+         description { state: "default" 0.0;
+            rel2.relative: 1.0 0.0;
+            align: 0.5 0.0;
+            fixed: 0 1;
+         }
+      }
+      part { name: "elm.colorbar_1"; type: SWALLOW;
+         description { state: "default" 0.0;
+            rel1.to_y: "elm.colorbar_0";
+            rel1.relative: 0.0 1.0;
+            rel2.to_y: "elm.colorbar_0";
+            rel2.relative: 1.0 1.0;
+            align: 0.5 0.0;
+            fixed: 0 1;
+         }
+      }
+      part { name: "elm.colorbar_2"; type: SWALLOW;
+         description { state: "default" 0.0;
+            rel1.to_y: "elm.colorbar_1";
+            rel1.relative: 0.0 1.0;
+            rel2.to_y: "elm.colorbar_1";
+            rel2.relative: 1.0 1.0;
+            align: 0.5 0.0;
+            fixed: 0 1;
+         }
+      }
+      part { name: "elm.colorbar_3"; type: SWALLOW;
+         description { state: "default" 0.0;
+            rel1.to_y: "elm.colorbar_2";
+            rel1.relative: 0.0 1.0;
+            align: 0.5 0.0;
+         }
+      }
+   }
+}
+
+group { name: "elm/colorselector/base/default";
+   images.image: "inset_shadow.png" COMP;
+   images.image: "bevel_in.png" COMP;
+   images.image: "ring_shadow.png" COMP;
+   images.image: "ring_white_blue_glow.png" COMP;
+   images.image: "col_sel_end_bottom.png" COMP;
+   images.image: "col_sel_end_top.png" COMP;
+   parts {
+      part { name: "elm.bar_bg"; type: SWALLOW; mouse_events: 0;
+         description { state: "default" 0.0;
+            min: 32 24;
+            rel1.offset: 0 9;
+            rel1.to_x: "elm.arrow_bg";
+            rel2.offset: -1 -12;
+            rel2.to_x: "elm.arrow_bg";
+         }
+      }
+      part { name: "elm.bar"; type: SWALLOW; mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to: "elm.bar_bg";
+            rel2.to: "elm.bar_bg";
+         }
+      }
+      part { name: "clipper"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "shadow";
+            rel2.to: "shadow";
+         }
+      }
+      part { name: "shadow"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "inset_shadow.png";
+            image.border: 5 5 7 3;
+            image.middle: 0;
+            rel1.to: "elm.bar_bg";
+            rel2.to: "elm.bar_bg";
+            fill.smooth: 0;
+            color: 255 255 255 128;
+         }
+      }
+      part { name: "inset"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "bevel_in.png";
+            image.border: 1 1 1 1;
+            image.middle: 0;
+            rel1.to: "shadow";
+            rel1.offset: -1 -1;
+            rel2.to: "shadow";
+            rel2.offset: 0 0;
+            fill.smooth: 0;
+         }
+      }
+      part { name: "elm.arrow_bg"; type: SWALLOW;
+         description { state: "default" 0.0;
+            rel1 {
+               relative: 1.0 0.0;
+               offset: 3 0;
+               to_x: "elm.l_button";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               offset: -4 0;
+               to_x: "elm.r_button";
+            }
+         }
+      }
+      part { name: "elm.arrow"; type: RECT;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 1 1;
+            rel1.to_x: "elm.arrow_bg";
+            rel2.to_x: "elm.arrow_bg";
+            visible: 0;
+         }
+         dragable {
+            confine: "elm.arrow_bg";
+            x: 1 1 0;
+            y: 0 0 0;
+         }
+      }
+      part { name: "event"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.arrow_icon";
+            rel2.to_x: "elm.arrow_icon";
+            rel2.to_y: "elm.arrow_bg";
+            color: 0 0 0 0;
+         }
+         dragable.events: "elm.arrow";
+      }
+      part { name: "arrow_under"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "ring_shadow.png";
+            rel1.to: "elm.arrow_icon";
+            rel2.to: "elm.arrow_icon";
+         }
+      }
+      part { name: "elm.arrow_icon"; type: SWALLOW; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 13 13;
+            max: 13 13;
+            align: 0.5 1.0;
+            rel1.to_x: "elm.arrow";
+            rel1.to_y: "shadow";
+            rel2.relative: 1.0 0.0;
+            rel2.to_x: "elm.arrow";
+            rel2.to_y: "shadow";
+         }
+      }
+      part { name: "end1"; mouse_events: 0;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            image.normal: "col_sel_end_top.png";
+            FIXED_SIZE(11, 8)
+            align: 0.5 0.0;
+            rel1.to_x: "cursor";
+            rel2.to_x: "cursor";
+            rel1.to_y: "shadow";
+            rel2.to_y: "shadow";
+         }
+      }
+      part { name: "end2"; mouse_events: 0;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            image.normal: "col_sel_end_bottom.png";
+            FIXED_SIZE(11, 8)
+            align: 0.5 1.0;
+            rel1.to_x: "cursor";
+            rel2.to_x: "cursor";
+            rel1.to_y: "shadow";
+            rel2.to_y: "shadow";
+         }
+      }
+      part { name: "arrow_over"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "ring_white_blue_glow.png";
+            rel1.to: "elm.arrow_icon";
+            rel2.to: "elm.arrow_icon";
+         }
+      }
+      part { name: "cursor"; type: RECT;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 1 1;
+            rel1.to_x: "elm.arrow_icon";
+            rel1.to_y: "shadow";
+            rel1.relative: 0.5 0.0;
+            rel2.to_x: "elm.arrow_icon";
+            rel2.to_y: "shadow";
+            rel2.relative: 0.5 1.0;
+            rel2.offset: 0 -1;
+            color: 255 255 255 255;
+         }
+         dragable.events: "elm.arrow";
+      }
+      part { name: "elm.arrow_bg_access"; type: RECT;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            rel1.to: "elm.arrow_bg";
+            rel2.to: "elm.arrow_bg";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "elm.l_button"; type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 24 24;
+            rel1.relative: 0.0 0.0;
+            rel1.to_y: "elm.bar_bg";
+            rel2.relative: 0.0 1.0;
+            rel2.to_y: "elm.bar_bg";
+            align: 0.0 0.5;
+         }
+      }
+      part { name: "elm.r_button"; type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 24 24;
+            rel1.relative: 1.0 0.0;
+            rel1.to_y: "elm.bar_bg";
+            rel2.relative: 1.0 1.0;
+            rel2.to_y: "elm.bar_bg";
+            align: 1.0 0.5;
+         }
+      }
+   }
+}
+
+group { name: "elm/colorselector/arrow/default";
+   images.image: "ring_white_middle.png" COMP;
+   parts {
+      part { name: "base";
+         description { state: "default" 0.0;
+            aspect: 1.0 1.0; aspect_preference: BOTH;
+            image.normal: "ring_white_middle.png";
+         }
+      }
+   }
+}
+
+group{ name: "elm/colorselector/image/colorbar_0/default";
+   images {
+      image: "color_picker_color.png" COMP;
+   }
+   parts {
+      part { name: "colorbar_0_image";
+         type: IMAGE;
+         description { state: "default" 0.0;
+            rel2.offset: -1 -1;
+            image.normal: "color_picker_color.png";
+         }
+      }
+   }
+}
+
+group { name: "elm/colorselector/image/colorbar_1/default";
+   images.image: "color_picker_opacity.png" COMP;
+   parts {
+      part { name: "colorbar_1_image";
+         description { state: "default" 0.0;
+            image.normal: "color_picker_opacity.png";
+         }
+      }
+   }
+}
+
+group { name: "elm/colorselector/image/colorbar_2/default";
+   images.image: "color_picker_brightness.png" COMP;
+   parts {
+      part { name: "colorbar_2_image";
+         description { state: "default" 0.0;
+            image.normal: "color_picker_brightness.png";
+         }
+      }
+   }
+}
+
+group { name: "elm/colorselector/image/colorbar_3/default";
+   images.image: "color_picker_alpha.png" COMP;
+   parts {
+      part { name: "colorbar_3_image";
+         description { state: "default" 0.0;
+            image.normal: "color_picker_alpha.png";
+         }
+      }
+   }
+}
+
+group { name: "elm/colorselector/bg_image/colorbar_3/default";
+   images.image: "dot_pattern.png" COMP;
+   parts {
+      part { name: "bg"; type: RECT;
+         description { state: "default" 0.0;
+            color: 48 48 48 255;
+         }
+      }
+      part { name: "pat";
+         description { state: "default" 0.0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            image.normal: "dot_pattern.png";
+            TILED_PATTERN(256, 256)
+         }
+      }
+   }
+}
+
+group { name: "elm/colorselector/item/default";
+   images.image: "inset_shadow.png" COMP;
+   images.image: "bevel_in.png" COMP;
+   images.image: "dot_pattern.png" COMP;
+   images.image: "bg_glow_in.png" COMP;
+   parts {
+      part { name: "bg"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 20 20;
+            rel1.to: "color_obj";
+            rel2.to: "color_obj";
+            color: 48 48 48 255;
+         }
+      }
+      part { name: "pat";
+         description { state: "default" 0.0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            image.normal: "dot_pattern.png";
+            TILED_PATTERN(256, 256)
+         }
+      }
+      part { name: "clipper"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "color_obj";
+            rel2.to: "color_obj";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 64;
+         }
+      }
+      part { name: "color_obj"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.offset: 3 3;
+            rel2.offset: -4 -4;
+         }
+      }
+      part { name: "shadow"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "inset_shadow.png";
+            image.border: 5 5 7 3;
+            image.middle: 0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            fill.smooth: 0;
+            color: 255 255 255 128;
+         }
+      }
+      part { name: "dim"; type: RECT; mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            color: 0 0 0 0;
+         }
+         description { state: "focused" 0.0;
+            inherit: "default" 0.0;
+            color: 0 0 0 128;
+         }
+      }
+      part { name: "glow"; mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            image.normal: "bg_glow_in.png";
+            image.border: 7 7 7 7;
+            image.middle: 0;
+            fill.smooth: 0;
+            color: 255 255 255 0;
+         }
+         description { state: "focused" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 255;
+         }
+      }
+      part { name: "inset"; mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "bevel_in.png";
+            image.border: 1 1 1 1;
+            image.middle: 0;
+            rel1.to: "bg";
+            rel1.offset: -1 -1;
+            rel2.to: "bg";
+            rel2.offset: 0 0;
+            fill.smooth: 0;
+         }
+      }
+   }
+   programs {
+      program {
+         source: "elm"; signal: "elm,state,selected";
+         action: STATE_SET "focused" 0.0;
+         transition: DECELERATE 0.1;
+         target: "glow";
+         target: "dim";
+      }
+      program {
+         source: "elm"; signal: "elm,state,unselected";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         target: "glow";
+         target: "dim";
+      }
+      program {
+         signal: "elm,anim,activate"; source: "elm";
+         action: STATE_SET "focused" 0.0;
+         transition: DECELERATE 0.1;
+         target: "glow";
+         target: "dim";
+         after: "active2";
+      }
+      program { name: "active2";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.8;
+         target: "glow";
+         target: "dim";
+      }
+   }
+}
+
+group { name: "elm/colorselector/item/color/default";
+   parts {
+      part { name: "color_rect"; type: RECT;
+         description{ state: "default" 0.0;
+         }
+      }
+   }
+}
diff --git a/data/themes/elm/entry.edc b/data/themes/elm/entry.edc
new file mode 100644 (file)
index 0000000..28e789c
--- /dev/null
@@ -0,0 +1,421 @@
+styles {
+   style { name: "entry_edit_style";
+      base: "font="FN" font_size=10 color=#000000 text_class=entry_edit left_margin=2 right_margin=2";
+      tag:  "em" "+ font_style=Oblique";
+      tag:  "link" "+ color=#800 underline=on underline_color=#8008";
+      tag:  "hilight" "+ font_weight=Bold style=glow glow_color=#3399ff80";
+      tag:  "error" "+ underline=single underline_color=#ff0000 underline2_color=#ff0000";
+      tag:  "preedit" "+ underline=on underline_color=#000";
+      tag:  "preedit_sel" "+ backing=on backing_color=#000 color=#FFFFFF";
+   }
+   style { name: "entry_single_textblock_style";
+      base: "font="FN" font_size=13 color=#585858 wrap=none text_class=entry left_margin=10 right_margin=0 valgin=0.5";
+      tag:  "em" "+ font_style=Oblique";
+      tag:  "link" "+ color=#800 underline=on underline_color=#8008";
+      tag:  "hilight" "+ font_weight=Bold style=glow glow_color=#3399ff80";
+      tag:  "error" "+ underline=single underline_color=#ff0000 underline2_color=#ff0000";
+      tag:  "preedit" "+ underline=on underline_color=#000";
+      tag:  "preedit_sel" "+ backing=on backing_color=#000 color=#FFFFFF";
+   }
+   style { name: "entry_slider_value_style";
+      base: "font="FN" font_size=10 color=#000000 wrap=none text_class=entry align=center";
+      tag:  "em" "+ font_style=Oblique";
+      tag:  "link" "+ color=#800 underline=on underline_color=#8008";
+      tag:  "hilight" "+ font_weight=Bold style=glow glow_color=#3399ff80";
+      tag:  "error" "+ underline=single underline_color=#ff0000 underline2_color=#ff0000";
+      tag:  "preedit" "+ underline=on underline_color=#000";
+      tag:  "preedit_sel" "+ backing=on backing_color=#000 color=#FFFFFF";
+   }
+   style { name: "entry_noedit_style";
+      base: "font="FN" font_size=13 color=#464646 wrap=word left_margin=0 right_margin=0";
+      tag:  "hilight" "+ color=#008aee style=glow glow_color=#cee8ff";
+   }
+   style { name: "entry_spinner_style";
+      base: "font="FN" font_size=13 color=#5B5B5B";
+   }
+}
+
+group { name: "elm/entry/base/default";
+   parts {
+      part { name: "elm.text";
+         type: TEXTBLOCK;
+         mouse_events: 1;
+         scale: 1;
+         entry_mode: EDITABLE;
+         select_mode: DEFAULT;
+         cursor_mode: BEFORE;
+         multiline: 1;
+         source: "elm/entry/selection/default"; // selection under
+                 //       source2: "X"; // selection over
+                 //       source3: "X"; // cursor under
+         source4: "elm/entry/cursor/default"; // cursorover
+         source5: "elm/entry/anchor/default"; // anchor under
+                  //       source6: "X"; // anchor over
+         description { state: "default" 0.0;
+            /* we gotta use 0 0 here, because of scrolled entries */
+            fixed: 0 0;
+            text {
+               style: "entry_edit_style";
+               min: 0 1;
+               align: 0.0 0.0;
+            }
+         }
+      }
+   }
+   programs {
+      program { name: "focus";
+         signal: "load";
+         source: "";
+         action: FOCUS_SET;
+         target: "elm.text";
+      }
+   }
+}
+
+group { name: "elm/entry/base-nowrap/default";
+   inherit: "elm/entry/base/default";
+   parts {
+      part { name: "elm.text";
+         select_mode: DEFAULT;
+         source: "elm/entry/selection/default"; // selection under
+         source4: "elm/entry/cursor/default"; // cursorover
+         source5: "elm/entry/anchor/default"; // anchor under
+         description { state: "default" 0.0;
+            text { style: "entry_edit_style";
+               min: 1 1;
+               align: 0.0 0.0;
+               ellipsis: -1;
+            }
+         }
+      }
+   }
+}
+group { name: "elm/entry/base-nowrap-noedit/default";
+   inherit: "elm/entry/base-nowrap/default";
+   parts {
+      part { name: "elm.text";
+         entry_mode: PLAIN;
+      }
+   }
+}
+
+group { name: "elm/entry/base-noedit/default";
+   inherit: "elm/entry/base/default";
+   parts {
+      part { name: "elm.text";
+         entry_mode: PLAIN;
+         description { state: "default" 0.0;
+            rel1.offset: 10 10;
+            rel2.offset: -11 -11;
+            text { style: "entry_noedit_style";
+               min: 0 1;
+               align: 0.0 0.0;
+            }
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/base-single/default";
+   inherit: "elm/entry/base/default";
+   parts {
+      part { name: "elm.text";
+         type: TEXTBLOCK;
+         multiline: 0;
+         description { state: "default" 0.0;
+            text {
+               style: "entry_single_textblock_style";
+               min: 1 1;
+               max: 0 0;
+               ellipsis: -1;
+            }
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/base-single/single_line";
+   inherit: "elm/entry/base/default";
+   parts {
+      part { name: "elm.text";
+         type: TEXTBLOCK;
+         multiline: 0;
+         description { state: "default" 0.0;
+            text {
+               style: "entry_single_textblock_style";
+               min: 1 1;
+               max: 0 0;
+               ellipsis: -1;
+            }
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/cursor/default";
+   min: 1 0;
+   images.image: "white_bar_vert_glow.png" COMP;
+   parts {
+      part { name: "cursor"; mouse_events: 0;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.offset: -4 -4;
+            rel2.offset: 3 3;
+            image.normal: "white_bar_vert_glow.png";
+            image.border: 4 4 4 4;
+            fill.smooth: 0;
+            color: 255 255 255 0;
+            min: 9 10;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 255;
+         }
+      }
+      part { name: "clipper"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "cursor";
+            rel2.to: "cursor";
+            fixed: 1 1;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "selection,start"; source: "elm.text";
+         action: STATE_SET "hidden" 0.0;
+         target: "clipper";
+      }
+      program {
+         signal: "selection,cleared"; source: "elm.text";
+         action: STATE_SET "default" 0.0;
+         target: "clipper";
+      }
+      program {
+         signal: "elm,action,focus"; source: "elm";
+         action: ACTION_STOP;
+         target: "cursor_show";
+         target: "cursor_hide";
+         target: "cursor_show_timer";
+         target: "cursor_hide_timer";
+         after: "cursor_show";
+      }
+      program {
+         signal: "elm,action,unfocus"; source: "elm";
+         action: ACTION_STOP;
+         target: "cursor_show";
+         target: "cursor_hide";
+         target: "cursor_show_timer";
+         target: "cursor_hide_timer";
+         after: "cursor_hide_stop";
+      }
+      program {
+         signal: "elm,action,show,cursor"; source: "elm";
+         action: ACTION_STOP;
+         target: "cursor_show";
+         target: "cursor_hide";
+         target: "cursor_show_timer";
+         target: "cursor_hide_timer";
+         after: "cursor_show";
+      }
+      program { name: "cursor_hide_stop";
+         action: STATE_SET "default" 0.0;
+         target: "cursor";
+      }
+      program { name: "cursor_show";
+         action: STATE_SET "visible" 0.0;
+         target: "cursor";
+         after: "cursor_show_timer";
+      }
+      program { name: "cursor_hide";
+         action: STATE_SET "default" 0.0;
+         target: "cursor";
+         transition: SINUSOIDAL 0.2;
+         after: "cursor_hide_timer";
+      }
+      program { name: "cursor_show_timer";
+         in: 0.5 0.0;
+         after: "cursor_hide";
+      }
+      program { name: "cursor_hide_timer";
+         in: 0.2 0.0;
+         after: "cursor_show";
+      }
+   }
+}
+
+group { name: "elm/entry/cursor/slider";
+   inherit: "elm/entry/cursor/default";
+   parts {
+      part { name: "cursor";
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            color: 45 180 200 255;
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/selection/default";
+   parts {
+      part { name: "bg";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: 125 237 255 255;
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/anchor/default";
+   parts {
+      part { name: "bg";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: 128 0 0 64;
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/base/slider_value";
+   images {
+      image: "text_input_box.png" COMP;
+      image: "text_input_box_hover.png" COMP;
+      image: "text_input_box_push.png" COMP;
+   }
+   parts {
+      part { name: "base_img";
+         scale: 1;
+         description { state: "default" 0.0;
+            image.normal: "text_input_box.png";
+            image.border: 4 4 5 3;
+         }
+         description { state: "hovered" 0.0;
+            image.normal: "text_input_box_hover.png";
+            image.border: 4 4 5 3;
+         }
+         description { state: "pushed" 0.0;
+            image.normal: "text_input_box_push.png";
+            image.border: 4 4 5 3;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXTBLOCK;
+         mouse_events: 1;
+         scale: 1;
+         entry_mode: EDITABLE;
+         select_mode: DEFAULT;
+         cursor_mode: UNDER;
+         multiline: 1;
+         source: "elm/entry/selection/default"; // selection under
+                 //       source2: "X"; // selection over
+         source3: "elm/entry/cursor/slider"; // cursor under
+                 //       source4: "X"; // cursorover
+         source5: "elm/entry/anchor/default"; // anchor under
+                  //       source6: "X"; // anchor over
+         description { state: "default" 0.0;
+            /* we gotta use 0 0 here, because of scrolled entries */
+            fixed: 0 0;
+            text {
+               style: "entry_edit_style";
+               min: 0 1;
+               align: 0.0 0.0;
+               ellipsis: -1;
+            }
+         }
+      }
+   }
+   programs {
+      program { name: "focus";
+         signal: "load";
+         source: "";
+         action: FOCUS_SET;
+         target: "elm.text";
+      }
+      program { name: "mouse_in";
+         signal: "mouse,in";
+         source: "elm.text";
+         action: STATE_SET "hovered" 0.0;
+         target: "base_img";
+      }
+      program { name: "mouse_out";
+         signal: "mouse,out";
+         source: "elm.text";
+         action: STATE_SET "default" 0.0;
+         target: "base_img";
+      }
+      program { name: "mouse_down";
+         signal: "mouse,down,1";
+         source: "elm.text";
+         action: STATE_SET "pushed" 0.0;
+         target: "base_img";
+      }
+      program { name: "mouse_up";
+         signal: "mouse,up,1";
+         source: "elm.text";
+         action: STATE_SET "default" 0.0;
+         target: "base_img";
+      }
+   }
+}
+
+group { name: "elm/entry/base-single/slider_value";
+   inherit: "elm/entry/base/slider_value";
+   parts {
+      part { name: "elm.text";
+         type: TEXTBLOCK;
+         multiline: 0;
+         description { state: "default" 0.0;
+            text {
+               style: "entry_slider_value_style";
+               min: 1 1;
+               max: 0 0;
+            }
+         }
+      }
+   }
+}
+
+group { name: "elm/entry/base-single/spinner/default";
+   alias: "elm/entry/base-single/spinner/color_input";
+   parts {
+      part { name: "elm.text";
+         type: TEXTBLOCK;
+         scale: 1;
+         entry_mode: EDITABLE;
+         select_mode: DEFAULT;
+         cursor_mode: BEFORE;
+         multiline: 0;
+         source: "elm/entry/selection/default"; // selection under
+                 //       source2: "X"; // selection over
+                 //       source3: "X"; // cursor under
+         source4: "elm/entry/cursor/default"; // cursorover
+         source5: "elm/entry/anchor/default"; // anchor under
+                  //       source6: "X"; // anchor over
+         description { state: "default" 0.0;
+            /* we gotta use 0 0 here, because of scrolled entries */
+            fixed: 0 0;
+            text {
+               style: "entry_spinner_style";
+               min: 0 1;
+               align: 0.0 0.0;
+            }
+         }
+      }
+   }
+   programs {
+      program { name: "focus";
+         signal: "load";
+         source: "";
+         action: FOCUS_SET;
+         target: "elm.text";
+      }
+   }
+}
diff --git a/data/themes/elm/enventor.edc b/data/themes/elm/enventor.edc
new file mode 100644 (file)
index 0000000..58cc0c8
--- /dev/null
@@ -0,0 +1,37 @@
+#define FN "Tizen"
+#define FNBD "Tizen_Bold"
+#define COL_HI 0 103 244 255
+#define COL_HI_TRANS 0 103 244 0
+#define COL_HI2 0 221 254 255
+#define COL_NM 41 41 41 255
+#define COL_NM_TRANS 41 41 41 0
+#define COL_NM2 51 51 51 255
+#define COL_NM3 72 72 72 255
+#define COL_WH 255 255 255 255
+#define COL_BL 0 0 0 255
+
+data.item: "version" "110";
+
+fonts {
+   font: "BreezeSans.ttf" "Tizen";
+   font: "BreezeSans-Bold.ttf" "Tizen_Bold";
+}
+
+collections {
+   #include "button.edc"
+   #include "entry.edc"
+   #include "panes.edc"
+   #include "scroller.edc"
+   #include "separator.edc"
+   #include "list.edc"
+   #include "slider.edc"
+   #include "check.edc"
+   #include "hover.edc"
+   #include "menu.edc"
+   #include "colorsel.edc"
+   #include "spinner.edc"
+   #include "genlist.edc"
+   #include "tooltip.edc"
+   #include "focus.edc"
+   #include "label.edc"
+}
diff --git a/data/themes/elm/focus.edc b/data/themes/elm/focus.edc
new file mode 100644 (file)
index 0000000..24c9f62
--- /dev/null
@@ -0,0 +1,4 @@
+group { name: "elm/focus_highlight/top/blank";
+   parts {
+   }
+}
diff --git a/data/themes/elm/fonts/BreezeSans-Bold.ttf b/data/themes/elm/fonts/BreezeSans-Bold.ttf
new file mode 100644 (file)
index 0000000..cd41488
Binary files /dev/null and b/data/themes/elm/fonts/BreezeSans-Bold.ttf differ
diff --git a/data/themes/elm/fonts/BreezeSans.ttf b/data/themes/elm/fonts/BreezeSans.ttf
new file mode 100644 (file)
index 0000000..60e3e61
Binary files /dev/null and b/data/themes/elm/fonts/BreezeSans.ttf differ
diff --git a/data/themes/elm/fonts/Makefile.am b/data/themes/elm/fonts/Makefile.am
new file mode 100644 (file)
index 0000000..7c62a7b
--- /dev/null
@@ -0,0 +1,4 @@
+MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST = \
+   BreezeSans.ttf \
+       BreezeSans-Bold.ttf
diff --git a/data/themes/elm/genlist.edc b/data/themes/elm/genlist.edc
new file mode 100644 (file)
index 0000000..9b2b325
--- /dev/null
@@ -0,0 +1,444 @@
+group { name: "elm/genlist/base/default";
+   inherit: "elm/scroller/base/default";
+   parts {
+      part { name: "bg";
+         description { state: "default" 0.0;
+           color: 248 248 248 255;
+         }
+      }
+   }
+}
+
+group { name: "elm/genlist/item/default/default";
+   script {
+      public item_selected = 0;
+      public item_expanded = 0;
+   }
+   data {
+      item: "texts" "elm.text";
+      item: "treesize" "20";
+      item: "contents" "elm.swallow.icon elm.swallow.icon_selected elm.swallow.end";
+      item: "flips" "elm.text.flip";
+      item: "focusraise" "on";
+      item: "selectraise" "on";
+   }
+   parts {
+      part { name: "base";
+         type: RECT;
+         description { state: "default" 0.0;
+            min: 0 22;
+            color: 248 248 248 255;
+         }
+         description { state: "odd" 0.0;
+            inherit: "default";
+         }
+      }
+      part { name: "bg";
+         type: RECT;
+         description { state: "default" 0.0;
+            visible: 0;
+         }
+         description { state: "selected" 0.0;
+            color: 0 138 238 255;
+         }
+         description { state: "hovered" 0.0;
+            color: 205 233 255 255;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            color: 88 88 88 255;
+            rel1 {
+               relative: 1.0 0.0;
+               offset: 5 0;
+               to_x: "elm.swallow.icon";
+            }
+            rel2 {
+               relative: 0.0 1.0;
+               to_x: "elm.swallow.end";
+            }
+            text {
+               font: FN;
+               size: 13;
+               text_class: "list_item";
+               min: 1 1;
+               align: 0.0 0.5;
+               ellipsis: -1.0;
+            }
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 255;
+            visible: 1;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+         description { state: "flip_enabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "elm.text.flip";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            rel1 {
+               to_y: "elm.text";
+            }
+            rel2 {
+               to_y: "elm.text";
+            }
+         }
+         description { state: "flip_enabled" 0.0;
+            rel1 {
+               to_y: "elm.text";
+            }
+            rel2 {
+               to_y: "elm.text";
+            }
+         }
+      }
+      part { name: "elm.swallow.pad";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 0.0 0.5;
+            fixed: 1 0;
+            rel1 {
+               offset: 20 0;
+            }
+            rel2 {
+               offset: 19 -1;
+               relative: 0.0 1.0;
+            }
+         }
+      }
+      part { name: "arrow";
+         type: SPACER;
+         description { state: "default" 0.0;
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 9 9;
+            max: 9 9;
+            rel1.to_x: "elm.swallow.pad";
+            rel2.to_x: "elm.swallow.pad";
+            rel1.relative: 1.0 0.0;
+         }
+      }
+      part { name: "elm.swallow.icon";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 16 16;
+            max: 16 16;
+            aspect: 1.0 1.0;
+            rel1 {
+               relative: 1.0 0.0;
+               offset: 7 0;
+               to_x: "arrow";
+            }
+            rel2 {
+               to_x: "arrow";
+            }
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+         description { state: "flip_enabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "elm.swallow.icon_selected";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 16 16;
+            max: 16 16;
+            aspect: 1.0 1.0;
+            rel1 {
+               relative: 1.0 0.0;
+               offset: 7 0;
+               to_x: "arrow";
+            }
+            rel2 {
+               to_x: "arrow";
+            }
+            visible: 0;
+         }
+         description { state: "selected" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+         description { state: "flip_enabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "elm.swallow.end";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 1.0 0.5;
+            fixed: 1 1;
+            min: 16 16;
+            max: 16 16;
+            aspect: 1.0 1.0;
+            rel1 {
+               relative: 1.0 0.0;
+               offset: -3 2;
+            }
+            rel2 {
+               offset: -3 -3;
+            }
+         }
+         description { state: "flip_enabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "event";
+         type: RECT;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            visible: 0;
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "event_block";
+         type: RECT;
+         description { state: "default" 0.0;
+            visible: 0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program { name: "program_0x1887b40";
+         signal: "elm,state,enabled";
+         source: "elm";
+         action: STATE_SET "default" 0.00;
+         target: "elm.text";
+         target: "event_block";
+         target: "event";
+      }
+      program { name: "program_0x18874a0";
+         signal: "elm,state,disabled";
+         source: "elm";
+         action: STATE_SET "disabled" 0.00;
+         target: "elm.text";
+         target: "event_block";
+         target: "event";
+      }
+      program { name: "program_0x1873500";
+         signal: "elm,state,even";
+         source: "elm";
+         action: STATE_SET "default" 0.00;
+         target: "base";
+      }
+      program { name: "program_0x188a930";
+         signal: "elm,state,flip,disabled";
+         source: "elm";
+         action: STATE_SET "default" 0.00;
+         target: "elm.text";
+         target: "elm.text.flip";
+         target: "elm.swallow.end";
+         target: "elm.swallow.icon";
+         target: "elm.swallow.icon_selected";
+      }
+      program { name: "program_0x1888240";
+         signal: "elm,state,flip,enabled";
+         source: "elm";
+         action: STATE_SET "flip_enabled" 0.00;
+         target: "elm.text";
+         target: "elm.text.flip";
+         target: "elm.swallow.end";
+         target: "elm.swallow.icon";
+         target: "elm.swallow.icon_selected";
+      }
+      program { name: "program_0x18739f0";
+         signal: "elm,state,odd";
+         source: "elm";
+         action: STATE_SET "odd" 0.00;
+         target: "base";
+      }
+      program { name: "item_mouse_in";
+         signal: "mouse,in";
+         source: "event";
+         script {
+            if (!get_int(item_selected))
+              set_state(PART:"bg", "hovered", 0.0);
+         }
+      }
+      program { name: "item_mouse_out";
+         signal: "mouse,out";
+         source: "event";
+         script {
+            if (!get_int(item_selected))
+              set_state(PART:"bg", "default", 0.0);
+         }
+      }
+      program { name: "program_0x18867c0";
+         signal: "elm,state,selected";
+         source: "elm";
+         script {
+            set_int(item_selected, 1);
+            set_state(PART:"elm.text", "selected", 0.0);
+            set_state(PART:"bg", "selected", 0.0);
+            set_state(PART:"elm.swallow.icon", "selected", 0.0);
+            set_state(PART:"elm.swallow.icon_selected", "selected", 0.0);
+         }
+      }
+      program { name: "program_0x1886e40";
+         signal: "elm,state,unselected";
+         source: "elm";
+         script {
+            set_int(item_selected, 0);
+            set_state(PART:"elm.text", "default", 0.0);
+            set_state(PART:"bg", "default", 0.0);
+            set_state(PART:"elm.swallow.icon", "default", 0.0);
+            set_state(PART:"elm.swallow.icon_selected", "default", 0.0);
+         }
+      }
+   }
+}
+
+group { name: "elm/genlist/tree/default/default";
+   inherit: "elm/genlist/item/default/default";
+   data {
+      item: "texts" "elm.text";
+      item: "treesize" "20";
+      item: "contents" "elm.swallow.icon elm.swallow.icon_selected elm.swallow.end";
+      item: "flips" "elm.text.flip";
+      item: "focusraise" "on";
+      item: "selectraise" "on";
+   }
+   images {
+      image: "view_arrow_right_nor.png" COMP;
+      image: "view_arrow_right_sel.png" COMP;
+      image: "view_arrow_down_nor.png" COMP;
+      image: "view_arrow_down_sel.png" COMP;
+   }
+   parts {
+      part { name: "arrow";
+         type: IMAGE;
+         description { state: "default" 0.0;
+            align: 0.0 0.5;
+            fixed: 1 1;
+            min: 9 9;
+            max: 9 9;
+            rel1.to_x: "elm.swallow.pad";
+            rel2.to_x: "elm.swallow.pad";
+            rel1.relative: 1.0 0.0;
+            image.normal: "view_arrow_right_nor.png";
+         }
+         description { state: "selected" 0.0;
+            inherit: "default";
+            image.normal: "view_arrow_right_sel.png";
+         }
+         description { state: "expanded" 0.0;
+            inherit: "default";
+            image.normal: "view_arrow_down_nor.png";
+         }
+         description { state: "expanded_selected" 0.0;
+            inherit: "default";
+            image.normal: "view_arrow_down_sel.png";
+         }
+      }
+      part { name: "event";
+         type: RECT;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            visible: 0;
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "event_block";
+         type: RECT;
+         description { state: "default" 0.0;
+            visible: 0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program { name: "program_0x18867c0";
+         signal: "elm,state,selected";
+         source: "elm";
+         script {
+            set_int(item_selected, 1);
+            if (get_int(item_expanded))
+              set_state(PART:"arrow", "expanded_selected", 0.0);
+            else
+              set_state(PART:"arrow", "selected", 0.0);
+
+            set_state(PART:"elm.text", "selected", 0.0);
+            set_state(PART:"bg", "selected", 0.0);
+            set_state(PART:"elm.swallow.icon", "selected", 0.0);
+            set_state(PART:"elm.swallow.icon_selected", "selected", 0.0);
+         }
+      }
+      program { name: "program_0x1886e40";
+         signal: "elm,state,unselected";
+         source: "elm";
+         script {
+            set_int(item_selected, 0);
+            if (get_int(item_expanded))
+              set_state(PART:"arrow", "expanded", 0.0);
+            else
+              set_state(PART:"arrow", "default", 0.0);
+
+            set_state(PART:"elm.text", "default", 0.0);
+            set_state(PART:"bg", "default", 0.0);
+            set_state(PART:"elm.swallow.icon", "default", 0.0);
+            set_state(PART:"elm.swallow.icon_selected", "default", 0.0);
+         }
+      }
+      program { name: "program_expand";
+         signal: "elm,state,expanded";
+         source: "elm";
+         script {
+            set_int(item_expanded, 1);
+            if (get_int(item_selected))
+              set_state(PART:"arrow", "expanded_selected", 0.0);
+            else
+              set_state(PART:"arrow", "expanded", 0.0);
+         }
+      }
+      program { name: "program_contract";
+         signal: "elm,state,contracted";
+         source: "elm";
+         script {
+            set_int(item_expanded, 0);
+            if (get_int(item_selected))
+              set_state(PART:"arrow", "selected", 0.0);
+            else
+              set_state(PART:"arrow", "default", 0.0);
+         }
+      }
+      program { name: "program_expand_toggle";
+         signal: "mouse,up,1";
+         source: "arrow";
+         action: SIGNAL_EMIT "elm,action,expand,toggle" "elm";
+      }
+   }
+}
diff --git a/data/themes/elm/hover.edc b/data/themes/elm/hover.edc
new file mode 100644 (file)
index 0000000..814940e
--- /dev/null
@@ -0,0 +1,157 @@
+group { name: "elm/hover/base/menu";
+   images {
+      image: "candidates_list_bg.png" COMP;
+   }
+   parts {
+      part { name: "elm.swallow.offset";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 0.0 0.0;
+            rel1.relative: 0.0 0.0;
+            rel2.relative: 0.0 0.0;
+         }
+      }
+      part { name: "elm.swallow.size";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            align: 0.0 0.0;
+            rel1.to: "elm.swallow.offset";
+            rel1.relative: 1.0 1.0;
+            rel2.to: "elm.swallow.offset";
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      part { name: "base";
+         type: RECT;
+         mouse_events: 1;
+         description { state: "default";
+            color: 0 0 0 0;
+         }
+         description { state: "visible";
+            inherit: "default";
+            color: 0 0 0 64;
+         }
+      }
+      part { name: "elm.swallow.slot.left";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+         }
+      }
+      part { name: "elm.swallow.slot.right";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+         }
+      }
+      part { name: "elm.swallow.slot.top";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+         }
+      }
+      part { name: "bottomclip";
+         type: RECT;
+         description { state: "default" 0.0;
+            rel1.to_y: "pop";
+            rel1.relative: 0.0 1.0;
+            rel1.offset: -1 -2;
+         }
+      }
+      part { name: "bottom";
+         clip_to: "bottomclip";
+         description { state: "default" 0.0;
+            visible: 0;
+            rel1.to: "elm.swallow.slot.bottom";
+            rel2.to: "elm.swallow.slot.bottom";
+            min: 128 194;
+            max: 128 194;
+            fixed: 1 1;
+            image {
+               normal: "candidates_list_bg.png";
+               border: 5 5 5 5;
+            }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.slot.bottom";
+         type: SWALLOW;
+         clip_to: "bottomclip";
+         description { state: "default" 0.0;
+            align: 0.5 1.0;
+            rel1.to: "elm.swallow.slot.middle";
+            rel1.relative: 0.0 1.0;
+            rel1.offset: 0 0;
+            rel2.to: "elm.swallow.slot.middle";
+            rel2.relative: 1.0 1.0;
+            rel2.offset: -1 0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            rel1.offset: 0 6;
+            rel2.offset: -1 6;
+            align: 0.5 0.0;
+         }
+      }
+      part { name: "pop";
+         mouse_events: 1;
+         repeat_events:1;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.slot.middle";
+            rel2.to: "elm.swallow.slot.middle";
+            image {
+               normal: "candidates_list_bg.png";
+               border: 5 5 5 5;
+            }
+         }
+      }
+      part { name: "elm.swallow.slot.middle";
+         type: SWALLOW;
+         repeat_events:1;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.size";
+            rel2.to: "elm.swallow.size";
+         }
+      }
+   }
+   programs {
+      program { name: "end";
+         signal: "mouse,up,1";
+         source: "base";
+         action: SIGNAL_EMIT "elm,action,dismiss" "";
+      }
+      program { name: "show";
+         signal: "elm,action,show";
+         source: "elm";
+         action: STATE_SET "visible" 0.0;
+                 //            transition: DECELERATE 0.5;
+         target: "base";
+      }
+      program { name: "hide";
+         signal: "elm,action,hide";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+                 //            transition: DECELERATE 0.5;
+         target: "base";
+      }
+      program { name: "bottomshow";
+         signal: "elm,action,slot,bottom,show";
+         source: "elm";
+         action: STATE_SET "visible" 0.0;
+         transition: DECELERATE 0.3;
+         target: "bottom";
+         target: "elm.swallow.slot.bottom";
+      }
+      program { name: "bottomhide";
+         signal: "elm,action,slot,bottom,hide";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         target: "bottom";
+         target: "elm.swallow.slot.bottom";
+      }
+   }
+}
diff --git a/data/themes/elm/images/Makefile.am b/data/themes/elm/images/Makefile.am
new file mode 100644 (file)
index 0000000..6456ef8
--- /dev/null
@@ -0,0 +1,115 @@
+MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST = \
+   btn_widget.png \
+   btn_widget_push.png \
+   btn_widget_disable.png \
+   btn_widget_hover.png \
+   btn_help_widget.png \
+   btn_help_widget_push.png \
+   btn_help_widget_hover.png \
+   btn_tab_left.png \
+   btn_tab_left_push.png \
+   btn_tab_left_hover.png \
+   btn_tab_right.png \
+   btn_tab_right_push.png \
+   btn_tab_right_hover.png \
+   bg_glow_in.png \
+   check_nor.png \
+   check_sel.png \
+   scroll.png \
+   scroll_push.png \
+   scroll_hover.png \
+   scroll_h.png \
+   scroll_h_push.png \
+   scroll_h_hover.png \
+   scroll_bg.png \
+   scroll_bg_h.png \
+   scroll_handle.png \
+   scroll_handle_h.png \
+   scroll_btn_up.png \
+   scroll_btn_up_push.png \
+   scroll_btn_up_hover.png \
+   scroll_btn_up_disable.png \
+   scroll_btn_down.png \
+   scroll_btn_down_push.png \
+   scroll_btn_down_hover.png \
+   scroll_btn_down_disable.png \
+   scroll_btn_left.png \
+   scroll_btn_left_push.png \
+   scroll_btn_left_hover.png \
+   scroll_btn_left_disable.png \
+   scroll_btn_right.png \
+   scroll_btn_right_push.png \
+   scroll_btn_right_hover.png \
+   scroll_btn_right_disable.png \
+   window_scale_controller_h.png \
+   window_scale_controller_h_push.png \
+   window_scale_controller_h_hover.png \
+   window_scale_controller_left.png \
+   window_scale_controller_left_push.png \
+   window_scale_controller_left_hover.png \
+   window_scale_controller_right.png \
+   window_scale_controller_right_push.png \
+   window_scale_controller_right_hover.png \
+   white_bar_vert_glow.png \
+   candidates_list_bg.png \
+   text_input_box_hover.png \
+   text_input_box.png \
+   text_input_box_push.png \
+   text_input_box_selected.png \
+   slider_gauge.png \
+   slider_gauge_over.png \
+   slider_gauge_handle.png \
+   toggle_on.png \
+   toggle_off.png \
+   text_input_box.png \
+   text_input_box_hover.png \
+   text_input_box_push.png \
+   text_input_box_selected.png \
+   sym_left_light_normal.png \
+   sym_right_light_normal.png \
+   sym_right_glow_normal.png \
+   sym_right_dark_normal.png \
+   sym_left_glow_normal.png \
+   sym_left_dark_normal.png \
+   vert_bar_inset.png \
+   bevel_dark_in.png \
+   inset_shadow.png \
+   bevel_in.png \
+   dot_pattern.png \
+   ring_shadow.png \
+   ring_white_blue_glow.png \
+   col_sel_end_bottom.png \
+   col_sel_end_top.png \
+   ring_white_middle.png \
+   color_picker_alpha.png \
+   color_picker_color.png \
+   color_picker_opacity.png \
+   color_picker_brightness.png \
+   bg_glow_in.png \
+   tooltip-base.png \
+   tooltip-edge-top-tip.png \
+   tooltip-edge-left-tip.png \
+   tooltip-edge-right-tip.png \
+   tooltip-edge-bottom-tip.png \
+   tooltip-corner-top-left-tip.png \
+   tooltip-corner-top-right-tip.png \
+   tooltip-corner-bottom-left-tip.png \
+   tooltip-corner-bottom-right-tip.png \
+   slider_gauge_pop.png \
+   slider_gauge_over_pop.png \
+   slider_gauge_handle_pop.png \
+   colorbar_btn_r_nor.png \
+   colorbar_btn_r_sel.png \
+   colorbar_btn_r_mv.png \
+   colorbar_btn_l_nor.png \
+   colorbar_btn_l_sel.png \
+   colorbar_btn_l_mv.png \
+   color_btn_widget.png \
+   color_btn_widget_disable.png \
+   color_btn_widget_hover.png \
+   color_btn_widget_push.png \
+   view_arrow_right_nor.png \
+   view_arrow_right_sel.png \
+   view_arrow_down_nor.png \
+   view_arrow_down_sel.png
diff --git a/data/themes/elm/images/bevel_dark_in.png b/data/themes/elm/images/bevel_dark_in.png
new file mode 100644 (file)
index 0000000..f40f132
Binary files /dev/null and b/data/themes/elm/images/bevel_dark_in.png differ
diff --git a/data/themes/elm/images/bevel_in.png b/data/themes/elm/images/bevel_in.png
new file mode 100644 (file)
index 0000000..152e5ac
Binary files /dev/null and b/data/themes/elm/images/bevel_in.png differ
diff --git a/data/themes/elm/images/bg_glow_in.png b/data/themes/elm/images/bg_glow_in.png
new file mode 100644 (file)
index 0000000..0cb68af
Binary files /dev/null and b/data/themes/elm/images/bg_glow_in.png differ
diff --git a/data/themes/elm/images/btn_help_widget.png b/data/themes/elm/images/btn_help_widget.png
new file mode 100644 (file)
index 0000000..5ca1fb7
Binary files /dev/null and b/data/themes/elm/images/btn_help_widget.png differ
diff --git a/data/themes/elm/images/btn_help_widget_hover.png b/data/themes/elm/images/btn_help_widget_hover.png
new file mode 100644 (file)
index 0000000..91e0d69
Binary files /dev/null and b/data/themes/elm/images/btn_help_widget_hover.png differ
diff --git a/data/themes/elm/images/btn_help_widget_push.png b/data/themes/elm/images/btn_help_widget_push.png
new file mode 100644 (file)
index 0000000..f3688ab
Binary files /dev/null and b/data/themes/elm/images/btn_help_widget_push.png differ
diff --git a/data/themes/elm/images/btn_tab_left.png b/data/themes/elm/images/btn_tab_left.png
new file mode 100644 (file)
index 0000000..6cd198b
Binary files /dev/null and b/data/themes/elm/images/btn_tab_left.png differ
diff --git a/data/themes/elm/images/btn_tab_left_hover.png b/data/themes/elm/images/btn_tab_left_hover.png
new file mode 100644 (file)
index 0000000..70d6cb4
Binary files /dev/null and b/data/themes/elm/images/btn_tab_left_hover.png differ
diff --git a/data/themes/elm/images/btn_tab_left_push.png b/data/themes/elm/images/btn_tab_left_push.png
new file mode 100644 (file)
index 0000000..779d1cd
Binary files /dev/null and b/data/themes/elm/images/btn_tab_left_push.png differ
diff --git a/data/themes/elm/images/btn_tab_right.png b/data/themes/elm/images/btn_tab_right.png
new file mode 100644 (file)
index 0000000..6881b6e
Binary files /dev/null and b/data/themes/elm/images/btn_tab_right.png differ
diff --git a/data/themes/elm/images/btn_tab_right_hover.png b/data/themes/elm/images/btn_tab_right_hover.png
new file mode 100644 (file)
index 0000000..d77a04f
Binary files /dev/null and b/data/themes/elm/images/btn_tab_right_hover.png differ
diff --git a/data/themes/elm/images/btn_tab_right_push.png b/data/themes/elm/images/btn_tab_right_push.png
new file mode 100644 (file)
index 0000000..32e03de
Binary files /dev/null and b/data/themes/elm/images/btn_tab_right_push.png differ
diff --git a/data/themes/elm/images/btn_widget.png b/data/themes/elm/images/btn_widget.png
new file mode 100644 (file)
index 0000000..290e72d
Binary files /dev/null and b/data/themes/elm/images/btn_widget.png differ
diff --git a/data/themes/elm/images/btn_widget_disable.png b/data/themes/elm/images/btn_widget_disable.png
new file mode 100644 (file)
index 0000000..a73c35e
Binary files /dev/null and b/data/themes/elm/images/btn_widget_disable.png differ
diff --git a/data/themes/elm/images/btn_widget_hover.png b/data/themes/elm/images/btn_widget_hover.png
new file mode 100644 (file)
index 0000000..4e2f25b
Binary files /dev/null and b/data/themes/elm/images/btn_widget_hover.png differ
diff --git a/data/themes/elm/images/btn_widget_push.png b/data/themes/elm/images/btn_widget_push.png
new file mode 100644 (file)
index 0000000..f197980
Binary files /dev/null and b/data/themes/elm/images/btn_widget_push.png differ
diff --git a/data/themes/elm/images/candidates_list_bg.png b/data/themes/elm/images/candidates_list_bg.png
new file mode 100644 (file)
index 0000000..ba98a46
Binary files /dev/null and b/data/themes/elm/images/candidates_list_bg.png differ
diff --git a/data/themes/elm/images/canvas_pattern.png b/data/themes/elm/images/canvas_pattern.png
new file mode 100644 (file)
index 0000000..7583e81
Binary files /dev/null and b/data/themes/elm/images/canvas_pattern.png differ
diff --git a/data/themes/elm/images/check_nor.png b/data/themes/elm/images/check_nor.png
new file mode 100644 (file)
index 0000000..95760d2
Binary files /dev/null and b/data/themes/elm/images/check_nor.png differ
diff --git a/data/themes/elm/images/check_sel.png b/data/themes/elm/images/check_sel.png
new file mode 100644 (file)
index 0000000..b0a7d44
Binary files /dev/null and b/data/themes/elm/images/check_sel.png differ
diff --git a/data/themes/elm/images/col_sel_end_bottom.png b/data/themes/elm/images/col_sel_end_bottom.png
new file mode 100644 (file)
index 0000000..403fe59
Binary files /dev/null and b/data/themes/elm/images/col_sel_end_bottom.png differ
diff --git a/data/themes/elm/images/col_sel_end_top.png b/data/themes/elm/images/col_sel_end_top.png
new file mode 100644 (file)
index 0000000..77c4f55
Binary files /dev/null and b/data/themes/elm/images/col_sel_end_top.png differ
diff --git a/data/themes/elm/images/color_btn_widget.png b/data/themes/elm/images/color_btn_widget.png
new file mode 100644 (file)
index 0000000..74675cd
Binary files /dev/null and b/data/themes/elm/images/color_btn_widget.png differ
diff --git a/data/themes/elm/images/color_btn_widget_disable.png b/data/themes/elm/images/color_btn_widget_disable.png
new file mode 100644 (file)
index 0000000..a73c35e
Binary files /dev/null and b/data/themes/elm/images/color_btn_widget_disable.png differ
diff --git a/data/themes/elm/images/color_btn_widget_hover.png b/data/themes/elm/images/color_btn_widget_hover.png
new file mode 100644 (file)
index 0000000..94cad76
Binary files /dev/null and b/data/themes/elm/images/color_btn_widget_hover.png differ
diff --git a/data/themes/elm/images/color_btn_widget_push.png b/data/themes/elm/images/color_btn_widget_push.png
new file mode 100644 (file)
index 0000000..a903c67
Binary files /dev/null and b/data/themes/elm/images/color_btn_widget_push.png differ
diff --git a/data/themes/elm/images/color_picker_alpha.png b/data/themes/elm/images/color_picker_alpha.png
new file mode 100644 (file)
index 0000000..ca666ad
Binary files /dev/null and b/data/themes/elm/images/color_picker_alpha.png differ
diff --git a/data/themes/elm/images/color_picker_brightness.png b/data/themes/elm/images/color_picker_brightness.png
new file mode 100644 (file)
index 0000000..125683c
Binary files /dev/null and b/data/themes/elm/images/color_picker_brightness.png differ
diff --git a/data/themes/elm/images/color_picker_color.png b/data/themes/elm/images/color_picker_color.png
new file mode 100644 (file)
index 0000000..4cc5d65
Binary files /dev/null and b/data/themes/elm/images/color_picker_color.png differ
diff --git a/data/themes/elm/images/color_picker_opacity.png b/data/themes/elm/images/color_picker_opacity.png
new file mode 100644 (file)
index 0000000..82ca1fa
Binary files /dev/null and b/data/themes/elm/images/color_picker_opacity.png differ
diff --git a/data/themes/elm/images/colorbar_btn_l_mv.png b/data/themes/elm/images/colorbar_btn_l_mv.png
new file mode 100644 (file)
index 0000000..00d58e0
Binary files /dev/null and b/data/themes/elm/images/colorbar_btn_l_mv.png differ
diff --git a/data/themes/elm/images/colorbar_btn_l_nor.png b/data/themes/elm/images/colorbar_btn_l_nor.png
new file mode 100644 (file)
index 0000000..0710be7
Binary files /dev/null and b/data/themes/elm/images/colorbar_btn_l_nor.png differ
diff --git a/data/themes/elm/images/colorbar_btn_l_sel.png b/data/themes/elm/images/colorbar_btn_l_sel.png
new file mode 100644 (file)
index 0000000..f976113
Binary files /dev/null and b/data/themes/elm/images/colorbar_btn_l_sel.png differ
diff --git a/data/themes/elm/images/colorbar_btn_r_mv.png b/data/themes/elm/images/colorbar_btn_r_mv.png
new file mode 100644 (file)
index 0000000..560befb
Binary files /dev/null and b/data/themes/elm/images/colorbar_btn_r_mv.png differ
diff --git a/data/themes/elm/images/colorbar_btn_r_nor.png b/data/themes/elm/images/colorbar_btn_r_nor.png
new file mode 100644 (file)
index 0000000..117af1e
Binary files /dev/null and b/data/themes/elm/images/colorbar_btn_r_nor.png differ
diff --git a/data/themes/elm/images/colorbar_btn_r_sel.png b/data/themes/elm/images/colorbar_btn_r_sel.png
new file mode 100644 (file)
index 0000000..6c8e7b6
Binary files /dev/null and b/data/themes/elm/images/colorbar_btn_r_sel.png differ
diff --git a/data/themes/elm/images/dot_pattern.png b/data/themes/elm/images/dot_pattern.png
new file mode 100644 (file)
index 0000000..391f2ea
Binary files /dev/null and b/data/themes/elm/images/dot_pattern.png differ
diff --git a/data/themes/elm/images/dropdown_arrow.png b/data/themes/elm/images/dropdown_arrow.png
new file mode 100644 (file)
index 0000000..aa08025
Binary files /dev/null and b/data/themes/elm/images/dropdown_arrow.png differ
diff --git a/data/themes/elm/images/inset_shadow.png b/data/themes/elm/images/inset_shadow.png
new file mode 100644 (file)
index 0000000..dad255c
Binary files /dev/null and b/data/themes/elm/images/inset_shadow.png differ
diff --git a/data/themes/elm/images/ring_shadow.png b/data/themes/elm/images/ring_shadow.png
new file mode 100644 (file)
index 0000000..b0cd5ca
Binary files /dev/null and b/data/themes/elm/images/ring_shadow.png differ
diff --git a/data/themes/elm/images/ring_white_blue_glow.png b/data/themes/elm/images/ring_white_blue_glow.png
new file mode 100644 (file)
index 0000000..7349744
Binary files /dev/null and b/data/themes/elm/images/ring_white_blue_glow.png differ
diff --git a/data/themes/elm/images/ring_white_middle.png b/data/themes/elm/images/ring_white_middle.png
new file mode 100644 (file)
index 0000000..7349744
Binary files /dev/null and b/data/themes/elm/images/ring_white_middle.png differ
diff --git a/data/themes/elm/images/scroll.png b/data/themes/elm/images/scroll.png
new file mode 100644 (file)
index 0000000..05a8be3
Binary files /dev/null and b/data/themes/elm/images/scroll.png differ
diff --git a/data/themes/elm/images/scroll_bg.png b/data/themes/elm/images/scroll_bg.png
new file mode 100644 (file)
index 0000000..e1eadf2
Binary files /dev/null and b/data/themes/elm/images/scroll_bg.png differ
diff --git a/data/themes/elm/images/scroll_bg_h.png b/data/themes/elm/images/scroll_bg_h.png
new file mode 100644 (file)
index 0000000..1e7fe0a
Binary files /dev/null and b/data/themes/elm/images/scroll_bg_h.png differ
diff --git a/data/themes/elm/images/scroll_btn_down.png b/data/themes/elm/images/scroll_btn_down.png
new file mode 100644 (file)
index 0000000..050eee9
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_down.png differ
diff --git a/data/themes/elm/images/scroll_btn_down_disable.png b/data/themes/elm/images/scroll_btn_down_disable.png
new file mode 100644 (file)
index 0000000..d313d84
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_down_disable.png differ
diff --git a/data/themes/elm/images/scroll_btn_down_hover.png b/data/themes/elm/images/scroll_btn_down_hover.png
new file mode 100644 (file)
index 0000000..8c4318a
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_down_hover.png differ
diff --git a/data/themes/elm/images/scroll_btn_down_push.png b/data/themes/elm/images/scroll_btn_down_push.png
new file mode 100644 (file)
index 0000000..081eb9f
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_down_push.png differ
diff --git a/data/themes/elm/images/scroll_btn_left.png b/data/themes/elm/images/scroll_btn_left.png
new file mode 100644 (file)
index 0000000..3e2b1d1
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_left.png differ
diff --git a/data/themes/elm/images/scroll_btn_left_disable.png b/data/themes/elm/images/scroll_btn_left_disable.png
new file mode 100644 (file)
index 0000000..cab006b
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_left_disable.png differ
diff --git a/data/themes/elm/images/scroll_btn_left_hover.png b/data/themes/elm/images/scroll_btn_left_hover.png
new file mode 100644 (file)
index 0000000..fcfc2e3
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_left_hover.png differ
diff --git a/data/themes/elm/images/scroll_btn_left_push.png b/data/themes/elm/images/scroll_btn_left_push.png
new file mode 100644 (file)
index 0000000..83753a8
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_left_push.png differ
diff --git a/data/themes/elm/images/scroll_btn_right.png b/data/themes/elm/images/scroll_btn_right.png
new file mode 100644 (file)
index 0000000..a8db10a
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_right.png differ
diff --git a/data/themes/elm/images/scroll_btn_right_disable.png b/data/themes/elm/images/scroll_btn_right_disable.png
new file mode 100644 (file)
index 0000000..b63087c
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_right_disable.png differ
diff --git a/data/themes/elm/images/scroll_btn_right_hover.png b/data/themes/elm/images/scroll_btn_right_hover.png
new file mode 100644 (file)
index 0000000..a790dee
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_right_hover.png differ
diff --git a/data/themes/elm/images/scroll_btn_right_push.png b/data/themes/elm/images/scroll_btn_right_push.png
new file mode 100644 (file)
index 0000000..677379a
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_right_push.png differ
diff --git a/data/themes/elm/images/scroll_btn_up.png b/data/themes/elm/images/scroll_btn_up.png
new file mode 100644 (file)
index 0000000..e9a501e
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_up.png differ
diff --git a/data/themes/elm/images/scroll_btn_up_disable.png b/data/themes/elm/images/scroll_btn_up_disable.png
new file mode 100644 (file)
index 0000000..aee83fa
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_up_disable.png differ
diff --git a/data/themes/elm/images/scroll_btn_up_hover.png b/data/themes/elm/images/scroll_btn_up_hover.png
new file mode 100644 (file)
index 0000000..9ffbb78
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_up_hover.png differ
diff --git a/data/themes/elm/images/scroll_btn_up_push.png b/data/themes/elm/images/scroll_btn_up_push.png
new file mode 100644 (file)
index 0000000..624a6e7
Binary files /dev/null and b/data/themes/elm/images/scroll_btn_up_push.png differ
diff --git a/data/themes/elm/images/scroll_h.png b/data/themes/elm/images/scroll_h.png
new file mode 100644 (file)
index 0000000..87e13bb
Binary files /dev/null and b/data/themes/elm/images/scroll_h.png differ
diff --git a/data/themes/elm/images/scroll_h_hover.png b/data/themes/elm/images/scroll_h_hover.png
new file mode 100644 (file)
index 0000000..597e9fa
Binary files /dev/null and b/data/themes/elm/images/scroll_h_hover.png differ
diff --git a/data/themes/elm/images/scroll_h_push.png b/data/themes/elm/images/scroll_h_push.png
new file mode 100644 (file)
index 0000000..14ec77b
Binary files /dev/null and b/data/themes/elm/images/scroll_h_push.png differ
diff --git a/data/themes/elm/images/scroll_handle.png b/data/themes/elm/images/scroll_handle.png
new file mode 100644 (file)
index 0000000..e4a4889
Binary files /dev/null and b/data/themes/elm/images/scroll_handle.png differ
diff --git a/data/themes/elm/images/scroll_handle_h.png b/data/themes/elm/images/scroll_handle_h.png
new file mode 100644 (file)
index 0000000..ccd58e2
Binary files /dev/null and b/data/themes/elm/images/scroll_handle_h.png differ
diff --git a/data/themes/elm/images/scroll_hover.png b/data/themes/elm/images/scroll_hover.png
new file mode 100644 (file)
index 0000000..9676bc1
Binary files /dev/null and b/data/themes/elm/images/scroll_hover.png differ
diff --git a/data/themes/elm/images/scroll_push.png b/data/themes/elm/images/scroll_push.png
new file mode 100644 (file)
index 0000000..12ce4c0
Binary files /dev/null and b/data/themes/elm/images/scroll_push.png differ
diff --git a/data/themes/elm/images/slider_gauge.png b/data/themes/elm/images/slider_gauge.png
new file mode 100644 (file)
index 0000000..b4b80c5
Binary files /dev/null and b/data/themes/elm/images/slider_gauge.png differ
diff --git a/data/themes/elm/images/slider_gauge_handle.png b/data/themes/elm/images/slider_gauge_handle.png
new file mode 100644 (file)
index 0000000..cf4ed36
Binary files /dev/null and b/data/themes/elm/images/slider_gauge_handle.png differ
diff --git a/data/themes/elm/images/slider_gauge_handle_pop.png b/data/themes/elm/images/slider_gauge_handle_pop.png
new file mode 100644 (file)
index 0000000..62b37b0
Binary files /dev/null and b/data/themes/elm/images/slider_gauge_handle_pop.png differ
diff --git a/data/themes/elm/images/slider_gauge_over.png b/data/themes/elm/images/slider_gauge_over.png
new file mode 100644 (file)
index 0000000..b4b80c5
Binary files /dev/null and b/data/themes/elm/images/slider_gauge_over.png differ
diff --git a/data/themes/elm/images/slider_gauge_over_pop.png b/data/themes/elm/images/slider_gauge_over_pop.png
new file mode 100644 (file)
index 0000000..b9c7ef6
Binary files /dev/null and b/data/themes/elm/images/slider_gauge_over_pop.png differ
diff --git a/data/themes/elm/images/slider_gauge_pop.png b/data/themes/elm/images/slider_gauge_pop.png
new file mode 100644 (file)
index 0000000..e0e10e2
Binary files /dev/null and b/data/themes/elm/images/slider_gauge_pop.png differ
diff --git a/data/themes/elm/images/sym_left_dark_normal.png b/data/themes/elm/images/sym_left_dark_normal.png
new file mode 100644 (file)
index 0000000..0384af6
Binary files /dev/null and b/data/themes/elm/images/sym_left_dark_normal.png differ
diff --git a/data/themes/elm/images/sym_left_glow_normal.png b/data/themes/elm/images/sym_left_glow_normal.png
new file mode 100644 (file)
index 0000000..84ae03f
Binary files /dev/null and b/data/themes/elm/images/sym_left_glow_normal.png differ
diff --git a/data/themes/elm/images/sym_left_light_normal.png b/data/themes/elm/images/sym_left_light_normal.png
new file mode 100644 (file)
index 0000000..0384af6
Binary files /dev/null and b/data/themes/elm/images/sym_left_light_normal.png differ
diff --git a/data/themes/elm/images/sym_right_dark_normal.png b/data/themes/elm/images/sym_right_dark_normal.png
new file mode 100644 (file)
index 0000000..5cc15a5
Binary files /dev/null and b/data/themes/elm/images/sym_right_dark_normal.png differ
diff --git a/data/themes/elm/images/sym_right_glow_normal.png b/data/themes/elm/images/sym_right_glow_normal.png
new file mode 100644 (file)
index 0000000..ca5d86c
Binary files /dev/null and b/data/themes/elm/images/sym_right_glow_normal.png differ
diff --git a/data/themes/elm/images/sym_right_light_normal.png b/data/themes/elm/images/sym_right_light_normal.png
new file mode 100644 (file)
index 0000000..5cc15a5
Binary files /dev/null and b/data/themes/elm/images/sym_right_light_normal.png differ
diff --git a/data/themes/elm/images/text_input_box.png b/data/themes/elm/images/text_input_box.png
new file mode 100644 (file)
index 0000000..c6fb250
Binary files /dev/null and b/data/themes/elm/images/text_input_box.png differ
diff --git a/data/themes/elm/images/text_input_box_hover.png b/data/themes/elm/images/text_input_box_hover.png
new file mode 100644 (file)
index 0000000..c6fb250
Binary files /dev/null and b/data/themes/elm/images/text_input_box_hover.png differ
diff --git a/data/themes/elm/images/text_input_box_push.png b/data/themes/elm/images/text_input_box_push.png
new file mode 100644 (file)
index 0000000..c6fb250
Binary files /dev/null and b/data/themes/elm/images/text_input_box_push.png differ
diff --git a/data/themes/elm/images/text_input_box_selected.png b/data/themes/elm/images/text_input_box_selected.png
new file mode 100644 (file)
index 0000000..c6fb250
Binary files /dev/null and b/data/themes/elm/images/text_input_box_selected.png differ
diff --git a/data/themes/elm/images/toggle_off.png b/data/themes/elm/images/toggle_off.png
new file mode 100644 (file)
index 0000000..c1e3fc1
Binary files /dev/null and b/data/themes/elm/images/toggle_off.png differ
diff --git a/data/themes/elm/images/toggle_on.png b/data/themes/elm/images/toggle_on.png
new file mode 100644 (file)
index 0000000..71d9453
Binary files /dev/null and b/data/themes/elm/images/toggle_on.png differ
diff --git a/data/themes/elm/images/tooltip-base.png b/data/themes/elm/images/tooltip-base.png
new file mode 100644 (file)
index 0000000..07b8f64
Binary files /dev/null and b/data/themes/elm/images/tooltip-base.png differ
diff --git a/data/themes/elm/images/tooltip-corner-bottom-left-tip.png b/data/themes/elm/images/tooltip-corner-bottom-left-tip.png
new file mode 100644 (file)
index 0000000..9c99b73
Binary files /dev/null and b/data/themes/elm/images/tooltip-corner-bottom-left-tip.png differ
diff --git a/data/themes/elm/images/tooltip-corner-bottom-right-tip.png b/data/themes/elm/images/tooltip-corner-bottom-right-tip.png
new file mode 100644 (file)
index 0000000..08093cf
Binary files /dev/null and b/data/themes/elm/images/tooltip-corner-bottom-right-tip.png differ
diff --git a/data/themes/elm/images/tooltip-corner-top-left-tip.png b/data/themes/elm/images/tooltip-corner-top-left-tip.png
new file mode 100644 (file)
index 0000000..4469984
Binary files /dev/null and b/data/themes/elm/images/tooltip-corner-top-left-tip.png differ
diff --git a/data/themes/elm/images/tooltip-corner-top-right-tip.png b/data/themes/elm/images/tooltip-corner-top-right-tip.png
new file mode 100644 (file)
index 0000000..a0889ef
Binary files /dev/null and b/data/themes/elm/images/tooltip-corner-top-right-tip.png differ
diff --git a/data/themes/elm/images/tooltip-edge-bottom-tip.png b/data/themes/elm/images/tooltip-edge-bottom-tip.png
new file mode 100644 (file)
index 0000000..7061c9c
Binary files /dev/null and b/data/themes/elm/images/tooltip-edge-bottom-tip.png differ
diff --git a/data/themes/elm/images/tooltip-edge-left-tip.png b/data/themes/elm/images/tooltip-edge-left-tip.png
new file mode 100644 (file)
index 0000000..06343d5
Binary files /dev/null and b/data/themes/elm/images/tooltip-edge-left-tip.png differ
diff --git a/data/themes/elm/images/tooltip-edge-right-tip.png b/data/themes/elm/images/tooltip-edge-right-tip.png
new file mode 100644 (file)
index 0000000..c66dbcb
Binary files /dev/null and b/data/themes/elm/images/tooltip-edge-right-tip.png differ
diff --git a/data/themes/elm/images/tooltip-edge-top-tip.png b/data/themes/elm/images/tooltip-edge-top-tip.png
new file mode 100644 (file)
index 0000000..edd8fdb
Binary files /dev/null and b/data/themes/elm/images/tooltip-edge-top-tip.png differ
diff --git a/data/themes/elm/images/vert_bar_inset.png b/data/themes/elm/images/vert_bar_inset.png
new file mode 100644 (file)
index 0000000..1163fe2
Binary files /dev/null and b/data/themes/elm/images/vert_bar_inset.png differ
diff --git a/data/themes/elm/images/view_arrow_down_nor.png b/data/themes/elm/images/view_arrow_down_nor.png
new file mode 100644 (file)
index 0000000..ebe69ea
Binary files /dev/null and b/data/themes/elm/images/view_arrow_down_nor.png differ
diff --git a/data/themes/elm/images/view_arrow_down_sel.png b/data/themes/elm/images/view_arrow_down_sel.png
new file mode 100644 (file)
index 0000000..4aa9204
Binary files /dev/null and b/data/themes/elm/images/view_arrow_down_sel.png differ
diff --git a/data/themes/elm/images/view_arrow_right_nor.png b/data/themes/elm/images/view_arrow_right_nor.png
new file mode 100644 (file)
index 0000000..4dbe45d
Binary files /dev/null and b/data/themes/elm/images/view_arrow_right_nor.png differ
diff --git a/data/themes/elm/images/view_arrow_right_sel.png b/data/themes/elm/images/view_arrow_right_sel.png
new file mode 100644 (file)
index 0000000..2b41410
Binary files /dev/null and b/data/themes/elm/images/view_arrow_right_sel.png differ
diff --git a/data/themes/elm/images/white_bar_vert_glow.png b/data/themes/elm/images/white_bar_vert_glow.png
new file mode 100644 (file)
index 0000000..49c6735
Binary files /dev/null and b/data/themes/elm/images/white_bar_vert_glow.png differ
diff --git a/data/themes/elm/images/window_scale_controller_h.png b/data/themes/elm/images/window_scale_controller_h.png
new file mode 100644 (file)
index 0000000..313f4d8
Binary files /dev/null and b/data/themes/elm/images/window_scale_controller_h.png differ
diff --git a/data/themes/elm/images/window_scale_controller_h_hover.png b/data/themes/elm/images/window_scale_controller_h_hover.png
new file mode 100644 (file)
index 0000000..ab35cfc
Binary files /dev/null and b/data/themes/elm/images/window_scale_controller_h_hover.png differ
diff --git a/data/themes/elm/images/window_scale_controller_h_push.png b/data/themes/elm/images/window_scale_controller_h_push.png
new file mode 100644 (file)
index 0000000..223e870
Binary files /dev/null and b/data/themes/elm/images/window_scale_controller_h_push.png differ
diff --git a/data/themes/elm/images/window_scale_controller_left.png b/data/themes/elm/images/window_scale_controller_left.png
new file mode 100644 (file)
index 0000000..49f6bf3
Binary files /dev/null and b/data/themes/elm/images/window_scale_controller_left.png differ
diff --git a/data/themes/elm/images/window_scale_controller_left_hover.png b/data/themes/elm/images/window_scale_controller_left_hover.png
new file mode 100644 (file)
index 0000000..4b71f4a
Binary files /dev/null and b/data/themes/elm/images/window_scale_controller_left_hover.png differ
diff --git a/data/themes/elm/images/window_scale_controller_left_push.png b/data/themes/elm/images/window_scale_controller_left_push.png
new file mode 100644 (file)
index 0000000..c306194
Binary files /dev/null and b/data/themes/elm/images/window_scale_controller_left_push.png differ
diff --git a/data/themes/elm/images/window_scale_controller_right.png b/data/themes/elm/images/window_scale_controller_right.png
new file mode 100644 (file)
index 0000000..17d52e9
Binary files /dev/null and b/data/themes/elm/images/window_scale_controller_right.png differ
diff --git a/data/themes/elm/images/window_scale_controller_right_hover.png b/data/themes/elm/images/window_scale_controller_right_hover.png
new file mode 100644 (file)
index 0000000..a244913
Binary files /dev/null and b/data/themes/elm/images/window_scale_controller_right_hover.png differ
diff --git a/data/themes/elm/images/window_scale_controller_right_push.png b/data/themes/elm/images/window_scale_controller_right_push.png
new file mode 100644 (file)
index 0000000..e51542e
Binary files /dev/null and b/data/themes/elm/images/window_scale_controller_right_push.png differ
diff --git a/data/themes/elm/label.edc b/data/themes/elm/label.edc
new file mode 100644 (file)
index 0000000..c4bdf82
--- /dev/null
@@ -0,0 +1,27 @@
+group { name: "elm/label/base/default";
+   styles {
+      style { name: "label_style";
+         base: "font="FN" font_size=10 text_class=tb_plain align=center color=#ffffffff style=shadow,bottom shadow_color=#00000080";
+         tag: "br" "\n";
+         tag: "b" "+ font="FNBD" text_class=tb_light";
+      }
+   }
+   parts {
+      part { name: "label.text.clip"; type: RECT;
+         description { state: "default" 0.0;
+         }
+      }
+      part { name: "elm.text"; type: TEXTBLOCK;
+         clip_to: "label.text.clip";
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.relative: 0.0 0.0;
+            rel2.relative: 1.0 1.0;
+            text {
+               style: "label_style";
+               min: 0 1;
+            }
+         }
+      }
+   }
+}
diff --git a/data/themes/elm/list.edc b/data/themes/elm/list.edc
new file mode 100644 (file)
index 0000000..51a6ffc
--- /dev/null
@@ -0,0 +1,179 @@
+group { name: "elm/list/item/default";
+   script {
+      public item_selected = 0;
+   }
+   data.item: "stacking" "above";
+   parts {
+      part { name: "base";
+         type: SPACER;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 0 22;
+         }
+      }
+      part { name: "bg";
+         type: RECT;
+         scale: 1;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: 255 255 255 255;
+         }
+         description { state: "selected" 0.0;
+            color: 0 138 238 255;
+         }
+         description { state: "hovered" 0.0;
+            color: 205 233 255 255;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         scale: 1;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: COL_NM;
+            rel1.offset: 8 0;
+            rel2.offset: -9 -1;
+            text {
+               font: FN;
+               size: 13;
+               min: 1 1;
+               align: 0.0 0.5;
+               text_class: "list_item";
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "event";
+         type: RECT;
+         scale: 1;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program { name: "go_active";
+         signal: "elm,state,selected";
+         source: "elm";
+         script {
+            set_int(item_selected, 1);
+            set_state(PART:"bg", "selected", 0.0);
+         }
+      }
+      program { name: "go_passive";
+         signal: "elm,state,unselected";
+         source: "elm";
+         script {
+            set_int(item_selected, 0);
+            set_state(PART:"bg", "default", 0.0);
+         }
+      }
+      program { name: "item_mouse_in";
+         signal: "mouse,in";
+         source: "event";
+         script {
+            if (!get_int(item_selected))
+              set_state(PART:"bg", "hovered", 0.0);
+         }
+      }
+      program { name: "item_mouse_out";
+         signal: "mouse,out";
+         source: "event";
+         script {
+            if (!get_int(item_selected))
+              set_state(PART:"bg", "default", 0.0);
+         }
+      }
+   }
+}
+
+group { name: "elm/list/item_odd/default";
+   script {
+      public item_selected = 0;
+   }
+   data.item: "stacking" "below";
+   parts {
+      part { name: "base";
+         type: SPACER;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 0 22;
+         }
+      }
+      part { name: "bg";
+         type: RECT;
+         scale: 1;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: 255 255 255 255;
+         }
+         description { state: "selected" 0.0;
+            color: 0 138 238 255;
+         }
+         description { state: "hovered" 0.0;
+            color: 205 233 255 255;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         scale: 1;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: COL_NM;
+            rel1.offset: 8 0;
+            rel2.offset: -9 -1;
+            text {
+               font: FN;
+               size: 13;
+               min: 1 1;
+               align: 0.0 0.5;
+               text_class: "list_item";
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "event";
+         type: RECT;
+         scale: 1;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program { name: "go_active";
+         signal: "elm,state,selected";
+         source: "elm";
+         script {
+            set_int(item_selected, 1);
+            set_state(PART:"bg", "selected", 0.0);
+         }
+      }
+      program { name: "go_passive";
+         signal: "elm,state,unselected";
+         source: "elm";
+         script {
+            set_int(item_selected, 0);
+            set_state(PART:"bg", "default", 0.0);
+         }
+      }
+      program { name: "item_mouse_in";
+         signal: "mouse,in";
+         source: "event";
+         script {
+            if (!get_int(item_selected))
+              set_state(PART:"bg", "hovered", 0.0);
+         }
+      }
+      program { name: "item_mouse_out";
+         signal: "mouse,out";
+         source: "event";
+         script {
+            if (!get_int(item_selected))
+              set_state(PART:"bg", "default", 0.0);
+         }
+      }
+   }
+}
diff --git a/data/themes/elm/menu.edc b/data/themes/elm/menu.edc
new file mode 100644 (file)
index 0000000..d14831a
--- /dev/null
@@ -0,0 +1,199 @@
+group { name: "elm/menu/item/default";
+   script {
+      public menu_text_visible; //0:hide (default), 1:visible
+      public menu_disable; //0:enable, 1:disable
+      public odd_item = 0; //Odd item status
+   }
+   parts {
+      part { name: "bg";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            min: 114 30;
+            color: 255 255 255 255;
+         }
+         description { state: "default_odd" 0.0;
+            inherit: "default" 0.0;
+            color: 242 242 242 255;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            color: 31 158 177 255;
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            color: 170 244 255 255;
+         }
+      }
+      part { name: "icon_padding_left";
+         type: SPACER;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            rel1.relative: 0.0 0.0;
+            rel2.relative: 0.0 1.0;
+            min: 6 0;
+            align: 0 0.5;
+            fixed: 1 0;
+         }
+      }
+      part { name: "elm.swallow.content";
+         type: SWALLOW;
+         clip_to: "disclip";
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "icon_padding_left";
+            rel2.to: "icon_padding_left";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            min: 18 18;
+            max: 18 18;
+            fixed: 1 1;
+            align: 0 0.5;
+            aspect: 1.0 1.0;
+         }
+      }
+      part { name: "text_padding_left";
+         type: SPACER;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 1.0;
+            min: 8 0;
+            align: 0 0.5;
+            fixed: 1 0;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         clip_to: "disclip";
+         scale: 1;
+         description { state: "default" 0.0;
+            align: 0.0 0.5;
+            rel1 { relative: 1.0 0.0; to_x: "text_padding_left"; }
+            color: COL_NM;
+            text {
+               font: FN;
+               size: 11;
+               align: 0.0 0.5;
+               min: 0 0;
+            }
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+         }
+      }
+      part { name: "over1";
+         type: RECT;
+         mouse_events: 1;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 255 255 255 0;
+         }
+      }
+      part { name: "over2";
+         type: RECT;
+         mouse_events: 1;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 255 255 255 0;
+         }
+      }
+      part { name: "disclip";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 255 255 255 255;
+         }
+         description { state: "enabled" 0.0;
+            color: 127 127 127 127;
+         }
+      }
+      part { name: "blocker";
+         type: RECT;
+         description { state: "default" 0.0;
+            visible: 0;
+         }
+         description { state: "enabled" 0.0;
+            visible: 1;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program {
+         name: "item_unclick";
+         signal: "mouse,clicked,1";
+         source: "over1";
+         action: SIGNAL_EMIT "elm,action,click" "";
+      }
+      program { name: "disable";
+         signal: "elm,state,disabled";
+         source: "elm";
+         action: STATE_SET "enabled" 0.0;
+         target: "disclip";
+         target: "blocker";
+      }
+      program { name: "enable";
+         signal: "elm,state,enabled";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "disclip";
+         target: "blocker";
+      }
+      program { name: "item_click2";
+         signal: "mouse,down,1";
+         source: "over2";
+         script {
+            set_state(PART:"elm.text", "clicked", 0.0);
+            set_state(PART:"bg", "clicked", 0.0);
+         }
+      }
+      program { name: "item_unclick2";
+         signal: "mouse,up,1";
+         source: "over2";
+         script {
+            set_state(PART:"elm.text", "default", 0.0);
+            if (get_int(odd_item))
+               set_state(PART:"bg", "default_odd", 0.0);
+            else
+               set_state(PART:"bg", "default", 0.0);
+         }
+      }
+      program { name: "item_mouse_in";
+         signal: "mouse,in";
+         source: "over2";
+         action: STATE_SET "hovered" 0.0;
+         target: "bg";
+      }
+      program { name: "item_mouse_out";
+         signal: "mouse,out";
+         source: "over2";
+         script {
+            if (get_int(odd_item))
+               set_state(PART:"bg", "default_odd", 0.0);
+            else
+               set_state(PART:"bg", "default", 0.0);
+         }
+      }
+      program { name: "odd_item_set";
+         signal: "elm,state,odd,item,set";
+         source: "";
+         script {
+            set_int(odd_item, 1);
+            set_state(PART:"bg", "default_odd", 0.0);
+         }
+      }
+      program { name: "odd_item_unset";
+         signal: "elm,state,odd,item,unset";
+         source: "";
+         script {
+            set_int(odd_item, 0);
+            set_state(PART:"bg", "default", 0.0);
+         }
+      }
+   }
+}
diff --git a/data/themes/elm/panes.edc b/data/themes/elm/panes.edc
new file mode 100644 (file)
index 0000000..fe5196c
--- /dev/null
@@ -0,0 +1,214 @@
+group { name: "elm/panes/horizontal/default";
+   alias: "elm/panes/horizontal/flush";
+   images {
+      image: "window_scale_controller_h.png" COMP;
+      image: "window_scale_controller_h_push.png" COMP;
+      image: "window_scale_controller_h_hover.png" COMP;
+      image: "window_scale_controller_left.png" COMP;
+      image: "window_scale_controller_left_push.png" COMP;
+      image: "window_scale_controller_left_hover.png" COMP;
+      image: "window_scale_controller_right.png" COMP;
+      image: "window_scale_controller_right_push.png" COMP;
+      image: "window_scale_controller_right_hover.png" COMP;
+   }
+   parts {
+      part { name: "whole";
+         type: RECT;
+         description { state: "default" 0.0;
+            color: 255 255 255 255;
+//            color: 0 0 0 0;
+         }
+      }
+      part { name: "whole_left";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel2.to_y: "elm.bar";
+            rel2.relative: 1.0 0.0;
+            color: 255 255 255 255;
+         }
+      }
+      part { name: "elm.swallow.left";
+         type: SWALLOW;
+         clip_to: "whole_left";
+         description { state: "default" 0.0;
+            rel1.to: "whole_left";
+            rel2.to: "whole_left";
+         }
+      }
+      part { name: "whole_right";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to_y: "elm.bar";
+            rel1.relative: 0.0 1.0;
+            color: 255 255 255 255;
+         }
+      }
+      part { name: "elm.swallow.right";
+         type: SWALLOW;
+         clip_to: "whole_right";
+         description { state: "default" 0.0;
+            rel1.to: "whole_right";
+            rel2.to: "whole_right";
+            fixed: 1 1;
+         }
+      }
+      part { name: "bar_left";
+         description { state: "default" 0.0;
+            max: 9999 13;
+            min: 2 13;
+            fixed: 1 1;
+            rel1.to_y: "elm.bar";
+            rel2 { to_x: "bar_middle"; to_y: "elm.bar"; }
+            rel2.relative: 0.0 1.0;
+            align: 0 0.5;
+            image {
+               normal: "window_scale_controller_left.png";
+               border: 1 0 0 0;
+            }
+            fill.smooth: 0;
+         }
+         description { state: "pressed" 0.0;
+            inherit: "default" 0.0;
+//            image.normal: "window_scale_controller_left_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit:  "default" 0.0;
+//            image.normal: "window_scale_controller_left_hover.png";
+         }
+      }
+      part { name: "bar_middle";
+         description { state: "default" 0.0;
+            max: 15 13;
+            min: 15 13;
+            fixed: 1 1;
+            rel1.to: "elm.bar";
+            rel2.to: "elm.bar";
+            rel1.relative: 0.5 0.0;
+            rel2.relative: 0.5 1.0;
+            image {
+               normal: "window_scale_controller_h.png";
+            }
+         }
+         description { state: "pressed" 0.0;
+            inherit: "default" 0.0;
+//            image.normal: "window_scale_controller_h_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit:  "default" 0.0;
+//            image.normal: "window_scale_controller_h_hover.png";
+         }
+      }
+      part { name: "bar_right";
+         description { state: "default" 0.0;
+            max: 9999 13;
+            min: 2 13;
+            fixed: 1 1;
+            rel1 { to_x: "bar_middle"; to_y: "elm.bar"; }
+            rel2.to_y: "elm.bar";
+            rel1.relative: 1.0 0.0;
+            align: 1 0.5;
+            image {
+               normal: "window_scale_controller_right.png";
+               border: 0 1 0 0;
+            }
+            fill.smooth: 0;
+         }
+         description { state: "pressed" 0.0;
+            inherit: "default" 0.0;
+//            image.normal: "window_scale_controller_right_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit:  "default" 0.0;
+//            image.normal: "window_scale_controller_right_hover.png";
+         }
+      }
+      part { name: "elm.bar";
+         type: SPACER;
+         dragable {
+            confine: "whole";
+            x: 0 0 0;
+            y: 1 1 1;
+         }
+         description { state: "default" 0.0;
+            max: 9999 13;
+            min: 19 13;
+            fixed: 1 1;
+            rel1.relative: 0.5 0.0;
+            rel2.relative: 0.5 1.0;
+         }
+      }
+      part { name: "bar";
+         type: RECT;
+         dragable.events: "elm.bar";
+         mouse_events: 1;
+         ignore_flags: ON_HOLD;
+         description { state: "default" 0.0;
+            rel1.to_y: "elm.bar";
+            rel2.to_y: "elm.bar";
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program {
+         name:   "bar_pressed";
+         signal: "mouse,down,1";
+         source: "bar";
+         action: SIGNAL_EMIT "elm,action,press" "";
+         after: "bar_pressed_anim";
+      }
+      program {
+         name:   "bar_pressed_anim";
+         action: STATE_SET "pressed" 0.0;
+         target: "bar_left";
+         target: "bar_middle";
+         target: "bar_right";
+      }
+      program {
+         name:   "bar_unpressed";
+         signal: "mouse,up,1";
+         source: "bar";
+         action: SIGNAL_EMIT "elm,action,unpress" "";
+         after: "bar_unpressed_anim";
+      }
+      program {
+         name:   "bar_unpressed_anim";
+         action: STATE_SET "default" 0.0;
+         target: "bar_left";
+         target: "bar_middle";
+         target: "bar_right";
+      }
+      program {
+         name:   "bar_mouse_in";
+         signal: "mouse,in";
+         source: "bar";
+         action: STATE_SET "hovered" 0.0;
+         target: "bar_left";
+         target: "bar_middle";
+         target: "bar_right";
+      }
+      program {
+         name:   "bar_mouse_out";
+         signal: "mouse,out";
+         source: "bar";
+         action: STATE_SET "default" 0.0;
+         target: "bar_left";
+         target: "bar_middle";
+         target: "bar_right";
+      }
+      program {
+         name:   "bar_clicked";
+         signal: "mouse,clicked,1";
+         source: "bar";
+         action: SIGNAL_EMIT "elm,action,click" "";
+      }
+      program {
+         name:   "bar_double_clicked";
+         signal: "mouse,down,1,double";
+         source: "bar";
+         action: SIGNAL_EMIT "elm,action,click,double" "";
+      }
+   }
+}
diff --git a/data/themes/elm/scroller.edc b/data/themes/elm/scroller.edc
new file mode 100644 (file)
index 0000000..a84a205
--- /dev/null
@@ -0,0 +1,1470 @@
+#define FIXED_SIZE(_WIDTH, _HEIGHT) \
+   min: _WIDTH _HEIGHT; max: _WIDTH _HEIGHT; fixed: 1 1;
+
+group { name: "elm/scroller/base/default";
+   alias: "elm/list/base/default";
+   alias: "elm/scroller/base/list_effect";
+   images {
+      image: "scroll.png" COMP;
+      image: "scroll_push.png" COMP;
+      image: "scroll_hover.png" COMP;
+      image: "scroll_h.png" COMP;
+      image: "scroll_h_push.png" COMP;
+      image: "scroll_h_hover.png" COMP;
+      image: "scroll_bg.png" COMP;
+      image: "scroll_bg_h.png" COMP;
+      image: "scroll_handle.png" COMP;
+      image: "scroll_handle_h.png" COMP;
+      image: "scroll_btn_up.png" COMP;
+      image: "scroll_btn_up_push.png" COMP;
+      image: "scroll_btn_up_hover.png" COMP;
+      image: "scroll_btn_up_disable.png" COMP;
+      image: "scroll_btn_down.png" COMP;
+      image: "scroll_btn_down_push.png" COMP;
+      image: "scroll_btn_down_hover.png" COMP;
+      image: "scroll_btn_down_disable.png" COMP;
+      image: "scroll_btn_left.png" COMP;
+      image: "scroll_btn_left_push.png" COMP;
+      image: "scroll_btn_left_hover.png" COMP;
+      image: "scroll_btn_left_disable.png" COMP;
+      image: "scroll_btn_right.png" COMP;
+      image: "scroll_btn_right_push.png" COMP;
+      image: "scroll_btn_right_hover.png" COMP;
+      image: "scroll_btn_right_disable.png" COMP;
+   }
+
+   data.item: "focus_highlight" "on";
+
+   parts {
+      program {
+         signal: "load"; source: "";
+         script {
+            emit("reload", "elm");
+         }
+      }
+      part { name: "base"; type: RECT;
+         description { state: "default" 0.0;
+            color: 255 255 255 255;
+         }
+      }
+      part { name: "elm.swallow.bg"; type: SWALLOW;
+         description { state: "default" 0.0;
+         }
+      }
+// vert bar ////////////////////////////////////////////////////////////////
+      part { name: "sb_vbar_show"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "sb_vbar"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 13 13;
+            align: 1.0 0.5;
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 0.0;
+            rel2.to_y: "sb_hbar";
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            min: 0 0;
+            max: 0 99999;
+         }
+      }
+      part { name: "sb_vbar_base";
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.relative: 0.0 1.0;
+            rel1.to: "sb_vbar_a1";
+            rel2.relative: 1.0 0.0;
+            rel2.to: "sb_vbar_a2";
+            image.normal: "scroll_bg.png";
+         }
+      }
+      part { name: "sb_vbar_p1"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            color: 0 0 0 0;
+            rel1.relative: 0.0 1.0;
+            rel1.to: "sb_vbar_a1";
+            rel2.relative: 1.0 0.0;
+            rel2.to: "elm.dragable.vbar";
+         }
+      }
+      part { name: "sb_vbar_p2"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            color: 0 0 0 0;
+            rel1.relative: 0.0 1.0;
+            rel1.to: "elm.dragable.vbar";
+            rel2.relative: 1.0 0.0;
+            rel2.to: "sb_vbar_a2";
+         }
+      }
+      part { name: "elm.dragable.vbar"; type: RECT;
+         clip_to: "sb_vbar";
+         scale: 1;
+         dragable.x: 0 0 0;
+         dragable.y: 1 1 0;
+         dragable.confine: "sb_vbar_base";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 13 13;
+            rel1.relative: 0.5  0.5;
+            rel1.to: "sb_vbar_base";
+            rel2.relative: 0.5  0.5;
+            rel2.to: "sb_vbar_base";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "sb_vbar_a1"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 0 0;
+            max: 13 13;
+            align: 1.0 0.0;
+            aspect: 1.0 1.0; aspect_preference: HORIZONTAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_vbar";
+            rel1.relative: 0.0 0.0;
+            rel2.to: "sb_vbar";
+            rel2.relative: 1.0 0.0;
+         }
+      }
+      part { name: "sb_vbar_a2"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 0 0;
+            max: 13 13;
+            align: 1.0 1.0;
+            aspect: 1.0 1.0; aspect_preference: HORIZONTAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_vbar";
+            rel1.relative: 0.0 1.0;
+            rel2.to: "sb_vbar";
+            rel2.relative: 1.0 1.0;
+         }
+      }
+      program {
+         signal: "elm,action,show,vbar"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "sb_vbar";
+         target: "sb_vbar_show";
+      }
+      program {
+         signal: "elm,action,hide,vbar"; source: "elm";
+         action: STATE_SET "hidden" 0.0;
+         target: "sb_vbar";
+         target: "sb_vbar_show";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a1";
+         action: STATE_SET "clicked" 0.0;
+         target: "arrow1_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a1";
+         action: DRAG_VAL_STEP 0.0 -1.0;
+         target: "elm.dragable.vbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_vbar_a1";
+         action: STATE_SET "default" 0.0;
+         target: "arrow1_vbar";
+      }
+      program {
+         signal: "mouse,in"; source: "sb_vbar_a1";
+         action: STATE_SET "hovered" 0.0;
+         target: "arrow1_vbar";
+      }
+      program {
+         signal: "mouse,out"; source: "sb_vbar_a1";
+         action: STATE_SET "default" 0.0;
+         target: "arrow1_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a2";
+         action: STATE_SET "clicked" 0.0;
+         target: "arrow2_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a2";
+         action: DRAG_VAL_STEP 0.0 1.0;
+         target: "elm.dragable.vbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_vbar_a2";
+         action: STATE_SET "default" 0.0;
+         target: "arrow2_vbar";
+      }
+      program {
+         signal: "mouse,in"; source: "sb_vbar_a2";
+         action: STATE_SET "hovered" 0.0;
+         target: "arrow2_vbar";
+      }
+      program {
+         signal: "mouse,out"; source: "sb_vbar_a2";
+         action: STATE_SET "default" 0.0;
+         target: "arrow2_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_p1";
+         action: DRAG_VAL_PAGE 0.0 -1.0;
+         target: "elm.dragable.vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_p2";
+         action: DRAG_VAL_PAGE  0.0 1.0;
+         target: "elm.dragable.vbar";
+      }
+
+// horiz bar /////////////////////////////////////////////////////////////
+      part { name: "sb_hbar_show"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "sb_hbar"; type: RECT; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 13 13;
+            align: 0.5 1.0;
+            rel1.relative: 0.0 1.0;
+            rel2.relative: 0.0 1.0;
+            rel2.to_x: "sb_vbar";
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            min: 0 0;
+            max: 99999 0;
+         }
+      }
+      part { name: "sb_hbar_base";
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "sb_hbar_a1";
+            rel2.relative: 0.0 1.0;
+            rel2.to: "sb_hbar_a2";
+            image.normal: "scroll_bg_h.png";
+         }
+      }
+      part { name: "sb_hbar_p1"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "sb_hbar_a1";
+            rel2.relative: 0.0 1.0;
+            rel2.to: "elm.dragable.hbar";
+         }
+      }
+      part { name: "sb_hbar_p2"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "elm.dragable.hbar";
+            rel2.relative: 0.0 1.0;
+            rel2.to: "sb_hbar_a2";
+         }
+      }
+      part { name: "elm.dragable.hbar"; type: RECT;
+         clip_to: "sb_hbar";
+         scale: 1;
+         dragable.x: 1 1 0;
+         dragable.y: 0 0 0;
+         dragable.confine: "sb_hbar_base";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 13 13;
+            rel1.relative: 0.5  0.5;
+            rel1.to: "sb_hbar_base";
+            rel2.relative: 0.5  0.5;
+            rel2.to: "sb_hbar_base";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "sb_hbar_a1"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 13 13;
+            align: 0.0 1.0;
+            aspect: 1.0 1.0; aspect_preference: VERTICAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_hbar";
+            rel1.relative: 0.0 1.0;
+            rel2.to: "sb_hbar";
+            rel2.relative: 0.0 1.0;
+         }
+      }
+      part { name: "sb_hbar_a2"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 13 13;
+            align: 1.0 1.0;
+            aspect: 1.0 1.0; aspect_preference: VERTICAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_hbar";
+            rel1.relative: 1.0 1.0;
+            rel2.to: "sb_hbar";
+            rel1.relative: 1.0 1.0;
+         }
+      }
+      program {
+         signal: "elm,action,show,hbar"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "sb_hbar";
+         target: "sb_hbar_show";
+      }
+      program {
+         signal: "elm,action,hide,hbar"; source: "elm";
+         action: STATE_SET "hidden" 0.0;
+         target: "sb_hbar";
+         target: "sb_hbar_show";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a1";
+         action: STATE_SET "clicked" 0.0;
+         target: "arrow1_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a1";
+         action: DRAG_VAL_STEP -1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_hbar_a1";
+         action: STATE_SET "default" 0.0;
+         target: "arrow1_hbar";
+      }
+      program {
+         signal: "mouse,in"; source: "sb_hbar_a1";
+         action: STATE_SET "hovered" 0.0;
+         target: "arrow1_hbar";
+      }
+      program {
+         signal: "mouse,out"; source: "sb_hbar_a1";
+         action: STATE_SET "default" 0.0;
+         target: "arrow1_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a2";
+         action: STATE_SET "clicked" 0.0;
+         target: "arrow2_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a2";
+         action: DRAG_VAL_STEP 1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_hbar_a2";
+         action: STATE_SET "default" 0.0;
+         target: "arrow2_hbar";
+      }
+      program {
+         signal: "mouse,in"; source: "sb_hbar_a2";
+         action: STATE_SET "hovered" 0.0;
+         target: "arrow2_hbar";
+      }
+      program {
+         signal: "mouse,out"; source: "sb_hbar_a2";
+         action: STATE_SET "default" 0.0;
+         target: "arrow2_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_p1";
+         action: DRAG_VAL_PAGE -1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_p2";
+         action: DRAG_VAL_PAGE  1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+
+      part { name: "bg"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.background";
+            rel2.to: "elm.swallow.background";
+            color: 0 0 0 0;
+            color_class: "scrollframe_base";
+         }
+      }
+      part { name: "clipper"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.background";
+            rel2.to: "elm.swallow.background";
+         }
+      }
+      part { name: "elm.swallow.background"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            //rel1.offset: 1 1;
+            rel2.relative: 0.0 0.0;
+            //rel2.offset: -2 -2;
+            rel2.to_x: "sb_vbar";
+            rel2.to_y: "sb_hbar";
+         }
+      }
+      part { name: "elm.swallow.content"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            //rel1.offset: 1 1;
+            rel2.relative: 0.0 0.0;
+            //rel2.offset: -2 -2;
+            rel2.to_x: "sb_vbar";
+            rel2.to_y: "sb_hbar";
+         }
+      }
+      part { name: "elm.swallow.overlay"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+         }
+      }
+      part { name: "arrow1_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_vbar_a1";
+            rel2.to: "sb_vbar_a1";
+            image.normal: "scroll_btn_up.png";
+            min: 0 0;
+            max: 13 13;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_up_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_up_hover.png";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_up_disable.png";
+         }
+      }
+      part { name: "arrow2_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_vbar_a2";
+            rel2.to: "sb_vbar_a2";
+            image.normal: "scroll_btn_down.png";
+            min: 0 0;
+            max: 13 13;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_down_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_down_hover.png";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_down_disable.png";
+         }
+      }
+      part { name: "base_vbar"; repeat_events: 1;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to: "elm.dragable.vbar";
+            rel2.to: "elm.dragable.vbar";
+            image.normal: "scroll.png";
+            image.border: 0 0 2 2;
+            fill.smooth: 0;
+            min: 16 13;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_hover.png";
+         }
+      }
+      part { name: "center_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "base_vbar";
+            rel2.to: "base_vbar";
+            image.normal: "scroll_handle.png";
+            FIXED_SIZE(13, 8)
+         }
+      }
+      part { name: "arrow1_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_hbar_a1";
+            rel2.to: "sb_hbar_a1";
+            image.normal: "scroll_btn_left.png";
+            FIXED_SIZE(13, 13)
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_left_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_left_hover.png";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_left_disable.png";
+         }
+      }
+      part { name: "arrow2_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_hbar_a2";
+            rel2.to: "sb_hbar_a2";
+            image.normal: "scroll_btn_right.png";
+            FIXED_SIZE(13, 13)
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_right_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_right_hover.png";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_right_disable.png";
+         }
+      }
+      part { name: "base_hbar"; repeat_events: 1;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to: "elm.dragable.hbar";
+            rel2.to: "elm.dragable.hbar";
+            image.normal: "scroll_h.png";
+            image.border: 2 2 0 0;
+            fill.smooth: 0;
+            min: 13 16;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_h_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_h_hover.png";
+         }
+      }
+      part { name: "center_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "base_hbar";
+            rel2.to: "base_hbar";
+            image.normal: "scroll_handle_h.png";
+            FIXED_SIZE(8, 13)
+         }
+      }
+      part { name: "frame_l"; type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel2.to_y: "sb_hbar";
+            rel2.relative: 0 0;
+            align: 0 0.5;
+            min: 1 0;
+            fixed: 1 0;
+            color: 134 144 151 255;
+         }
+      }
+      part { name: "frame_r"; type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to_x: "sb_vbar";
+            rel2.to_x: "sb_vbar";
+            rel2.to_y: "sb_hbar";
+            rel2.relative: 0 0;
+            align: 1 0.5;
+            min: 1 0;
+            fixed: 1 0;
+            color: 134 144 151 255;
+         }
+      }
+      part { name: "frame_t"; type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel2.to_x: "sb_vbar";
+            rel2.relative: 0 0;
+            align: 0.5 0;
+            min: 0 1;
+            fixed: 0 1;
+            color: 134 144 151 255;
+         }
+      }
+      part { name: "frame_b"; type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to_y: "sb_hbar";
+            rel2.to_x: "sb_vbar";
+            rel2.to_y: "sb_hbar";
+            rel2.relative: 0 0;
+            align: 0.5 1;
+            min: 0 1;
+            fixed: 0 1;
+            color: 134 144 151 255;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "mouse,down,1*"; source: "base_vbar";
+         action: STATE_SET "clicked" 0.0;
+         target: "base_vbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "base_vbar";
+         action: STATE_SET "default" 0.0;
+         target: "base_vbar";
+      }
+      program {
+         signal: "mouse,in"; source: "base_vbar";
+         action: STATE_SET "hovered" 0.0;
+         target: "base_vbar";
+      }
+      program {
+         signal: "mouse,out"; source: "base_vbar";
+         action: STATE_SET "default" 0.0;
+         target: "base_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "base_hbar";
+         action: STATE_SET "clicked" 0.0;
+         target: "base_hbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "base_hbar";
+         action: STATE_SET "default" 0.0;
+         target: "base_hbar";
+      }
+      program {
+         signal: "mouse,in"; source: "base_hbar";
+         action: STATE_SET "hovered" 0.0;
+         target: "base_hbar";
+      }
+      program {
+         signal: "mouse,out"; source: "base_hbar";
+         action: STATE_SET "default" 0.0;
+         target: "base_hbar";
+      }
+   }
+}
+
+group { name: "elm/scroller/base/single_line";
+   images {
+      image: "scroll.png" COMP;
+      image: "scroll_push.png" COMP;
+      image: "scroll_hover.png" COMP;
+      image: "scroll_h.png" COMP;
+      image: "scroll_h_push.png" COMP;
+      image: "scroll_h_hover.png" COMP;
+      image: "scroll_bg.png" COMP;
+      image: "scroll_bg_h.png" COMP;
+      image: "scroll_handle.png" COMP;
+      image: "scroll_handle_h.png" COMP;
+      image: "scroll_btn_up.png" COMP;
+      image: "scroll_btn_up_push.png" COMP;
+      image: "scroll_btn_up_hover.png" COMP;
+      image: "scroll_btn_up_disable.png" COMP;
+      image: "scroll_btn_down.png" COMP;
+      image: "scroll_btn_down_push.png" COMP;
+      image: "scroll_btn_down_hover.png" COMP;
+      image: "scroll_btn_down_disable.png" COMP;
+      image: "scroll_btn_left.png" COMP;
+      image: "scroll_btn_left_push.png" COMP;
+      image: "scroll_btn_left_hover.png" COMP;
+      image: "scroll_btn_left_disable.png" COMP;
+      image: "scroll_btn_right.png" COMP;
+      image: "scroll_btn_right_push.png" COMP;
+      image: "scroll_btn_right_hover.png" COMP;
+      image: "scroll_btn_right_disable.png" COMP;
+   }
+
+   data.item: "focus_highlight" "on";
+
+   parts {
+      program {
+         signal: "load"; source: "";
+         script {
+            emit("reload", "elm");
+         }
+      }
+// vert bar ////////////////////////////////////////////////////////////////
+      part { name: "sb_vbar_show"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "sb_vbar"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 1.0 0.5;
+            rel1.relative: 1.0 0.0;
+            rel2.relative: 1.0 0.0;
+            rel2.to_y: "sb_hbar";
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            min: 0 0;
+            max: 0 99999;
+         }
+      }
+      part { name: "sb_vbar_base";
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            rel1.relative: 0.0 1.0;
+            rel1.to: "sb_vbar_a1";
+            rel2.relative: 1.0 0.0;
+            rel2.to: "sb_vbar_a2";
+            image.normal: "scroll_bg.png";
+         }
+      }
+      part { name: "sb_vbar_p1"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 0.0 1.0;
+            rel1.to: "sb_vbar_a1";
+            rel2.relative: 1.0 0.0;
+            rel2.to: "elm.dragable.vbar";
+         }
+      }
+      part { name: "sb_vbar_p2"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 0.0 1.0;
+            rel1.to: "elm.dragable.vbar";
+            rel2.relative: 1.0 0.0;
+            rel2.to: "sb_vbar_a2";
+         }
+      }
+      part { name: "elm.dragable.vbar"; type: RECT;
+         clip_to: "sb_vbar";
+         scale: 1;
+         dragable.x: 0 0 0;
+         dragable.y: 1 1 0;
+         dragable.confine: "sb_vbar_base";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.relative: 0.5  0.5;
+            rel1.to: "sb_vbar_base";
+            rel2.relative: 0.5  0.5;
+            rel2.to: "sb_vbar_base";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "sb_vbar_a1"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 1.0 0.0;
+            aspect: 1.0 1.0; aspect_preference: HORIZONTAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_vbar";
+            rel1.relative: 1.0 0.0;
+            rel2.to: "sb_vbar";
+            rel2.relative: 1.0 0.0;
+         }
+      }
+      part { name: "sb_vbar_a2"; type: RECT;
+         clip_to: "sb_vbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 1.0 1.0;
+            aspect: 1.0 1.0; aspect_preference: HORIZONTAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_vbar";
+            rel1.relative: 1.0 1.0;
+            rel2.to: "sb_vbar";
+            rel1.relative: 1.0 1.0;
+         }
+      }
+      program {
+         signal: "elm,action,show,vbar"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "sb_vbar";
+         target: "sb_vbar_show";
+      }
+      program {
+         signal: "elm,action,hide,vbar"; source: "elm";
+         action: STATE_SET "hidden" 0.0;
+         target: "sb_vbar";
+         target: "sb_vbar_show";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a1";
+         action: STATE_SET "clicked" 0.0;
+         target: "arrow1_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a1";
+         action: DRAG_VAL_STEP 0.0 -1.0;
+         target: "elm.dragable.vbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_vbar_a1";
+         action: STATE_SET "default" 0.0;
+         target: "arrow1_vbar";
+      }
+      program {
+         signal: "mouse,in"; source: "sb_vbar_a1";
+         action: STATE_SET "hovered" 0.0;
+         target: "arrow1_vbar";
+      }
+      program {
+         signal: "mouse,out"; source: "sb_vbar_a1";
+         action: STATE_SET "default" 0.0;
+         target: "arrow1_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a2";
+         action: STATE_SET "clicked" 0.0;
+         target: "arrow2_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_a2";
+         action: DRAG_VAL_STEP 0.0 1.0;
+         target: "elm.dragable.vbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_vbar_a2";
+         action: STATE_SET "default" 0.0;
+         target: "arrow2_vbar";
+      }
+      program {
+         signal: "mouse,in"; source: "sb_vbar_a2";
+         action: STATE_SET "hovered" 0.0;
+         target: "arrow2_vbar";
+      }
+      program {
+         signal: "mouse,out"; source: "sb_vbar_a2";
+         action: STATE_SET "default" 0.0;
+         target: "arrow2_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_p1";
+         action: DRAG_VAL_PAGE 0.0 -1.0;
+         target: "elm.dragable.vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_vbar_p2";
+         action: DRAG_VAL_PAGE  0.0 1.0;
+         target: "elm.dragable.vbar";
+      }
+
+// horiz bar /////////////////////////////////////////////////////////////
+      part { name: "sb_hbar_show"; type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "sb_hbar"; type: RECT; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 0.5 1.0;
+            rel1.relative: 0.0 1.0;
+            rel2.relative: 0.0 1.0;
+            rel2.to_x: "sb_vbar";
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            min: 0 0;
+            max: 99999 0;
+         }
+      }
+      part { name: "sb_hbar_base";
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "sb_hbar_a1";
+            rel2.relative: 0.0 1.0;
+            rel2.to: "sb_hbar_a2";
+            image.normal: "scroll_bg_h.png";
+         }
+      }
+      part { name: "sb_hbar_p1"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "sb_hbar_a1";
+            rel2.relative: 0.0 1.0;
+            rel2.to: "elm.dragable.hbar";
+         }
+      }
+      part { name: "sb_hbar_p2"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "elm.dragable.hbar";
+            rel2.relative: 0.0 1.0;
+            rel2.to: "sb_hbar_a2";
+         }
+      }
+      part { name: "elm.dragable.hbar"; type: RECT;
+         clip_to: "sb_hbar";
+         scale: 1;
+         dragable.x: 1 1 0;
+         dragable.y: 0 0 0;
+         dragable.confine: "sb_hbar_base";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.relative: 0.5  0.5;
+            rel1.to: "sb_hbar_base";
+            rel2.relative: 0.5  0.5;
+            rel2.to: "sb_hbar_base";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "sb_hbar_a1"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 0.0 1.0;
+            aspect: 1.0 1.0; aspect_preference: VERTICAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_hbar";
+            rel1.relative: 0.0 1.0;
+            rel2.to: "sb_hbar";
+            rel2.relative: 0.0 1.0;
+         }
+      }
+      part { name: "sb_hbar_a2"; type: RECT;
+         clip_to: "sb_hbar";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 1.0 1.0;
+            aspect: 1.0 1.0; aspect_preference: VERTICAL;
+            color: 0 0 0 0;
+            rel1.to: "sb_hbar";
+            rel1.relative: 1.0 1.0;
+            rel2.to: "sb_hbar";
+            rel1.relative: 1.0 1.0;
+         }
+      }
+      program {
+         signal: "elm,action,show,hbar"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "sb_hbar";
+         target: "sb_hbar_show";
+      }
+      program {
+         signal: "elm,action,hide,hbar"; source: "elm";
+         action: STATE_SET "hidden" 0.0;
+         target: "sb_hbar";
+         target: "sb_hbar_show";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a1";
+         action: STATE_SET "clicked" 0.0;
+         target: "arrow1_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a1";
+         action: DRAG_VAL_STEP -1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_hbar_a1";
+         action: STATE_SET "default" 0.0;
+         target: "arrow1_hbar";
+      }
+      program {
+         signal: "mouse,in"; source: "sb_hbar_a1";
+         action: STATE_SET "hovered" 0.0;
+         target: "arrow1_hbar";
+      }
+      program {
+         signal: "mouse,out"; source: "sb_hbar_a1";
+         action: STATE_SET "default" 0.0;
+         target: "arrow1_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a2";
+         action: STATE_SET "clicked" 0.0;
+         target: "arrow2_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_a2";
+         action: DRAG_VAL_STEP 1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "sb_hbar_a2";
+         action: STATE_SET "default" 0.0;
+         target: "arrow2_hbar";
+      }
+      program {
+         signal: "mouse,in"; source: "sb_hbar_a2";
+         action: STATE_SET "hovered" 0.0;
+         target: "arrow2_hbar";
+      }
+      program {
+         signal: "mouse,out"; source: "sb_hbar_a2";
+         action: STATE_SET "default" 0.0;
+         target: "arrow2_hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_p1";
+         action: DRAG_VAL_PAGE -1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "sb_hbar_p2";
+         action: DRAG_VAL_PAGE  1.0 0.0;
+         target: "elm.dragable.hbar";
+      }
+
+      part { name: "bg"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.background";
+            rel2.to: "elm.swallow.background";
+            color: 0 0 0 0;
+            color_class: "scrollframe_base";
+         }
+      }
+      part { name: "clipper"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.background";
+            rel2.to: "elm.swallow.background";
+         }
+      }
+      part { name: "elm.swallow.background"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            //rel1.offset: 1 1;
+            rel2.relative: 0.0 0.0;
+            //rel2.offset: -2 -2;
+            rel2.to_x: "sb_vbar";
+            rel2.to_y: "sb_hbar";
+         }
+      }
+      part { name: "elm.swallow.content"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            //rel1.offset: 1 1;
+            rel2.relative: 0.0 0.0;
+            //rel2.offset: -2 -2;
+            rel2.to_x: "sb_vbar";
+            rel2.to_y: "sb_hbar";
+         }
+      }
+      part { name: "elm.swallow.overlay"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+         }
+      }
+      part { name: "arrow1_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_vbar_a1";
+            rel2.to: "sb_vbar_a1";
+            image.normal: "scroll_btn_up.png";
+            FIXED_SIZE(13, 13)
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_up_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_up_hover.png";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_up_disable.png";
+         }
+      }
+      part { name: "arrow2_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_vbar_a2";
+            rel2.to: "sb_vbar_a2";
+            image.normal: "scroll_btn_down.png";
+            FIXED_SIZE(13, 13)
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_down_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_down_hover.png";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_down_disable.png";
+         }
+      }
+      part { name: "base_vbar"; repeat_events: 1;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to: "elm.dragable.vbar";
+            rel2.to: "elm.dragable.vbar";
+            image.normal: "scroll.png";
+            image.border: 0 0 2 2;
+            fill.smooth: 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_hover.png";
+         }
+      }
+      part { name: "center_vbar"; mouse_events: 0;
+         clip_to: "sb_vbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "base_vbar";
+            rel2.to: "base_vbar";
+            image.normal: "scroll_handle.png";
+            FIXED_SIZE(13, 8)
+         }
+      }
+      part { name: "arrow1_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_hbar_a1";
+            rel2.to: "sb_hbar_a1";
+            image.normal: "scroll_btn_left.png";
+            FIXED_SIZE(13, 13)
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_left_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_left_hover.png";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_left_disable.png";
+         }
+      }
+      part { name: "arrow2_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "sb_hbar_a2";
+            rel2.to: "sb_hbar_a2";
+            image.normal: "scroll_btn_right.png";
+            FIXED_SIZE(13, 13)
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_right_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_right_hover.png";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_btn_right_disable.png";
+         }
+      }
+      part { name: "base_hbar"; repeat_events: 1;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to: "elm.dragable.hbar";
+            rel2.to: "elm.dragable.hbar";
+            image.normal: "scroll_h.png";
+            image.border: 2 2 0 0;
+            fill.smooth: 0;
+         }
+         description { state: "clicked" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_h_push.png";
+         }
+         description { state: "hovered" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "scroll_h_hover.png";
+         }
+      }
+      part { name: "center_hbar"; mouse_events: 0;
+         clip_to: "sb_hbar_show";
+         description { state: "default" 0.0;
+            rel1.to: "base_hbar";
+            rel2.to: "base_hbar";
+            image.normal: "scroll_handle_h.png";
+            FIXED_SIZE(8, 13)
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "mouse,down,1*"; source: "base_vbar";
+         action: STATE_SET "clicked" 0.0;
+         target: "base_vbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "base_vbar";
+         action: STATE_SET "default" 0.0;
+         target: "base_vbar";
+      }
+      program {
+         signal: "mouse,in"; source: "base_vbar";
+         action: STATE_SET "hovered" 0.0;
+         target: "base_vbar";
+      }
+      program {
+         signal: "mouse,out"; source: "base_vbar";
+         action: STATE_SET "default" 0.0;
+         target: "base_vbar";
+      }
+      program {
+         signal: "mouse,down,1*"; source: "base_hbar";
+         action: STATE_SET "clicked" 0.0;
+         target: "base_hbar";
+      }
+      program {
+         signal: "mouse,up,1"; source: "base_hbar";
+         action: STATE_SET "default" 0.0;
+         target: "base_hbar";
+      }
+      program {
+         signal: "mouse,in"; source: "base_hbar";
+         action: STATE_SET "hovered" 0.0;
+         target: "base_hbar";
+      }
+      program {
+         signal: "mouse,out"; source: "base_hbar";
+         action: STATE_SET "default" 0.0;
+         target: "base_hbar";
+      }
+   }
+}
+
+group { name: "elm/scroller/entry/default";
+   alias: "elm/scroller/entry/about";
+   inherit: "elm/scroller/base/default";
+   image: "bg_glow_in.png" COMP;
+   parts {
+      part { name: "elm.swallow.content";
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.icon";
+            rel1.relative: 1.0 0.0;
+            rel1.offset: 0 0;
+            rel2.to: "elm.swallow.end";
+            rel2.relative: 0.0 1.0;
+            rel2.offset: -1 -1;
+         }
+      }
+      part { name: "elm.swallow.icon"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to: "clipper";
+            rel1.offset: 1 1;
+            rel2.to: "clipper";
+            rel2.offset: 1 -2;
+            rel2.relative: 0.0 1.0;
+            visible: 0;
+            align: 1.0 0.0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            align: 0.0 0.0;
+         }
+      }
+      program {
+         signal: "elm,action,show,icon"; source: "elm";
+         action: STATE_SET "visible" 0.0;
+         target: "elm.swallow.icon";
+      }
+      program {
+         signal: "elm,action,hide,icon"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "elm.swallow.icon";
+      }
+      part { name: "elm.swallow.end"; type: SWALLOW;
+         clip_to: "clipper";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to: "clipper";
+            rel1.offset: -2 1;
+            rel1.relative: 1.0 0.0;
+            rel2.to: "clipper";
+            rel2.offset: -2 -2;
+            visible: 0;
+            align: 0.0 0.0;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            align: 1.0 0.0;
+         }
+      }
+      program {
+         signal: "elm,action,show,end"; source: "elm";
+         action: STATE_SET "visible" 0.0;
+         target: "elm.swallow.end";
+      }
+      program {
+         signal: "elm,action,hide,end"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "elm.swallow.end";
+      }
+      part { name: "glow";
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            image.normal: "bg_glow_in.png";
+            image.border: 7 7 7 7;
+            image.middle: 0;
+            fill.smooth: 0;
+            color: 255 255 255 0;
+         }
+         description { state: "focused" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 255;
+         }
+         description { state: "focused2" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 64;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "elm,action,focus_highlight,show"; source: "elm";
+         action: STATE_SET "focused" 0.0;
+         target: "glow";
+         after: "focus_in2";
+      }
+      program { name: "focus_in2";
+         action: STATE_SET "focused2" 0.0;
+         transition: DECELERATE 0.5;
+         target: "glow";
+      }
+      program {
+         signal: "elm,action,focus_highlight,hide"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.3;
+         target: "glow";
+      }
+   }
+}
+
+group { name: "elm/scroller/entry/single_line";
+   inherit: "elm/scroller/base/single_line";
+   alias: "elm/scroller/entry_single/default";
+   image: "text_input_box_selected.png" COMP;
+   image: "text_input_box_hover.png" COMP;
+   image: "text_input_box.png" COMP;
+   parts {
+      part { name: "input_box";
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to: "bg";
+            rel2.to: "bg";
+            image.normal: "text_input_box.png";
+            image.border: 6 2 4 4;
+            fill.smooth: 1;
+            min: 0 24;
+            max: -1 24;
+            fixed: 0 1;
+         }
+         description { state: "focused" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "text_input_box_selected.png";
+         }
+         description { state: "hover" 0.0;
+            inherit: "default" 0.0;
+            image.normal: "text_input_box_hover.png";
+         }
+      }
+      part { name: "elm.swallow.content";
+         insert_after: "input_box";
+         description { state: "default" 0.0;
+         }
+      }
+      part { name: "overlay";
+         type: RECT;
+         insert_after: "elm.swallow.content";
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "elm,action,focus_highlight,show"; source: "elm";
+         action: STATE_SET "focused" 0.0;
+         target: "input_box";
+         after: "focus_in2";
+      }
+      program { name: "focus_in2";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.5;
+         target: "input_box";
+      }
+      program {
+         signal: "elm,action,focus_highlight,hide"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         transition: DECELERATE 0.3;
+         target: "input_box";
+      }
+      program {
+         signal: "mouse,down,1"; source: "overlay";
+         action: STATE_SET "hover" 0.0;
+         target: "input_box";
+      }
+      program {
+         signal: "mouse,up,1"; source: "overlay";
+         action: STATE_SET "default" 0.0;
+         target: "input_box";
+      }
+   }
+}
diff --git a/data/themes/elm/separator.edc b/data/themes/elm/separator.edc
new file mode 100644 (file)
index 0000000..cb9862b
--- /dev/null
@@ -0,0 +1,12 @@
+group { name: "elm/separator/vertical/tools";
+   parts {
+      part { name: "base";
+         type: RECT;
+         description { state: "default" 0.0;
+            min: 1 18;
+            max: 1 18;
+            color: 30 138 154 255;
+         }
+      }
+   }
+}
diff --git a/data/themes/elm/slider.edc b/data/themes/elm/slider.edc
new file mode 100644 (file)
index 0000000..cf6ea45
--- /dev/null
@@ -0,0 +1,799 @@
+group { name: "elm/slider/hidden/limit";
+   parts {
+      part { name: "elm.units.min";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            align: 1.0 0.5;
+            color: 0 0 0 255;
+            text {
+               font: FN;
+               size: 10;
+               min: 1 1;
+               align: 0.0 0.5;
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "elm.units.max";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            align: 1.0 0.5;
+            color: 0 0 0 255;
+            text {
+               font: FN;
+               size: 10;
+               min: 1 1;
+               align: 0.0 0.5;
+               ellipsis: -1;
+            }
+         }
+      }
+   }
+}
+
+group { name: "elm/slider/horizontal/default";
+   images {
+      image: "slider_gauge.png" COMP;
+      image: "slider_gauge_over.png" COMP;
+      image: "slider_gauge_handle.png" COMP;
+   }
+   parts {
+      alias: "default" "elm.text";
+      part { name: "base";
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            max: 99999 11;
+            min: 0 11;
+            rel1 { to: "bg"; }
+            rel2 { to: "bg"; }
+            image.normal: "slider_gauge.png";
+            image.border: 1 1 2 2;
+         }
+      }
+      part { name: "level";
+         type: IMAGE;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            max: 99999 11;
+            min: 0 11;
+            rel1.to: "base";
+            rel2 {
+               to_y: "base";
+               to_x: "elm.dragable.slider";
+               relative: 0.5 1.0;
+            }
+            image.normal: "slider_gauge_over.png";
+         }
+         description { state: "inverted" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "bg";
+         type: RECT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            rel1.to: "elm.swallow.bar";
+            rel2.to: "elm.swallow.bar";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "elm.swallow.bar";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 7 24;
+            max: 99999 24;
+            align: 1.0 0.5;
+            rel1 {
+               to_x: "elm.text";
+               relative: 1.0 0.0;
+               offset: 8 0;
+            }
+            rel2 {
+               to_x: "limits";
+               relative: 0.0 1.0;
+               offset: -10 -1;
+            }
+         }
+      }
+      part { name: "button";
+         type: IMAGE;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            max: 7 11;
+            min: 7 11;
+            rel1.to: "elm.dragable.slider";
+            rel2.to: "elm.dragable.slider";
+            image {
+               normal: "slider_gauge_handle.png";
+            }
+         }
+      }
+      part { name: "left_padding";
+         type: SPACER;
+         description { state: "default" 0.0;
+            rel1.relative: 0 0;
+            rel2.relative: 0 1;
+            align: 0 0.5;
+            min: 0 0;
+            fixed: 1 0;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 0.0 0.5;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "left_padding";
+            rel2.relative: 1.0 1.0;
+            rel2.to: "left_padding";
+            color: COL_NM;
+            text {
+               font: FN;
+               size: 13;
+               min: 1 1;
+               align: 0.0 0.5;
+               ellipsis: -1;
+            }
+         }
+      }
+      alias: "elm.units.min" "limits:elm.units.min";
+      alias: "elm.units.max" "limits:elm.units.max";
+      part { name: "limits";
+         type: GROUP;
+         source: "elm/slider/hidden/limit";
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            align: 1.0 0.5;
+            min: SOURCE;
+            fixed: 1 1;
+            rel1.relative: 1.0 0.0;
+            rel1.offset: 0 8;
+            rel2.relative: 1.0 1.0;
+            rel2.offset: 0 -9;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            rel1.offset: -5 0;
+            rel2.offset: -5 -1;
+         }
+      }
+      part { name: "elm.units";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to_x: "limits";
+            rel2.to_x: "limits";
+            color: 0 0 0 255;
+            text {
+               font: FN;
+               size: 10;
+               min: 1 1;
+               align: 1.0 0.5;
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "elm.dragable.slider";
+         type: RECT;
+         scale: 1;
+         dragable {
+            x: 1 1 0;
+            y: 0 0 0;
+            confine: "bg";
+         }
+         description { state: "default" 0.0;
+            min: 0 0;
+            max: 0 0;
+            fixed: 1 1;
+            rel1 {
+               relative: 0.5 0.0;
+               to_x: "bg";
+            }
+            rel2 {
+               relative: 0.5 1.0;
+               to_x: "bg";
+            }
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "slideevent";
+         type: RECT;
+         mouse_events: 1;
+         scale: 1;
+         dragable.events: "elm.dragable.slider";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 7 11;
+            max: 7 11;
+            rel1.to: "elm.dragable.slider";
+            rel2.to: "elm.dragable.slider";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "elm.track.slider";
+         type: SWALLOW;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            max: 0 0;
+            rel1.to: "elm.dragable.slider";
+            rel2.to: "elm.dragable.slider";
+         }
+      }
+   }
+   programs {
+      program { name: "indicator_show";
+         signal: "elm,state,indicator,show";
+         source: "elm";
+         action:  SIGNAL_EMIT "popup,show" "elm";
+      }
+      program { name: "indicator_hide";
+         signal: "elm,state,indicator,hide";
+         source: "elm";
+         action:  SIGNAL_EMIT "popup,hide" "elm";
+      }
+      program { name: "popup_show";
+         signal: "mouse,down,1";
+         source: "slideevent";
+         action:  SIGNAL_EMIT "popup,show" "elm";
+      }
+      program { name: "popup_hide";
+         signal: "mouse,up,1";
+         source: "slideevent";
+         action:  SIGNAL_EMIT "popup,hide" "elm";
+      }
+      program { name: "text_show";
+         signal: "elm,state,text,visible";
+         source: "elm";
+         action:  STATE_SET "visible" 0.0;
+         target: "elm.text";
+      }
+      program { name: "text_hide";
+         signal: "elm,state,text,hidden";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "elm.text";
+      }
+      program { name: "units_show";
+         signal: "elm,state,units,visible";
+         source: "elm";
+         action:  STATE_SET "visible" 0.0;
+         target: "elm.units";
+         target: "limits";
+         after: "limits,children,visible";
+      }
+      program { name: "limits,children,visible";
+         action: SIGNAL_EMIT "limits:limits,visible" "elm";
+      }
+      program { name: "units_hide";
+         signal: "elm,state,units,hidden";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "elm.units";
+         target: "limits";
+         after: "limits,children,hide";
+      }
+      program { name: "limits,children,hide";
+         action: SIGNAL_EMIT "limits:limits,hide" "elm";
+      }
+      program { name: "invert_on";
+         signal: "elm,state,inverted,on";
+         source: "elm";
+         action:  STATE_SET "inverted" 0.0;
+         target: "level";
+      }
+      program { name: "invert_off";
+         signal: "elm,state,inverted,off";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "level";
+      }
+   }
+}
+
+group { name: "elm/slider/horizontal/pop";
+   inherit: "elm/slider/horizontal/default";
+   images {
+      image: "slider_gauge_pop.png" COMP;
+      image: "slider_gauge_over_pop.png" COMP;
+      image: "slider_gauge_handle_pop.png" COMP;
+   }
+   parts {
+      part { name: "base";
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            max: 99999 15;
+            min: 0 15;
+            rel1 { to: "bg"; }
+            rel2 { to: "bg"; }
+            image.normal: "slider_gauge_pop.png";
+            image.border: 1 1 2 2;
+         }
+      }
+      part { name: "level";
+         type: IMAGE;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            max: 99999 15;
+            min: 0 15;
+            rel1.to: "base";
+            rel2 {
+               to_y: "base";
+               to_x: "elm.dragable.slider";
+               relative: 0.5 1.0;
+            }
+            image.normal: "slider_gauge_over_pop.png";
+         }
+         description { state: "inverted" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "bg";
+         type: RECT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            rel1.to: "elm.swallow.bar";
+            rel2.to: "elm.swallow.bar";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "elm.swallow.bar";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 11 24;
+            max: 99999 24;
+            align: 1.0 0.5;
+            rel1 {
+               to_x: "elm.text";
+               relative: 1.0 0.0;
+               offset: 8 0;
+            }
+            rel2 {
+               to_x: "limits";
+               relative: 0.0 1.0;
+               offset: -10 -1;
+            }
+         }
+      }
+      part { name: "button";
+         type: IMAGE;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            max: 11 15;
+            min: 11 15;
+            rel1.to: "elm.dragable.slider";
+            rel2.to: "elm.dragable.slider";
+            image {
+               normal: "slider_gauge_handle_pop.png";
+            }
+         }
+      }
+      part { name: "left_padding";
+         type: SPACER;
+         description { state: "default" 0.0;
+            rel1.relative: 0 0;
+            rel2.relative: 0 1;
+            align: 0 0.5;
+            min: 0 0;
+            fixed: 1 0;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 0.0 0.5;
+            rel1.relative: 1.0 0.0;
+            rel1.to: "left_padding";
+            rel2.relative: 1.0 1.0;
+            rel2.to: "left_padding";
+            color: COL_NM;
+            text {
+               font: FN;
+               size: 13;
+               min: 1 1;
+               align: 0.0 0.5;
+               ellipsis: -1;
+            }
+         }
+      }
+      alias: "elm.units.min" "limits:elm.units.min";
+      alias: "elm.units.max" "limits:elm.units.max";
+      part { name: "limits";
+         type: GROUP;
+         source: "elm/slider/hidden/limit";
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            align: 1.0 0.5;
+            min: SOURCE;
+            fixed: 1 1;
+            rel1.relative: 1.0 0.0;
+            rel1.offset: 0 8;
+            rel2.relative: 1.0 1.0;
+            rel2.offset: 0 -9;
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            rel1.offset: -5 0;
+            rel2.offset: -5 -1;
+         }
+      }
+      part { name: "elm.units";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to_x: "limits";
+            rel2.to_x: "limits";
+            color: 0 0 0 255;
+            text {
+               font: FN;
+               size: 10;
+               min: 1 1;
+               align: 1.0 0.5;
+            }
+         }
+      }
+      part { name: "elm.dragable.slider";
+         type: RECT;
+         scale: 1;
+         dragable {
+            x: 1 1 0;
+            y: 0 0 0;
+            confine: "bg";
+         }
+         description { state: "default" 0.0;
+            min: 0 0;
+            max: 0 0;
+            fixed: 1 1;
+            rel1 {
+               relative: 0.5 0.0;
+               to_x: "bg";
+            }
+            rel2 {
+               relative: 0.5 1.0;
+               to_x: "bg";
+            }
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "slideevent";
+         type: RECT;
+         mouse_events: 1;
+         scale: 1;
+         dragable.events: "elm.dragable.slider";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 11 15;
+            max: 11 15;
+            rel1.to: "elm.dragable.slider";
+            rel2.to: "elm.dragable.slider";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "elm.track.slider";
+         type: SWALLOW;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            max: 0 0;
+            rel1.to: "elm.dragable.slider";
+            rel2.to: "elm.dragable.slider";
+         }
+      }
+   }
+}
+
+group { name: "elm/slider/horizontal/no_slider_value";
+   images {
+      image: "slider_gauge.png" COMP;
+      image: "slider_gauge_over.png" COMP;
+      image: "slider_gauge_handle.png" COMP;
+   }
+   parts {
+      part { name: "base";
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            max: 99999 11;
+            min: 0 11;
+            rel1 { to: "bg"; }
+            rel2 { to: "bg"; }
+            image.normal: "slider_gauge.png";
+            image.border: 1 1 2 2;
+         }
+      }
+      part { name: "level";
+         type: IMAGE;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            max: 99999 11;
+            min: 0 11;
+            rel1.to: "base";
+            rel2 {
+               to_y: "base";
+               to_x: "elm.dragable.slider";
+               relative: 0.5 1.0;
+            }
+            image.normal: "slider_gauge_over.png";
+         }
+         description { state: "inverted" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "bg";
+         type: RECT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            rel1.to: "elm.swallow.bar";
+            rel2.to: "elm.swallow.bar";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "top_padding";
+         type: SPACER;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 0 11;
+            fixed: 0 1;
+            align: 0.5 0;
+            rel1.relative: 0.0 0.0;
+            rel2.relative: 1.0 0.0;
+         }
+      }
+      part { name: "left_padding";
+         type: SPACER;
+         description { state: "default" 0.0;
+            rel1.relative: 0 0;
+            rel2.relative: 0 1;
+            align: 0 0.5;
+            min: 9 0;
+            fixed: 1 0;
+         }
+      }
+      part { name: "right_padding";
+         type: SPACER;
+         description { state: "default" 0.0;
+            rel1.relative: 1 0;
+            rel2.relative: 1 1;
+            align: 1 0.5;
+            min: 9 0;
+            fixed: 1 0;
+         }
+      }
+      part { name: "elm.units.min";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 0.0 0.5;
+            rel1 { to_x: "base"; to_y: "top_padding"; relative: 0.0 0.0; }
+            rel2 { to_x: "base"; to_y: "top_padding"; relative: 0.0 1.0; }
+            color: 163 163 163 255;
+            text {
+               font: FN;
+               size: 10;
+               min: 1 1;
+               align: 0.0 1.0;
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "elm.units.max";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 1.0 0.5;
+            rel1 { to_x: "base"; to_y: "top_padding"; relative: 1.0 0.0; }
+            rel2 { to_x: "base"; to_y: "top_padding"; relative: 1.0 1.0; }
+            color: 163 163 163 255;
+            text {
+               font: FN;
+               size: 10;
+               min: 1 1;
+               align: 1.0 1.0;
+               ellipsis: -1;
+            }
+         }
+      }
+      part { name: "elm.swallow.bar";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 7 11;
+            max: 99999 11;
+            fixed: 0 1;
+            align: 0.5 0;
+            rel1 {
+               to_x: "left_padding";
+               to_y: "top_padding";
+               relative: 1 1;
+            }
+            rel2 {
+               to_x: "right_padding";
+               to_y: "top_padding";
+               relative: 0 1;
+            }
+         }
+      }
+      part { name: "button";
+         type: IMAGE;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            max: 7 11;
+            min: 7 11;
+            rel1.to: "elm.dragable.slider";
+            rel2.to: "elm.dragable.slider";
+            image {
+               normal: "slider_gauge_handle.png";
+            }
+         }
+      }
+      part { name: "elm.dragable.slider";
+         type: RECT;
+         scale: 1;
+         dragable {
+            x: 1 1 0;
+            y: 0 0 0;
+            confine: "bg";
+         }
+         description { state: "default" 0.0;
+            min: 0 0;
+            max: 0 0;
+            fixed: 1 1;
+            rel1 {
+               relative: 0.5 0.0;
+               to: "bg";
+            }
+            rel2 {
+               relative: 0.5 1.0;
+               to: "bg";
+            }
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "slideevent";
+         type: RECT;
+         mouse_events: 1;
+         scale: 1;
+         dragable.events: "elm.dragable.slider";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: 7 11;
+            max: 7 1;
+            rel1.to: "elm.dragable.slider";
+            rel2.to: "elm.dragable.slider";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "elm.track.slider";
+         type: SWALLOW;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            max: 0 0;
+            rel1.to: "elm.dragable.slider";
+            rel2.to: "elm.dragable.slider";
+         }
+      }
+   }
+   programs {
+      program { name: "indicator_show";
+         signal: "elm,state,indicator,show";
+         source: "elm";
+         action:  SIGNAL_EMIT "popup,show" "elm";
+         after: "popup_show2";
+      }
+      program { name: "indicator_hide";
+         signal: "elm,state,indicator,hide";
+         source: "elm";
+         action:  SIGNAL_EMIT "popup,hide" "elm";
+         after: "popup_hide2";
+      }
+      program { name: "popup_show";
+         signal: "mouse,down,1";
+         source: "slideevent";
+         action:  SIGNAL_EMIT "popup,show" "elm";
+         after: "popup_show2";
+      }
+      program { name: "popup_show2";
+         action:  STATE_SET "hidden" 0.0;
+         target: "button";
+      }
+      program { name: "popup_hide";
+         signal: "mouse,up,1";
+         source: "slideevent";
+         action:  SIGNAL_EMIT "popup,hide" "elm";
+         after: "popup_hide2";
+      }
+      program { name: "popup_hide2";
+         action:  STATE_SET "default" 0.0;
+         target: "button";
+      }
+      program { name: "units_show";
+         signal: "elm,state,units,visible";
+         source: "elm";
+         after: "limits,children,visible";
+      }
+      program { name: "limits,children,visible";
+         action: SIGNAL_EMIT "limits:limits,visible" "elm";
+      }
+      program { name: "units_hide";
+         signal: "elm,state,units,hidden";
+         source: "elm";
+         after: "limits,children,hide";
+      }
+      program { name: "limits,children,hide";
+         action: SIGNAL_EMIT "limits:limits,hide" "elm";
+      }
+      program { name: "invert_on";
+         signal: "elm,state,inverted,on";
+         source: "elm";
+         action:  STATE_SET "inverted" 0.0;
+         target: "level";
+      }
+      program { name: "invert_off";
+         signal: "elm,state,inverted,off";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "level";
+      }
+   }
+}
+
+group { name: "elm/slider/horizontal/indicator/default";
+   alias: "elm/slider/horizontal/indicator/disabled";
+   alias: "elm/slider/vertical/indicator/default";
+   alias: "elm/slider/vertical/indicator/disabled";
+   alias: "elm/slider/horizontal/popup/default";
+   alias: "elm/slider/vertical/popup/default";
+   images {
+      image: "slider_gauge_handle.png" COMP;
+   }
+   parts {
+      part { name: "button";
+         type: SPACER;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            max: 7 11;
+            min: 7 11;
+         }
+      }
+   }
+}
diff --git a/data/themes/elm/spinner.edc b/data/themes/elm/spinner.edc
new file mode 100644 (file)
index 0000000..b19306a
--- /dev/null
@@ -0,0 +1,309 @@
+group { name: "elm/spinner/base/default";
+   images.image: "vert_bar_inset.png" COMP;
+   parts {
+      part { name: "clip"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "elm.swallow.text_button";
+            rel2.to: "elm.swallow.text_button";
+         }
+      }
+      part { name: "bg";
+         type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "inset"; mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.offset: 0 1;
+            rel2.offset: -1 -2;
+            image.normal: "vert_bar_inset.png";
+            image.border: 1 1 8 6;
+            image.middle: 0;
+            fill.smooth: 0;
+         }
+      }
+      part { name: "access";
+         type: RECT;
+         repeat_events: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            color: 0 0 0 0;
+            rel1.to: "inset";
+            rel2.to: "inset";
+            visible: 0;
+         }
+         description { state: "active" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.entry";
+         type: SWALLOW;
+         clip_to: "clip";
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            rel1.to: "elm.swallow.text_button";
+            rel2.to: "elm.swallow.text_button";
+            visible: 0;
+         }
+         description { state: "active" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "elm.swallow.dec_button";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "inset";
+            rel1.offset: 4 1;
+            rel2.to: "inset";
+            rel2.offset: 1 -2;
+            rel2.relative: 0.0 1.0;
+            align: 0.0 0.5;
+            min: 19 24;
+            aspect: 1.0 1.0; aspect_preference: VERTICAL;
+         }
+      }
+      part { name: "elm.swallow.inc_button";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "inset";
+            rel1.offset: 1 1;
+            rel1.relative: 1.0 0.0;
+            rel2.to: "inset";
+            rel2.offset: -3 -2;
+            align: 1.0 0.5;
+            min: 19 24;
+            aspect: 1.0 1.0; aspect_preference: VERTICAL;
+         }
+      }
+      part { name: "elm.swallow.text_button";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 1;
+            rel1.to_y: "inset";
+            rel1.to_x: "elm.swallow.dec_button";
+            rel1.relative: 1.0 0.0;
+            rel1.offset: 1 1;
+            rel2.to_y: "inset";
+            rel2.to_x: "elm.swallow.inc_button";
+            rel2.relative: 0.0 1.0;
+            rel2.offset: -2 -2;
+            min: 38 24;
+         }
+         description { state: "inactive" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "elm.dragable.slider"; type: RECT;
+         repeat_events: 1;
+         dragable.x: 1 1 0;
+         dragable.y: 0 0 0;
+         description { state: "default" 0.0;
+            fixed: 1 0;
+            rel1.to: "elm.swallow.text_button";
+            rel2.to: "elm.swallow.text_button";
+            color: 0 0 0 0;
+         }
+      }
+      part { name: "disabler";
+         type: RECT;
+         repeat_events: 0;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+            visible: 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+   }
+   programs {
+      program { name: "entry_active";
+         signal: "elm,state,entry,active";
+         source: "elm";
+         action: STATE_SET "active" 0.0;
+         target: "elm.swallow.entry";
+      }
+      program { name: "entry_inactive";
+         signal: "elm,state,entry,inactive";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "elm.swallow.entry";
+      }
+      program { name: "text_button_active";
+         signal: "elm,state,button,active";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "elm.swallow.text_button";
+      }
+      program { name: "text_button_inactive";
+         signal: "elm,state,button,inactive";
+         source: "elm";
+         action: STATE_SET "inactive" 0.0;
+         target: "elm.swallow.text_button";
+      }
+      program { name: "access_activate";
+         signal: "elm,state,access,active";
+         source: "elm";
+         action:  STATE_SET "active" 0.0;
+         target: "access";
+      }
+      program { name: "access_inactivate";
+         signal: "elm,state,access,inactive";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "access";
+      }
+      program { name: "disable";
+         signal: "elm,state,disabled";
+         source: "elm";
+         action: STATE_SET "disabled" 0.0;
+         target: "disabler";
+      }
+      program { name: "enable";
+         signal: "elm,state,enabled";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "disabler";
+      }
+         program { name: "toggle";
+         signal: "elm,state,enabled";
+         source: "elm.dragable.slider";
+         action: SIGNAL_EMIT "elm,action,entry,toggle" "*";
+      }
+   }
+}
+
+group { name: "elm/spinner/base/vertical";
+   inherit: "elm/spinner/base/default";
+   parts {
+      part { name: "elm.swallow.inc_button";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "inset";
+            rel1.offset: 1 1;
+            rel1.relative: 1.0 0.0;
+            rel2.to: "inset";
+            rel2.offset: 1 -2;
+            align: 1.0 0.5;
+         }
+      }
+      part { name: "elm.swallow.text_button";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 1;
+            rel1.to_y: "inset";
+            rel1.to_x: "elm.swallow.dec_button";
+            rel1.relative: 1.0 0.0;
+            rel1.offset: 1 1;
+            rel2.to_y: "inset";
+            rel2.to_x: "elm.swallow.inc_button";
+            rel2.relative: 0.0 1.0;
+            rel2.offset: -2 -2;
+         }
+         description { state: "active" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "elm.swallow.dec_button";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "inset";
+            rel1.offset: 1 1;
+            rel2.to: "inset";
+            rel2.offset: 1 -2;
+            rel2.relative: 0.0 1.0;
+            align: 0.0 0.5;
+         }
+      }
+      part { name: "elm.dragable.slider"; type: RECT;
+         repeat_events: 1;
+         dragable.x: 0 0 0;
+         dragable.y: 1 1 0;
+         description { state: "default" 0.0;
+            fixed: 1 0;
+            rel1.to: "elm.swallow.text_button";
+            rel2.to: "elm.swallow.text_button";
+            color: 0 0 0 0;
+         }
+      }
+   }
+}
+
+group { name: "elm/spinner/base/color_input";
+   inherit: "elm/spinner/base/default";
+   parts {
+     part { name: "inset"; mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.offset: 0 -1;
+            rel2.offset: -1 0;
+            image.normal: "vert_bar_inset.png";
+            image.border: 1 1 1 1;
+            image.middle: 0;
+            fill.smooth: 0;
+         }
+      }
+      part { name: "elm.swallow.dec_button";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "inset";
+            rel2.to: "inset";
+            rel1.offset: 1 0;
+            rel2.offset: -1 -1;
+            rel2.relative: 0.0 1.0;
+            align: 0.0 0.5;
+            min: 19 0;
+            max: 19 24;
+            fixed: 1 0;
+         }
+      }
+      part { name: "elm.swallow.inc_button";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            rel1.to: "inset";
+            rel1.offset: 0 0;
+            rel2.offset: -2 -1;
+            rel2.to: "inset";
+            align: 1.0 0.5;
+            min: 19 0;
+            max: 19 24;
+            fixed: 1 0;
+         }
+      }
+      part { name: "elm.swallow.text_button";
+         type: SWALLOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 1;
+            rel1.to_y: "inset";
+            rel1.to_x: "elm.swallow.dec_button";
+            rel1.relative: 1.0 0.0;
+            rel2.to_y: "inset";
+            rel2.to_x: "elm.swallow.inc_button";
+            rel2.relative: 0.0 1.0;
+            fixed: 1 1;
+            min: 38 24;
+            max: 38 24;
+         }
+         description { state: "inactive" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+   }
+}
diff --git a/data/themes/elm/tooltip.edc b/data/themes/elm/tooltip.edc
new file mode 100644 (file)
index 0000000..9a3c38b
--- /dev/null
@@ -0,0 +1,431 @@
+group { name: "elm/label/base/tooltip/default";
+   alias: "elm/label/base/tooltip"; //XXX: Remove it in EFL 2.0
+   alias: "elm/label/base/tooltip/transparent";
+   styles {
+      style { name: "tooltip_style";
+         base: "font="FN" font_size=10 color=#000000 text_class=bubble";
+         tag:  "br" "\n";
+         tag: "hilight" "+ font="FN" text_class=bubble";
+         tag: "b" "+ font="FN" text_class=bubble";
+         tag:  "tab" "\t";
+      }
+   }
+   parts {
+      part { name: "elm.text"; type: TEXTBLOCK; mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            text {
+               style: "tooltip_style";
+               min: 1 1;
+               ellipsis: -1;
+            }
+         }
+      }
+   }
+}
+
+group { name: "elm/tooltip/base/default";
+   min: 30 30;
+   data.item: "pad_x" "10";
+   data.item: "pad_y" "10";
+   data.item: "pad_border_x" "1";
+   data.item: "pad_border_y" "1";
+   /* tooltip is hidden after this amount.
+    Keep in sync with hide animations */
+   data.item: "hide_timeout" "0.35";
+   // if in a window... it's transparent!
+   data.item: "transparent" "enabled";
+   images.image: "tooltip-base.png" COMP;
+   images.image: "tooltip-corner-top-left-tip.png" COMP;
+   images.image: "tooltip-corner-top-right-tip.png" COMP;
+   images.image: "tooltip-corner-bottom-left-tip.png" COMP;
+   images.image: "tooltip-corner-bottom-right-tip.png" COMP;
+   images.image: "tooltip-edge-left-tip.png" COMP;
+   images.image: "tooltip-edge-right-tip.png" COMP;
+   images.image: "tooltip-edge-bottom-tip.png" COMP;
+   images.image: "tooltip-edge-top-tip.png" COMP;
+   script {
+      hide_corners() {
+         set_state(PART:"corner-top-left", "default", 0.0);
+         set_state(PART:"corner-top-right", "default", 0.0);
+         set_state(PART:"corner-bottom-left", "default", 0.0);
+         set_state(PART:"corner-bottom-right", "default", 0.0);
+      }
+      hide_edges() {
+         set_state(PART:"clipper-edge-left", "default", 0.0);
+         set_state(PART:"clipper-edge-right", "default", 0.0);
+         set_state(PART:"clipper-edge-top", "default", 0.0);
+         set_state(PART:"clipper-edge-bottom", "default", 0.0);
+      }
+      show_corner_top_left() {
+         set_state(PART:"corner-top-left", "visible", 0.0);
+         set_state(PART:"corner-top-right", "default", 0.0);
+         set_state(PART:"corner-bottom-left", "default", 0.0);
+         set_state(PART:"corner-bottom-right", "default", 0.0);
+         hide_edges();
+      }
+      show_corner_top_right() {
+         set_state(PART:"corner-top-right", "visible", 0.0);
+         set_state(PART:"corner-top-left", "default", 0.0);
+         set_state(PART:"corner-bottom-left", "default", 0.0);
+         set_state(PART:"corner-bottom-right", "default", 0.0);
+         hide_edges();
+      }
+      show_corner_bottom_left() {
+         set_state(PART:"corner-bottom-left", "visible", 0.0);
+         set_state(PART:"corner-bottom-right", "default", 0.0);
+         set_state(PART:"corner-top-left", "default", 0.0);
+         set_state(PART:"corner-top-right", "default", 0.0);
+         hide_edges();
+      }
+      show_corner_bottom_right() {
+         set_state(PART:"corner-bottom-right", "visible", 0.0);
+         set_state(PART:"corner-bottom-left", "default", 0.0);
+         set_state(PART:"corner-top-left", "default", 0.0);
+         set_state(PART:"corner-top-right", "default", 0.0);
+         hide_edges();
+      }
+      show_edge_left(Float:val) {
+         set_state(PART:"clipper-edge-left", "visible", 0.0);
+         set_drag(PART:"edge-drag-left", 0.0, val);
+         set_state(PART:"clipper-edge-right", "default", 0.0);
+         set_state(PART:"clipper-edge-top", "default", 0.0);
+         set_state(PART:"clipper-edge-bottom", "default", 0.0);
+         hide_corners();
+      }
+      show_edge_right(Float:val) {
+         set_state(PART:"clipper-edge-right", "visible", 0.0);
+         set_drag(PART:"edge-drag-right", 0.0, val);
+         set_state(PART:"clipper-edge-left", "default", 0.0);
+         set_state(PART:"clipper-edge-top", "default", 0.0);
+         set_state(PART:"clipper-edge-bottom", "default", 0.0);
+         hide_corners();
+      }
+      show_edge_top(Float:val) {
+         set_state(PART:"clipper-edge-top", "visible", 0.0);
+         set_drag(PART:"edge-drag-top", val, 0.0);
+         set_state(PART:"clipper-edge-bottom", "default", 0.0);
+         set_state(PART:"clipper-edge-left", "default", 0.0);
+         set_state(PART:"clipper-edge-right", "default", 0.0);
+         hide_corners();
+      }
+      show_edge_bottom(Float:val) {
+         set_state(PART:"clipper-edge-bottom", "visible", 0.0);
+         set_drag(PART:"edge-drag-bottom", val, 0.0);
+         set_state(PART:"clipper-edge-top", "default", 0.0);
+         set_state(PART:"clipper-edge-left", "default", 0.0);
+         set_state(PART:"clipper-edge-right", "default", 0.0);
+         hide_corners();
+      }
+      public message(Msg_Type:type, id, ...) {
+         if ((type == MSG_FLOAT_SET) && (id == 1)) {
+            new Float:x, Float:y;
+
+            x = getfarg(2);
+            y = getfarg(3);
+
+            if (x < 0.0) {
+               if (y < 0.0) show_corner_top_left();
+               else if (y > 1.0) show_corner_bottom_left();
+               else show_edge_left(y);
+            } else if (x > 1.0) {
+               if (y < 0.0) show_corner_top_right();
+               else if (y > 1.0) show_corner_bottom_right();
+               else show_edge_right(y);
+            } else {
+               if (y < 0.0) show_edge_top(x);
+               else if (y > 1.0) show_edge_bottom(x);
+               else {
+                  hide_corners();
+                  hide_edges();
+               }
+            }
+         }
+      }
+   }
+   parts {
+      part { name: "clipper"; type: RECT;
+         description { state: "default" 0.0;
+            color: 255 255 255 0;
+            rel1 { to: "pop"; offset: -5 -5; }
+            rel2 { to: "pop"; offset: 5 5; }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 255;
+         }
+      }
+      part { name: "pop"; mouse_events: 0;
+         clip_to: "clipper";
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 30 30;
+            rel1 {
+               to: "elm.swallow.content";
+               offset: -5 -4;
+            }
+            rel2 {
+               to: "elm.swallow.content";
+               offset: 4 5;
+            }
+            image {
+               normal: "tooltip-base.png";
+               border: 7 7 6 8;
+            }
+            image.middle: SOLID;
+         }
+      }
+      #define TT_CORNER(name_, rx, ry, ax, ay, ox, oy)             \
+      part { name: "corner-"name_; mouse_events: 0;                \
+         clip_to: "clipper";                                       \
+         scale: 1;                                                 \
+         description { state: "default" 0.0;                       \
+            visible: 0;                                            \
+            align: ax ay;                                          \
+            FIXED_SIZE(12, 12)                                     \
+            rel1 {                                                 \
+               relative: rx ry;                                    \
+               offset: ox oy;                                      \
+               to: "pop";                                          \
+            }                                                      \
+            rel2 {                                                 \
+               relative: rx ry;                                    \
+               offset: ox oy;                                      \
+               to: "pop";                                          \
+            }                                                      \
+            image.normal: "tooltip-corner-"name_"-tip.png";        \
+         }                                                         \
+         description { state: "visible" 0.0;                       \
+            inherit: "default" 0.0;                                \
+            visible: 1;                                            \
+         }                                                         \
+      }
+      TT_CORNER("top-left", 0, 0, 0, 0, -4, -5);
+      TT_CORNER("top-right", 1, 0, 1, 0, 3, -5);
+      TT_CORNER("bottom-left", 0, 1, 0, 1, -4, 2);
+      TT_CORNER("bottom-right", 1, 1, 1, 1, 3, 2);
+      #undef TT_CORNER
+
+      #define TT_EDGE_VERT(name_, rx, ax, ox)                      \
+      part { name: "clipper-edge-"name_; type: RECT;               \
+         clip_to: "clipper";                                       \
+         description { state: "default" 0.0;                       \
+            visible: 0;                                            \
+            min: 9 13;                                             \
+            align: ax 0.5;                                         \
+            fixed: 1 1;                                            \
+            rel1 {                                                 \
+               relative: rx 0.0;                                   \
+               offset: ox 0;                                       \
+               to: "elm.swallow.content";                          \
+            }                                                      \
+            rel2 {                                                 \
+               relative: rx 1.0;                                   \
+               offset: ox 0;                                       \
+               to: "elm.swallow.content";                          \
+            }                                                      \
+         }                                                         \
+         description { state: "visible" 0.0;                       \
+            inherit: "default" 0.0;                                \
+            visible: 1;                                            \
+         }                                                         \
+      }                                                            \
+      part { name: "edge-area-"name_; type: RECT; mouse_events: 0; \
+         clip_to: "clipper-edge-"name_;                            \
+         scale: 1;                                                 \
+         description { state: "default" 0.0;                       \
+            color: 0 0 0 0;                                        \
+            min: 9 13;                                             \
+            align: ax 0.5;                                         \
+            fixed: 1 1;                                            \
+            rel1 {                                                 \
+               relative: rx 0.0;                                   \
+               offset: ox 0;                                       \
+               to: "elm.swallow.content";                          \
+            }                                                      \
+            rel2 {                                                 \
+               relative: rx 1.0;                                   \
+               offset: ox 0;                                       \
+               to: "elm.swallow.content";                          \
+            }                                                      \
+         }                                                         \
+      }                                                            \
+      part { name: "edge-drag-"name_; type: RECT; mouse_events: 0; \
+         clip_to: "clipper-edge-"name_;                            \
+         scale: 1;                                                 \
+         dragable {                                                \
+            x: 0 0 0;                                              \
+            y: 1 1 0;                                              \
+            confine: "edge-area-"name_;                            \
+         }                                                         \
+         description { state: "default" 0.0;                       \
+            color: 0 0 0 0;                                        \
+            min: 9 13;                                             \
+            rel1.to: "edge-area-"name_;                            \
+            rel2.to: "edge-area-"name_;                            \
+         }                                                         \
+      }                                                            \
+      part { name: "edge-img-"name_; mouse_events: 0;              \
+         clip_to: "clipper-edge-"name_;                            \
+         description { state: "default" 0.0;                       \
+            FIXED_SIZE(9, 13)                                      \
+            align: ax 0.5;                                         \
+            rel1.to: "edge-drag-"name_;                            \
+            rel2.to: "edge-drag-"name_;                            \
+            image.normal: "tooltip-edge-"name_"-tip.png";          \
+         }                                                         \
+      }
+      TT_EDGE_VERT("left", 0, 1, -3);
+      TT_EDGE_VERT("right", 1, 0, 2);
+      #undef TT_EDGE_VERT
+
+      #define TT_EDGE_HORIZ(name_, ry, ay, oy)                     \
+      part { name: "clipper-edge-"name_; type: RECT;               \
+         clip_to: "clipper";                                       \
+         scale: 1;                                                 \
+         description { state: "default" 0.0;                       \
+            visible: 0;                                            \
+            min: 11 9;                                             \
+            align: 0.5 ay;                                         \
+            fixed: 1 1;                                            \
+            rel1 {                                                 \
+               relative: 0.0 ry;                                   \
+               offset: 0 oy;                                       \
+               to: "elm.swallow.content";                          \
+            }                                                      \
+            rel2 {                                                 \
+               relative: 1.0 ry;                                   \
+               offset: 0 oy;                                       \
+               to: "elm.swallow.content";                          \
+            }                                                      \
+         }                                                         \
+         description { state: "visible" 0.0;                       \
+            inherit: "default" 0.0;                                \
+            visible: 1;                                            \
+         }                                                         \
+      }                                                            \
+      part { name: "edge-area-"name_; type: RECT; mouse_events: 0; \
+         clip_to: "clipper-edge-"name_;                            \
+         scale: 1;                                                 \
+         description { state: "default" 0.0;                       \
+            color: 0 0 0 0;                                        \
+            min: 11 9;                                             \
+            align: 0.5 ay;                                         \
+            fixed: 1 1;                                            \
+            rel1.to: "clipper-edge-"name_;                         \
+            rel2.to: "clipper-edge-"name_;                         \
+         }                                                         \
+      }                                                            \
+      part { name: "edge-drag-"name_; type: RECT; mouse_events: 0; \
+         clip_to: "clipper-edge-"name_;                            \
+         scale: 1;                                                 \
+         dragable {                                                \
+            x: 1 1 0;                                              \
+            y: 0 0 0;                                              \
+            confine: "edge-area-"name_;                            \
+         }                                                         \
+         description { state: "default" 0.0;                       \
+            color: 0 0 0 0;                                        \
+            min: 11 9;                                             \
+            rel1.to: "edge-area-"name_;                            \
+            rel2.to: "edge-area-"name_;                            \
+         }                                                         \
+      }                                                            \
+      part { name: "edge-img-"name_; mouse_events: 0;              \
+         clip_to: "clipper-edge-"name_;                            \
+         scale: 1;                                                 \
+         description { state: "default" 0.0;                       \
+            FIXED_SIZE(11, 9)                                      \
+            align: 0.5 ay;                                         \
+            rel1.to: "edge-drag-"name_;                            \
+            rel2.to: "edge-drag-"name_;                            \
+            image.normal: "tooltip-edge-"name_"-tip.png";          \
+         }                                                         \
+      }
+      TT_EDGE_HORIZ("top", 0, 1, -1);
+      TT_EDGE_HORIZ("bottom", 1, 0, 1);
+      #undef TT_EDGE_HORIZ
+      part { name: "clipper_content"; type: RECT;
+         description { state: "default" 0.0;
+            color: 255 255 255 0;
+            rel1.to: "elm.swallow.content";
+            rel2.to: "elm.swallow.content";
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            color: 255 255 255 255;
+         }
+      }
+      part { name: "elm.swallow.content"; type: SWALLOW;
+         clip_to: "clipper_content";
+         description { state: "default" 0.0;
+            rel1.offset: 10 10;
+            rel2.offset: -11 -11;
+         }
+      }
+      programs {
+         program { name: "show0";
+            signal: "elm,action,show"; source: "elm";
+            action: ACTION_STOP;
+            target: "hide0";
+            target: "hide1";
+            target: "hide2";
+            target: "hide3";
+            after: "show1";
+            after: "show2";
+         }
+         program { name: "show1";
+            action: STATE_SET "visible" 0.0;
+            transition: LINEAR 0.15;
+            target: "clipper";
+         }
+         program { name: "show2";
+            in: 0.1 0.0;
+            action: STATE_SET "visible" 0.0;
+            transition: LINEAR 0.15;
+            target: "clipper_content";
+         }
+         program { name: "hide0";
+            signal: "elm,action,hide"; source: "elm";
+            action: ACTION_STOP;
+            target: "show0";
+            target: "show1";
+            target: "show2";
+            after: "hide1";
+            after: "hide2";
+            after: "hide3";
+         }
+         program { name: "hide1";
+            script {
+               hide_corners();
+               hide_edges();
+            }
+         }
+         program { name: "hide2";
+            action: STATE_SET "default" 0.0;
+            transition: LINEAR 0.1;
+            target: "clipper_content";
+         }
+         program { name: "hide3";
+            in: 0.1 0.0;
+            action: STATE_SET "default" 0.0;
+            transition: LINEAR 0.1;
+            target: "clipper";
+         }
+      }
+   }
+}
+
+group { name: "elm/tooltip/base/transparent";
+   data.item: "pad_x" "10";
+   data.item: "pad_y" "10";
+   data.item: "transparent" "enabled";
+   parts {
+      part { name: "elm.swallow.content"; type: SWALLOW; mouse_events:   0;
+         scale: 1;
+         description { state: "default" 0.0; }
+      }
+   }
+}
+
+///////////////////////////////////////////////////////////////////////////////
diff --git a/m4/efl_attribute.m4 b/m4/efl_attribute.m4
new file mode 100644 (file)
index 0000000..78bff15
--- /dev/null
@@ -0,0 +1,56 @@
+dnl Copyright (C) 2011 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macros for checking if the compiler supports some __attribute__ uses
+
+dnl Usage: EFL_ATTRIBUTE_UNUSED
+dnl call AC_DEFINE for __UNUSED__ if __attribute__((unused)) is available
+
+AC_DEFUN([EFL_ATTRIBUTE_UNUSED],
+[
+AC_MSG_CHECKING([for __attribute__ ((unused))])
+AC_COMPILE_IFELSE(
+   [AC_LANG_PROGRAM(
+       [[
+void foo(int x __attribute__ ((unused))) {}
+       ]],
+       [[
+       ]])],
+   [have_attribute_unused="yes"],
+   [have_attribute_unused="no"])
+AC_MSG_RESULT([${have_attribute_unused}])
+
+if test "x${have_attribute_unused}" = "xyes" ; then
+   AC_DEFINE([__UNUSED__], [__attribute__ ((unused))], [Macro declaring a function argument to be unused.])
+else
+   AC_DEFINE([__UNUSED__], [], [__attribute__ ((unused)) is not supported.])
+fi
+])
+
+dnl Usage: EFL_ATTRIBUTE_VECTOR
+dnl call AC_DEFINE for HAVE_GCC_ATTRIBUTE_VECTOR if __attribute__((vector)) is available
+
+AC_DEFUN([EFL_ATTRIBUTE_VECTOR],
+[
+AC_MSG_CHECKING([for __attribute__ ((vector))])
+AC_COMPILE_IFELSE(
+   [AC_LANG_PROGRAM(
+       [[
+typedef int v4si __attribute__ ((vector_size (16)));
+       ]],
+       [[
+if (sizeof(v4si) == 16)
+  return 0;
+else
+  return -1;
+       ]])],
+   [have_attribute_vector="yes"],
+   [have_attribute_vector="no"])
+AC_MSG_RESULT([${have_attribute_vector}])
+
+if test "x${have_attribute_vector}" = "xyes" ; then
+   AC_DEFINE([HAVE_GCC_ATTRIBUTE_VECTOR], [1], [Define to 1 if your compiler supports __attribute__ ((vector)).])
+fi
+])
+
+dnl End of efl_attribute.m4
diff --git a/m4/efl_beta.m4 b/m4/efl_beta.m4
new file mode 100644 (file)
index 0000000..c804729
--- /dev/null
@@ -0,0 +1,5 @@
+dnl use: EFL_ENABLE_BETA_API_SUPPORT
+AC_DEFUN([EFL_ENABLE_BETA_API_SUPPORT],
+[
+  AC_DEFINE([EFL_BETA_API_SUPPORT], [1], [Enable access to unstable EFL API that are still in beta])
+])
diff --git a/m4/efl_binary.m4 b/m4/efl_binary.m4
new file mode 100644 (file)
index 0000000..c774688
--- /dev/null
@@ -0,0 +1,71 @@
+dnl Copyright (C) 2010 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that check if a binary is built or not
+
+dnl Usage: EFL_ENABLE_BIN(binary)
+dnl Call AC_SUBST(BINARY_PRG) (BINARY is the uppercase of binary, - being transformed into _)
+dnl Define have_binary (- is transformed into _)
+dnl Define conditional BUILD_BINARY (BINARY is the uppercase of binary, - being transformed into _)
+
+AC_DEFUN([EFL_ENABLE_BIN],
+[
+
+m4_pushdef([UP], m4_translit([[$1]], [-a-z], [_A-Z]))dnl
+m4_pushdef([DOWN], m4_translit([[$1]], [-A-Z], [_a-z]))dnl
+
+have_[]m4_defn([DOWN])="yes"
+
+dnl configure option
+
+AC_ARG_ENABLE([$1],
+   [AC_HELP_STRING([--disable-$1], [disable building of ]DOWN)],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       have_[]m4_defn([DOWN])="yes"
+    else
+       have_[]m4_defn([DOWN])="no"
+    fi
+   ])
+
+AC_MSG_CHECKING([whether to build ]DOWN[ binary])
+AC_MSG_RESULT([$have_[]m4_defn([DOWN])])
+
+if test "x$have_[]m4_defn([DOWN])" = "xyes"; then
+   UP[]_PRG=DOWN[${EXEEXT}]
+fi
+
+AC_SUBST(UP[]_PRG)
+
+AM_CONDITIONAL(BUILD_[]UP, test "x$have_[]m4_defn([DOWN])" = "xyes")
+
+AS_IF([test "x$have_[]m4_defn([DOWN])" = "xyes"], [$2], [$3])
+
+])
+
+
+dnl Macro that check if a binary is built or not
+
+dnl Usage: EFL_WITH_BIN(package, binary, default_value)
+dnl Call AC_SUBST(_binary) (_binary is the lowercase of binary, - being transformed into _ by default, or the value set by the user)
+
+AC_DEFUN([EFL_WITH_BIN],
+[
+
+m4_pushdef([DOWN], m4_translit([[$2]], [-A-Z], [_a-z]))dnl
+
+dnl configure option
+
+AC_ARG_WITH([$2],
+   [AC_HELP_STRING([--with-$2=PATH], [specify a specific path to ]DOWN[ @<:@default=$3@:>@])],
+   [_efl_with_binary=${withval}],
+   [_efl_with_binary=$(pkg-config --variable=prefix $1)/bin/$3])
+
+DOWN=${_efl_with_binary}
+AC_MSG_NOTICE(DOWN[ set to ${_efl_with_binary}])
+
+with_binary_[]m4_defn([DOWN])=${_efl_with_binary}
+
+AC_SUBST(DOWN)
+
+])
diff --git a/m4/efl_eo.m4 b/m4/efl_eo.m4
new file mode 100644 (file)
index 0000000..1fee0bf
--- /dev/null
@@ -0,0 +1,12 @@
+dnl use: EFL_ENABLE_EO_API_SUPPORT
+AC_DEFUN([EFL_ENABLE_EO_API_SUPPORT],
+[
+  AC_DEFINE([EFL_EO_API_SUPPORT], [1], [Enable access to unstable EFL Eo API])
+])
+
+AC_DEFUN([EFL_ENABLE_EO_LATEST],
+[
+  AC_DEFINE([EO_LATEST], [0], [Enable access to unstable EFL Eo Latest API])
+])
+
+
diff --git a/m4/elm_quicklaunch.m4 b/m4/elm_quicklaunch.m4
new file mode 100644 (file)
index 0000000..3db9945
--- /dev/null
@@ -0,0 +1,24 @@
+dnl Copyright (C) 2013 Cedric Bail <cedric dot bail at samsung dot com>
+dnl That code is public domain and can be freely used or copied
+
+dnl Macro that check if -pie -rdynamic can be given to ld
+
+dnl Usage: ELM_QUICKLAUNCH
+dnl add -pie -rdynamic to LDFLAGS and -fpie to CFLAGS
+
+AC_DEFUN([ELM_QUICKLAUNCH],
+[
+AC_MSG_CHECKING([If the compiler as what it takes to do quicklaunch (-pie -rdynamic)])
+old_LDFLAGS="$LDFLAGS"
+old_CFLAGS="$CFLAGS"
+
+LDFLAGS="$LDFLAGS -pie -rdynamic"
+CFLAGS="$CFLAGS -fpie"
+
+AC_LINK_IFELSE([AC_LANG_SOURCE([int main(){}])],
+        [AC_MSG_RESULT([yes])],
+        [LDFLAGS="$old_LDFLAGS"
+       CFLAGS="$old_CFLAGS"
+        AC_MSG_RESULT([no])
+        ])
+])
diff --git a/macos-64_pkg/bin/enventor b/macos-64_pkg/bin/enventor
new file mode 100755 (executable)
index 0000000..b24f117
Binary files /dev/null and b/macos-64_pkg/bin/enventor differ
diff --git a/macos-64_pkg/macos-64_pkg.tar.gz b/macos-64_pkg/macos-64_pkg.tar.gz
new file mode 100644 (file)
index 0000000..80fd313
Binary files /dev/null and b/macos-64_pkg/macos-64_pkg.tar.gz differ
diff --git a/package/build.linux b/package/build.linux
new file mode 100755 (executable)
index 0000000..fed8857
--- /dev/null
@@ -0,0 +1,107 @@
+#!/bin/bash -x
+
+# checking dependency package
+DEPENDENT_PKGS="libtool autopoint subversion zlib1g-dev libjpeg-dev libxrender-dev libfontconfig1-dev libfreetype6-dev libfribidi-dev libxext-dev libpng12-dev libgif-dev gettext libglib2.0-dev libxcursor-dev libxinerama-dev libxrandr-dev libxcomposite-dev libxdamage-dev libxtst-dev liblua5.1-0-dev libpulse-dev automake libsndfile1-dev"
+#libcurl4-openssl-dev
+
+PACKAGE_NAME="enventor"
+INSTALL_DIR=${SRCDIR}/package/${PACKAGE_NAME}.package.${TARGET_OS}/data/tools/edc-editor
+
+EFL_TOOLS_BUILD_DIR=${ROOTDIR}/tools/efl-tools-build
+
+# clean
+clean()
+{
+       echo "=========================================CLEAN============================================"
+
+       rm -rf ${SRCDIR}/*.zip
+
+       if [ -d ${INSTALL_DIR} ]
+       then
+               rm -rf ${INSTALL_DIR}/*
+       fi
+
+       if [ -f ${SRCDIR}/Makefile ]
+       then
+               cd ${SRCDIR}
+               make clean
+       fi
+}
+
+# build
+build() 
+{
+       echo "=========================================BUILD============================================"
+
+       if [ ${TARGET_OS} = "ubuntu-32" ] || [ ${TARGET_OS} = "ubuntu-64" ]
+       then
+               # check dependent packages
+               echo "[Checking ${DEPENDENT_PKGS}]"
+               for pkg in ${DEPENDENT_PKGS}
+               do
+                       dpkg -s ${pkg} > /dev/null
+                       if [ "x$?" = "x0" ]
+                       then
+                               echo "[checking ${pkg}.. ok]"
+                       else
+                               echo "[checking ${pkg}.. failed]"
+                               exit 1
+                       fi
+               done
+
+               # export environment variables
+               export PATH=${EFL_TOOLS_BUILD_DIR}/bin:${PATH}
+               export LD_LIBRARY_PATH=${EFL_TOOLS_BUILD_DIR}/lib
+               export PKG_CONFIG_PATH=${EFL_TOOLS_BUILD_DIR}/lib/pkgconfig:${PKG_CONFIG_PATH}
+
+               WITH_EET_EET="--with-eet-eet=${EFL_TOOLS_BUILD_DIR}/bin/eet"
+               WITH_EDJE_CC="--with-edje-cc=${EFL_TOOLS_BUILD_DIR}/bin/edje_cc"
+               WITH_EOLIAN_GEN="--with-eolian-gen=${EFL_TOOLS_BUILD_DIR}/bin/eolian_gen"
+
+               # autogen.sh
+               ${SRCDIR}/autogen.sh --prefix=${INSTALL_DIR} ${WITH_EET_EET} ${WITH_EDJE_CC} ${WITH_EOLIAN_GEN} --disable-static
+
+               # make
+               if [ -f ${SRCDIR}/Makefile ]
+               then
+                       cd ${SRCDIR}
+                       make -j6
+               fi
+       else
+               echo "${TARGET_OS} is not supported."
+       fi
+}
+
+# install
+install()
+{
+       echo "=========================================INSTALL============================================"
+
+       # create install dir
+       if ! [ -d ${INSTALL_DIR} ]
+       then
+               mkdir -p ${INSTALL_DIR}
+       fi
+
+       if [ ${TARGET_OS} = "ubuntu-32" ] || [ ${TARGET_OS} = "ubuntu-64" ]
+       then
+               # export environment variables
+               # build() and install() are executed by separate threads
+               export PATH=${EFL_TOOLS_BUILD_DIR}/bin:${PATH}
+               export LD_LIBRARY_PATH=${EFL_TOOLS_BUILD_DIR}/lib
+
+               # make install
+               cd ${SRCDIR}
+               make install prefix=${INSTALL_DIR}
+
+               # remove .la files which contain library paths of build machine
+               cd ${INSTALL_DIR}/lib
+               LA_FILES=`find . -name "*.la"`
+               for LA_FILE in ${LA_FILES}
+               do
+                       rm -f ${LA_FILE}
+               done
+       else
+               echo "${TARGET_OS} is not supported."
+       fi
+}
diff --git a/package/build.macos b/package/build.macos
new file mode 100755 (executable)
index 0000000..3f03aba
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/bash -x
+
+PACKAGE_NAME="enventor"
+INSTALL_DIR=${SRCDIR}/package/${PACKAGE_NAME}.package.${TARGET_OS}/data/tools/edc-editor
+
+# clean
+clean()
+{
+       echo "=========================================CLEAN============================================"
+
+       rm -rf ${SRCDIR}/*.zip
+
+       if [ -d ${INSTALL_DIR} ]
+       then
+               rm -rf ${INSTALL_DIR}/*
+       fi
+}
+
+# build
+build() 
+{
+       echo "=========================================BUILD============================================"
+}
+
+# install
+install()
+{
+       echo "=========================================INSTALL============================================"
+
+       # create install dir
+       if ! [ -d ${INSTALL_DIR} ]
+       then
+               mkdir -p ${INSTALL_DIR}
+       fi
+
+       PKG_SRC_DIR="${SRCDIR}/${TARGET_OS}_pkg"
+       PKG_SRC_FILE="${TARGET_OS}_pkg.tar.gz"
+       cp -f ${PKG_SRC_DIR}/${PKG_SRC_FILE} ${INSTALL_DIR}
+       cd ${INSTALL_DIR}
+       tar -xvf ./${PKG_SRC_FILE}
+       rm ./${PKG_SRC_FILE}
+
+       chmod 777 ${INSTALL_DIR}/bin/enventor
+
+       # remove .la files which contain library paths of build machine
+       cd ${INSTALL_DIR}/lib
+       LA_FILES=`find . -name "*.la"`
+       for LA_FILE in ${LA_FILES}
+       do
+               rm -f ${LA_FILE}
+       done
+}
diff --git a/package/build.windows b/package/build.windows
new file mode 100755 (executable)
index 0000000..8af28b0
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/bash -x
+
+PACKAGE_NAME="enventor"
+INSTALL_DIR=${SRCDIR}/package/${PACKAGE_NAME}.package.${TARGET_OS}/data/tools/edc-editor
+
+# clean
+clean()
+{
+       echo "=========================================CLEAN============================================"
+
+       rm -rf ${SRCDIR}/*.zip
+
+       if [ -d ${INSTALL_DIR} ]
+       then
+               rm -rf ${INSTALL_DIR}/*
+       fi
+}
+
+# build
+build() 
+{
+       echo "=========================================BUILD============================================"
+}
+
+# install
+install()
+{
+       echo "=========================================INSTALL============================================"
+
+       # create install dir
+       if ! [ -d ${INSTALL_DIR} ]
+       then
+               mkdir -p ${INSTALL_DIR}
+       fi
+
+       PKG_SRC_DIR="${SRCDIR}/${TARGET_OS}_pkg"
+       PKG_SRC_FILE="${TARGET_OS}_pkg.tar.gz"
+       cp -f ${PKG_SRC_DIR}/${PKG_SRC_FILE} ${INSTALL_DIR}
+       cd ${INSTALL_DIR}
+       tar -xvf ./${PKG_SRC_FILE}
+       rm ./${PKG_SRC_FILE}
+
+       chmod 777 ${INSTALL_DIR}/bin/enventor.exe
+
+       # remove .la files which contain library paths of build machine
+       cd ${INSTALL_DIR}/lib
+       LA_FILES=`find . -name "*.la"`
+       for LA_FILE in ${LA_FILES}
+       do
+               rm -f ${LA_FILE}
+       done
+}
diff --git a/package/changelog b/package/changelog
new file mode 100644 (file)
index 0000000..a4004ef
--- /dev/null
@@ -0,0 +1,408 @@
+* 0.8.49
+- Support default autocomp and template
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2017-05-31
+* 0.8.48
+- Version up
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2017-05-12
+* 0.8.47
+- Fix to set font style by default
+* 0.8.46
+- Remove Map template for Tizen 2.3.x temporarily
+- Fix to support "not lazy EDC" styles
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2017-04-10
+* 0.8.45
+- Fix edje_cc's library path
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2017-04-05
+* 0.8.44
+- Apply blank focus highlight in setting.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2017-03-29
+* 0.8.43
+- Update binary for Windows/MacOS.
+- preference_setting: Modify description for auto indentation.
+- enventor_smart: Fix crash when focused item does not exist.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-12-02
+* 0.8.42
+- Fix not to append candidate slider values after error code.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-11-25
+* 0.8.41
+- Update binary for Windows/MacOS.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-11-11
+* 0.8.40
+- Update binary for windows.
+- Fix broken images.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-11-11
+* 0.8.39
+- Update binary for macos.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-11-10
+* 0.8.38
+- Fix an incorrect API usage.
+- Update binary for windows.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-11-10
+* 0.8.37
+- Fix typos.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-11-08
+* 0.8.36
+- Fix typo in Enventor introduction.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-10-26
+* 0.8.35
+- Update binary for MacOS.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-10-24
+* 0.8.34
+- Update binary for Windows.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-10-24
+* 0.8.33
+- Update binary for Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-10-17
+* 0.8.32
+- Update binary for Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-09-29
+* 0.8.31
+- Update binary for MacOS.
+== Thiep Ha <thiep.ha@samsung.com> 2016-09-31
+* 0.8.30
+- Update binary for Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-09-29
+* 0.8.29
+- Update binary for MacOS.
+== Thiep Ha <thiep.ha@samsung.com> 2016-09-29
+* 0.8.28
+- Update binary for Windows.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-09-21
+* 0.8.27
+- Update binary for Windows / MacOS.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-08-26
+* 0.8.26
+- Disable lock on MacOS.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-08-26
+* 0.8.25
+- Update binary for Windows.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-08-26
+* 0.8.24
+- Update binary for MacOS.
+== Thiep Ha <thiep.ha@samsung.com> 2016-08-23
+* 0.8.23
+- Update binary for Windows.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-08-23
+* 0.8.22
+- Update binary for MacOS
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-08-16
+* 0.8.21
+- Update binary for windows.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-08-16
+* 0.8.20
+- Update binary for windows.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-08-11
+* 0.8.19
+- Update binary for Windows and MacOS.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-08-03
+* 0.8.18
+- Update binary for Windows and MacOS.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-08-03
+* 0.8.17
+- Update binary for Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-08-03
+* 0.8.16
+- Update binary.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-07-29
+* 0.8.15
+- Update binary for Windows.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-07-28
+* 0.8.14
+- Update binary for Windows.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-07-21
+* 0.8.13
+- Installation rerouting.
+- enventor -> edc-editor.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-07-18
+* 0.8.12
+- Update enventor on MacOS
+- Apply efl version up.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-07-12
+* 0.8.11
+- Update enventor on Windows
+- Apply efl version up.
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-07-12
+* 0.8.10
+- Update enventor on Windows/MacOS
+- Apply tizen ux
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-06-24
+* 0.8.9
+- Update enventor on Win32/Win64
+- Apply tizen ux
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-05-30
+* 0.8.8
+- Update enventor on Win32/Win64
+- Apply tizen ux
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-05-26
+* 0.8.7
+- Fix double click issue on Windows OS
+== Bowon Ryu <bowon.ryu@samsung.com> 2016-05-20
+* 0.8.6
+- Support autocomp function in Tizen 3.0.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-05-11
+* 0.8.5
+- Fix cursor position error temporarily.
+- Apply bug fixes from upstream.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-04-27
+* 0.8.4
+- Check if edj file is finished.
+- Update dummy part when removing all source code.
+- Insert 0.0 after candidate state name.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-03-24
+* 0.8.3
+- Enable goto and search on MacOS.
+- Support candidate list for part type.
+- Change the min size of icon text style to zero.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-03-23
+* 0.8.2
+- Update enventor on Win32 and Win64.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-03-22
+* 0.8.1
+- Update enventor on Win32 and Win64.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-03-18
+* 0.8.0
+- Support enventor on MacOS.
+- Migrate to upstream v0.8.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-03-18
+* 0.6.5
+- Fix panes style for Windows
+- Add back button on about menu screen
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-02-19
+* 0.6.4
+- Revert temporary copy&paste feature
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-01-27
+* 0.6.3
+- Support to use macro as a group name.
+- Fix to support edje_cc path set for Windows and MacOS.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-01-22
+* 0.6.2
+- Update enventor package on win32 and win64.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-01-21
+* 0.6.1
+- Support auto complete eet path set function.
+- Support edje_cc path set function.
+- Fix to remove and replace unsupported keywords in EDC.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-01-21
+* 0.6.0
+- Initialize package version depending on base upstream enventor.
+- Change tool type of Enventor from platform to SDK.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2016-01-20
+* 0.0.73
+- Remove unnecessary package dependency.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-12-28
+* 0.0.72
+- Remove unnecessary package dependency.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-12-28
+* 0.0.71
+- Remove enventor-eplugin from enventor package.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-12-01
+* 0.0.70
+- Export paths in install() of build script.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-11-25
+* 0.0.69
+- Use remove script to remove all the generated files.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-11-23
+* 0.0.68
+- Fix to open default text editor if enventor is not supported.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-11-13
+* 0.0.67
+- Make edc plugin cover all Tizen versions.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-11-09
+* 0.0.66
+- Fix crash of comparing font name and style.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-11-03
+* 0.0.65
+- Fix that enventor becomes no response status on Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-10-16
+* 0.0.64
+- Recompress enventor package on win32 and win64.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-10-02
+* 0.0.63
+- Fix not to create a new edj file unless edc is changed on Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-10-02
+* 0.0.62
+- Change maintainer information.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-10-02
+* 0.0.61
+- Update enventor package on win32 and win64.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-25
+* 0.0.60
+- Fix to enable redo and undo functions on Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-25
+* 0.0.59
+- Create temporary solution for CnP feature in WIN32.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-25
+* 0.0.58
+- Disable error message when executing command for Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-23
+* 0.0.57
+- Add error log for debugging.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-23
+* 0.0.56
+- Update enventor package on win32 and win64.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-22
+* 0.0.55
+- Fix to update preview by live edit and save button on Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-21
+* 0.0.54
+- Apply edje build options per edc file.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-15
+* 0.0.53
+- Remove error message temporarily for Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-11
+* 0.0.52
+- Add "&&" to execute enventor.exe with "set path" on Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-11
+* 0.0.51
+- Add error log for debugging.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-10
+* 0.0.50
+- Fix string format.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-10
+* 0.0.49
+- Append .exe to enventor executable file on Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-10
+* 0.0.48
+- Change package name to 2.4-enventor.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-08
+* 0.0.47
+- Update enventor.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-08
+* 0.0.46
+- Support Enventor on Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-01
+* 0.0.45
+- Fix font path and sound path enventor options.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-01
+* 0.0.44
+- Fix build error with input_path and edc_path.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-09-01
+* 0.0.43
+- Support Enventor on Windows.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-08-31
+* 0.0.42
+- Change image file names.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-08-12
+* 0.0.41
+- Support multi resource paths.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-08-07
+* 0.0.40
+- Set default engine with "software_x11".
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-07-27
+* 0.0.39
+- Fix to hide ctxpopup when background is clicked.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-07-24
+* 0.0.38
+- Change install path to "platforms/tizen-2.4/common/efl-tool".
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-07-21
+* 0.0.37
+- Fix to generate Makefile in /themes/elm and /themes/elm/images.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-07-21
+* 0.0.36
+- Change install path to "platforms/tizen-2.4/common/efl-tool".
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-07-21
+* 0.0.35
+- Synchronize upstream enventor v0.6.0 and Apply Tizen enventor UX.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-07-21
+* 0.0.34
+- Set build prefix and replace build prefix after install.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-05-22
+* 0.0.33
+- Change build options including deletion of .la files.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-05-22
+* 0.0.32
+- Synchronize with upstream enventor.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-05-21
+* 0.0.31
+- Initial commit for Tizen 2.4 from enventor v0.5.0.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2015-03-20
+* 0.0.30
+- Change entry cursor to BEFORE cursor mode.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-12-10
+* 0.0.29
+- Support auto_comp and color for keywords in item.
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-12-01
+* 0.0.28
+- Apply recent efl-tools and efl-tools-build
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-11-19
+* 0.0.27
+- Fix to prevent crash when style font is not defined by applying modified evas
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-11-19
+* 0.0.26
+- Fix to replace candidate keyword correctly
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-11-18
+* 0.0.25
+- Set software_x11 default engine and Fix short cut keys
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-11-17
+* 0.0.24
+- Fix to enable redo/undo when using Live Edit
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-11-07
+* 0.0.23
+- Fix to show goto line region correctly
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-11-06
+* 0.0.22
+- Change template image file names and fix bugs
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-11-05
+* 0.0.21
+- Support that an edc is opened by different processes
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-11-04
+* 0.0.20
+- Set "fixed: 1 1;" to fix selection block performance problem
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-11-04
+* 0.0.19
+- Added to pass options to Enventor
+== gune.kim <gune.kim@samsung.com> 2014-11-03
+* 0.0.18
+- Show toolbar as default and Increase default font scale
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-10-29
+* 0.0.17
+- Fix to clear selection when find window is moved or closed
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-10-28
+* 0.0.16
+- Fix layout auto_comp format
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-10-23
+* 0.0.15
+- Fix console bug and Support auto_comp for more keywords
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-10-23
+* 0.0.14
+- Modified EDC file wizard's icon
+== gune.kim <gune.kim@samsung.com> 2014-10-21
+* 0.0.13
+- Migrated from nativecore-ext-eplugin to this git
+== gune.kim <gune.kim@samsung.com> 2014-10-20
+* 0.0.12
+- Apply recent efl-tools and efl-tools-build to fix entry selection bug
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-10-17
+* 0.0.11
+- Add argument "-to" to open a new file with templates
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-10-14
+* 0.0.10
+- Apply LiveEdit new UX and upstream patches
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-10-10
+* 0.0.9
+- Build based on recent efl-tools
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-09-19
+* 0.0.8
+- Build based on recent efl-tools
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-09-19
+* 0.0.7
+- Add build dependent package, efl-tools-build
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-09-19
+* 0.0.6
+- Fix LD_LIBRARY_PATH variable
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-09-19
+* 0.0.5
+- Set PATH and LD_LIBRARY_PATH after installation
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-09-19
+* 0.0.4
+- Build based on recent efl-tools
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-09-19
+* 0.0.3
+- Set path, ld_library_path and pkg_config_path
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-09-15
+* 0.0.2
+- Check dependent packages
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-09-12
+* 0.0.1
+- Initial commit
+== Jaehyun Cho <jae_hyun.cho@samsung.com> 2014-08-01
diff --git a/package/enventor.install.linux b/package/enventor.install.linux
new file mode 100755 (executable)
index 0000000..ae14dba
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/sh -xe
+
+echo $INSTALLED_PATH > "/tmp/tizen_installed_path"
+MODIFIED_INSTALLED_PATH=$(sed "s/\//\\\\\//g" "/tmp/tizen_installed_path")
+rm -rf "/tmp/tizen_installed_path"
+
+echo "================================================================================"
+echo "Set prefix value of Enventor pkg config files. INSTALLED_PATH is $INSTALLED_PATH"
+echo "================================================================================"
+if [ -d "${INSTALLED_PATH}/tools/edc-editor/lib/pkgconfig" ]; then
+    cd "${INSTALLED_PATH}/tools/edc-editor/lib/pkgconfig"
+    for I in `ls *.pc`
+    do
+        sed -i /^"prefix="/d $I
+        sed -i "s/^exec_prefix=/prefix=$MODIFIED_INSTALLED_PATH\/tools\/edc-editor\nexec_prefix=/" $I
+        sed -i /^"prefix ="/d $I
+        sed -i "s/^exec_prefix =/prefix = $MODIFIED_INSTALLED_PATH\/tools\/edc-editor\nexec_prefix =/" $I
+    done
+fi
+
+rm -rf "${HOME}/.config/enventor"
diff --git a/package/enventor.install.macos b/package/enventor.install.macos
new file mode 100755 (executable)
index 0000000..5fa9b6f
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh -xe
+
+if [ -d "${HOME}/.config/enventor" ]; then
+    rm -rf "${HOME}/.config/enventor"
+fi
diff --git a/package/enventor.install.windows b/package/enventor.install.windows
new file mode 100755 (executable)
index 0000000..60a146d
--- /dev/null
@@ -0,0 +1,2 @@
+@echo off
+if exist "%HOMEPATH%\.config\enventor" ( rd /s /q "%HOMEPATH%\.config\enventor" )
diff --git a/package/enventor.remove.linux b/package/enventor.remove.linux
new file mode 100755 (executable)
index 0000000..f008c15
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+DISTRIBUTION_DIR="tools/edc-editor"
+rm -rf "${INSTALLED_PATH}/${DISTRIBUTION_DIR}"
diff --git a/package/enventor.remove.macos b/package/enventor.remove.macos
new file mode 100755 (executable)
index 0000000..f008c15
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+DISTRIBUTION_DIR="tools/edc-editor"
+rm -rf "${INSTALLED_PATH}/${DISTRIBUTION_DIR}"
diff --git a/package/enventor.remove.windows b/package/enventor.remove.windows
new file mode 100755 (executable)
index 0000000..70646d8
--- /dev/null
@@ -0,0 +1,4 @@
+@echo off
+
+set DISTRIBUTION_DIR=tools\edc-editor
+if exist "%INSTALLED_PATH%\%DISTRIBUTION_DIR%" ( rd /s /q "%INSTALLED_PATH%\%DISTRIBUTION_DIR%" )
diff --git a/package/pkginfo.manifest b/package/pkginfo.manifest
new file mode 100644 (file)
index 0000000..d2c2b62
--- /dev/null
@@ -0,0 +1,43 @@
+Source : enventor
+Version : 0.8.49
+Maintainer : Jaehyun Cho <jae_hyun.cho@samsung.com>
+
+Package : enventor
+OS : ubuntu-32
+Build-host-os : ubuntu-32
+Build-dependency : efl-tools-build [ubuntu-32]
+Install-dependency : efl-tools [ubuntu-32]
+Conflicts : 2.3-enventor, 2.3.1-enventor, 2.3.2-enventor, 2.4-enventor
+Description : The dynamic EDC editor to write your layout fast and easy
+
+Package : enventor
+OS : ubuntu-64
+Build-host-os : ubuntu-64
+Build-dependency : efl-tools-build [ubuntu-64]
+Install-dependency : efl-tools [ubuntu-64]
+Conflicts : 2.3-enventor, 2.3.1-enventor, 2.3.2-enventor, 2.4-enventor
+Description : The dynamic EDC editor to write your layout fast and easy
+
+Package : enventor
+OS : windows-32
+Build-host-os : windows-32
+Build-dependency : efl-tools-build [windows-32]
+Install-dependency : efl-tools [windows-32]
+Conflicts : 2.3-enventor, 2.3.1-enventor, 2.3.2-enventor, 2.4-enventor
+Description : The dynamic EDC editor to write your layout fast and easy
+
+Package : enventor
+OS : windows-64
+Build-host-os : windows-64
+Build-dependency : efl-tools-build [windows-64]
+Install-dependency : efl-tools [windows-64]
+Conflicts : 2.3-enventor, 2.3.1-enventor, 2.3.2-enventor, 2.4-enventor
+Description : The dynamic EDC editor to write your layout fast and easy
+
+Package : enventor
+OS : macos-64
+Build-host-os : macos-64
+Build-dependency : efl-tools-build [macos-64]
+Install-dependency : efl-tools [macos-64]
+Conflicts : 2.3-enventor, 2.3.1-enventor, 2.3.2-enventor, 2.4-enventor
+Description : The dynamic EDC editor to write your layout fast and easy
diff --git a/pc/enventor.pc.in b/pc/enventor.pc.in
new file mode 100644 (file)
index 0000000..8f43637
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: enventor
+Description: dynamic edc editor to write your layout fast and easy.
+Requires.private:@requirement_enventor@
+Version: @VERSION@
+Libs: -L${libdir} -lenventor
+Cflags: -I${includedir}/enventor-@ENVENTOR_VERSION_MAJOR@
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644 (file)
index 0000000..6409b02
--- /dev/null
@@ -0,0 +1 @@
+en ru
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644 (file)
index 0000000..83d8838
--- /dev/null
@@ -0,0 +1,444 @@
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file can be copied and used freely without restrictions.  It can
+# be used in projects which are not available under the GNU General Public
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# Please note that the actual code of GNU gettext is covered by the GNU
+# General Public License and is *not* in the public domain.
+#
+# Origin: gettext-0.18
+GETTEXT_MACRO_VERSION = 0.18
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+localedir = @localedir@
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+# We use $(mkdir_p).
+# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
+# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
+# @install_sh@ does not start with $(SHELL), so we add it.
+# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
+# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
+# versions, $(mkinstalldirs) and $(install_sh) are unused.
+mkinstalldirs = $(SHELL) @install_sh@ -d
+install_sh = $(SHELL) @install_sh@
+MKDIR_P = @MKDIR_P@
+mkdir_p = @mkdir_p@
+
+GMSGFMT_ = @GMSGFMT@
+GMSGFMT_no = @GMSGFMT@
+GMSGFMT_yes = @GMSGFMT_015@
+GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
+MSGFMT_ = @MSGFMT@
+MSGFMT_no = @MSGFMT@
+MSGFMT_yes = @MSGFMT_015@
+MSGFMT = $(MSGFMT_$(USE_MSGCTXT))
+XGETTEXT_ = @XGETTEXT@
+XGETTEXT_no = @XGETTEXT@
+XGETTEXT_yes = @XGETTEXT_015@
+XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+
+# Makevars gets inserted here. (Don't remove this line!)
+
+.SUFFIXES:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
+
+.po.mo:
+       @echo "$(MSGFMT) -c -o $@ $<"; \
+       $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+       @lang=`echo $* | sed -e 's,.*/,,'`; \
+       test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+       echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \
+       cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+
+.sin.sed:
+       sed -e '/^#/d' $< > t-$@
+       mv t-$@ $@
+
+
+all: check-macro-version all-@USE_NLS@
+
+all-yes: stamp-po
+all-no:
+
+# Ensure that the gettext macros and this Makefile.in.in are in sync.
+check-macro-version:
+       @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
+         || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
+              exit 1; \
+            }
+
+# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
+# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
+# we don't want to bother translators with empty POT files). We assume that
+# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
+# In this case, stamp-po is a nop (i.e. a phony target).
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(POFILES) has been designed to not touch files that don't need to be
+# changed.
+stamp-po: $(srcdir)/$(DOMAIN).pot
+       test ! -f $(srcdir)/$(DOMAIN).pot || \
+         test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
+       @test ! -f $(srcdir)/$(DOMAIN).pot || { \
+         echo "touch stamp-po" && \
+         echo timestamp > stamp-poT && \
+         mv stamp-poT stamp-po; \
+       }
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
+# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+       if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \
+         package_gnu='GNU '; \
+       else \
+         package_gnu=''; \
+       fi; \
+       if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
+         msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
+       else \
+         msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
+       fi; \
+       case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+         '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
+           $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+             --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+             --files-from=$(srcdir)/POTFILES.in \
+             --copyright-holder='$(COPYRIGHT_HOLDER)' \
+             --msgid-bugs-address="$$msgid_bugs_address" \
+           ;; \
+         *) \
+           $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+             --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+             --files-from=$(srcdir)/POTFILES.in \
+             --copyright-holder='$(COPYRIGHT_HOLDER)' \
+             --package-name="$${package_gnu}@PACKAGE@" \
+             --package-version='@VERSION@' \
+             --msgid-bugs-address="$$msgid_bugs_address" \
+           ;; \
+       esac
+       test ! -f $(DOMAIN).po || { \
+         if test -f $(srcdir)/$(DOMAIN).pot; then \
+           sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+           sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+           if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+             rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+           else \
+             rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+             mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+           fi; \
+         else \
+           mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+         fi; \
+       }
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+       $(MAKE) $(DOMAIN).pot-update
+
+# This target rebuilds a PO file if $(DOMAIN).pot has changed.
+# Note that a PO file is not touched if it doesn't need to be changed.
+$(POFILES): $(srcdir)/$(DOMAIN).pot
+       @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
+       if test -f "$(srcdir)/$${lang}.po"; then \
+         test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+         echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \
+         cd $(srcdir) \
+           && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+                  '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+                    $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \
+                  *) \
+                    $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \
+                esac; \
+              }; \
+       else \
+         $(MAKE) $${lang}.po-create; \
+       fi
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+         for file in $(DISTFILES.common) Makevars.template; do \
+           $(INSTALL_DATA) $(srcdir)/$$file \
+                           $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+         for file in Makevars; do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
+       fi
+install-data-no: all
+install-data-yes: all
+       @catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         cat=`basename $$cat`; \
+         lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+         dir=$(localedir)/$$lang/LC_MESSAGES; \
+         $(mkdir_p) $(DESTDIR)$$dir; \
+         if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+         $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+         echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+         for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+           if test -n "$$lc"; then \
+             if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+               link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+               mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+               mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+                for file in *; do \
+                  if test -f $$file; then \
+                    ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+                  fi; \
+                done); \
+               rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+             else \
+               if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+                 :; \
+               else \
+                 rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+                 mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               fi; \
+             fi; \
+             rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+             ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+             ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+             cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+             echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+           fi; \
+         done; \
+       done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data-@USE_NLS@
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+       else \
+         : ; \
+       fi
+installdirs-data-no:
+installdirs-data-yes:
+       @catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         cat=`basename $$cat`; \
+         lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+         dir=$(localedir)/$$lang/LC_MESSAGES; \
+         $(mkdir_p) $(DESTDIR)$$dir; \
+         for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+           if test -n "$$lc"; then \
+             if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+               link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+               mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+               mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+                for file in *; do \
+                  if test -f $$file; then \
+                    ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+                  fi; \
+                done); \
+               rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+             else \
+               if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+                 :; \
+               else \
+                 rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+                 mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               fi; \
+             fi; \
+           fi; \
+         done; \
+       done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data-@USE_NLS@
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         for file in $(DISTFILES.common) Makevars.template; do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
+       fi
+uninstall-data-no:
+uninstall-data-yes:
+       catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         cat=`basename $$cat`; \
+         lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+         for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+           rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+         done; \
+       done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+       rm -f remove-potcdate.sed
+       rm -f stamp-poT
+       rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+       rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+       rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+       rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+       $(MAKE) update-po
+       @$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: stamp-po $(DISTFILES)
+       dists="$(DISTFILES)"; \
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         dists="$$dists Makevars.template"; \
+       fi; \
+       if test -f $(srcdir)/$(DOMAIN).pot; then \
+         dists="$$dists $(DOMAIN).pot stamp-po"; \
+       fi; \
+       if test -f $(srcdir)/ChangeLog; then \
+         dists="$$dists ChangeLog"; \
+       fi; \
+       for i in 0 1 2 3 4 5 6 7 8 9; do \
+         if test -f $(srcdir)/ChangeLog.$$i; then \
+           dists="$$dists ChangeLog.$$i"; \
+         fi; \
+       done; \
+       if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+       for file in $$dists; do \
+         if test -f $$file; then \
+           cp -p $$file $(distdir) || exit 1; \
+         else \
+           cp -p $(srcdir)/$$file $(distdir) || exit 1; \
+         fi; \
+       done
+
+update-po: Makefile
+       $(MAKE) $(DOMAIN).pot-update
+       test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+       $(MAKE) update-gmo
+
+# General rule for creating PO files.
+
+.nop.po-create:
+       @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
+       echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
+       exit 1
+
+# General rule for updating PO files.
+
+.nop.po-update:
+       @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+       if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \
+       tmpdir=`pwd`; \
+       echo "$$lang:"; \
+       test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+       echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+       cd $(srcdir); \
+       if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+              '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+                $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+              *) \
+                $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+            esac; \
+          }; then \
+         if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+           rm -f $$tmpdir/$$lang.new.po; \
+         else \
+           if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+             :; \
+           else \
+             echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+             exit 1; \
+           fi; \
+         fi; \
+       else \
+         echo "msgmerge for $$lang.po failed!" 1>&2; \
+         rm -f $$tmpdir/$$lang.new.po; \
+       fi
+
+$(DUMMYPOFILES):
+
+update-gmo: Makefile $(GMOFILES)
+       @:
+
+# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
+# because execution permission bits may not work on the current file system.
+# Use @SHELL@, which is the shell determined by autoconf for the use by its
+# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
+Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
+       cd $(top_builddir) \
+         && @SHELL@ ./config.status $(subdir)/$@.in po-directories
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/Makevars b/po/Makevars
new file mode 100644 (file)
index 0000000..9d8b704
--- /dev/null
@@ -0,0 +1,42 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_  --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Enventor development team
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = enlightenment-devel@lists.sourceforge.net
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
diff --git a/po/Makevars.template b/po/Makevars.template
new file mode 100644 (file)
index 0000000..32692ab
--- /dev/null
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS =
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
diff --git a/po/POTFILES b/po/POTFILES
new file mode 100644 (file)
index 0000000..7d6eb38
--- /dev/null
@@ -0,0 +1,31 @@
+     ../src/bin/base_gui.c \
+     ../src/bin/config_data.c \
+     ../src/bin/console.c \
+     ../src/bin/file_mgr.c \
+     ../src/bin/globals.c \
+     ../src/bin/goto.c \
+     ../src/bin/live_edit.c \
+     ../src/bin/main.c \
+     ../src/bin/menu.c \
+     ../src/bin/newfile.c \
+     ../src/bin/panes.c \
+     ../src/bin/search.c \
+     ../src/bin/setting.c \
+     ../src/bin/statusbar.c \
+     ../src/bin/text_setting.c \
+     ../src/bin/tools.c \
+     ../src/lib/auto_comp.c \
+     ../src/lib/build.c \
+     ../src/lib/ctxpopup.c \
+     ../src/lib/dummy_obj.c \
+     ../src/lib/edc_editor.c \
+     ../src/lib/edc_parser.c \
+     ../src/lib/edj_mgr.c \
+     ../src/lib/edj_viewer.c \
+     ../src/lib/enventor_main.c \
+     ../src/lib/enventor_smart.c \
+     ../src/lib/indent.c \
+     ../src/lib/redoundo.c \
+     ../src/lib/syntax_color.c \
+     ../src/lib/syntax_helper.c \
+     ../src/lib/template.c
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644 (file)
index 0000000..3b70532
--- /dev/null
@@ -0,0 +1,32 @@
+src/bin/base_gui.c
+src/bin/config_data.c
+src/bin/console.c
+src/bin/file_mgr.c
+src/bin/globals.c
+src/bin/goto.c
+src/bin/live_edit.c
+src/bin/main.c
+src/bin/menu.c
+src/bin/newfile.c
+src/bin/panes.c
+src/bin/search.c
+src/bin/setting.c
+src/bin/statusbar.c
+src/bin/text_setting.c
+src/bin/tools.c
+src/lib/auto_comp.c
+src/lib/build.c
+src/lib/ctxpopup.c
+src/lib/dummy_obj.c
+src/lib/edc_editor.c
+src/lib/edc_parser.c
+src/lib/edj_mgr.c
+src/lib/edj_viewer.c
+src/lib/enventor_main.c
+src/lib/enventor_smart.c
+src/lib/indent.c
+src/lib/redoundo.c
+src/lib/syntax_color.c
+src/lib/syntax_helper.c
+src/lib/template.c
+
diff --git a/po/Rules-quot b/po/Rules-quot
new file mode 100644 (file)
index 0000000..af52487
--- /dev/null
@@ -0,0 +1,47 @@
+# Special Makefile rules for English message catalogs with quotation marks.
+
+DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
+
+.SUFFIXES: .insert-header .po-update-en
+
+en@quot.po-create:
+       $(MAKE) en@quot.po-update
+en@boldquot.po-create:
+       $(MAKE) en@boldquot.po-update
+
+en@quot.po-update: en@quot.po-update-en
+en@boldquot.po-update: en@boldquot.po-update-en
+
+.insert-header.po-update-en:
+       @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
+       if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
+       tmpdir=`pwd`; \
+       echo "$$lang:"; \
+       ll=`echo $$lang | sed -e 's/@.*//'`; \
+       LC_ALL=C; export LC_ALL; \
+       cd $(srcdir); \
+       if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \
+         if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+           rm -f $$tmpdir/$$lang.new.po; \
+         else \
+           if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+             :; \
+           else \
+             echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+             exit 1; \
+           fi; \
+         fi; \
+       else \
+         echo "creation of $$lang.po failed!" 1>&2; \
+         rm -f $$tmpdir/$$lang.new.po; \
+       fi
+
+en@quot.insert-header: insert-header.sin
+       sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
+
+en@boldquot.insert-header: insert-header.sin
+       sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+       rm -f *.insert-header
diff --git a/po/boldquot.sed b/po/boldquot.sed
new file mode 100644 (file)
index 0000000..4b937aa
--- /dev/null
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
+s/“/“\e[1m/g
+s/”/\e[0m”/g
+s/‘/‘\e[1m/g
+s/’/\e[0m’/g
diff --git a/po/en.gmo b/po/en.gmo
new file mode 100644 (file)
index 0000000..0480a23
Binary files /dev/null and b/po/en.gmo differ
diff --git a/po/en.po b/po/en.po
new file mode 100644 (file)
index 0000000..3b4f40d
--- /dev/null
+++ b/po/en.po
@@ -0,0 +1,461 @@
+# English translation for Enventor package.
+# Copyright (C) 2015 Enventor development team
+# This file is distributed under the same license as the enventor package.
+# nikawhite belyavskijnb@gmail.com
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: enventor 0.6.0\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-01-02 22:29+0900\n"
+"PO-Revision-Date: 2015-11-17 17:37+0000\n"
+"Last-Translator: nikawhite belyavskijnb@gmail.com \n"
+"Language-Team: \n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bin/base_gui.c:61
+#, c-format
+msgid "%s - EDC Editor"
+msgstr ""
+
+#: src/bin/config_data.c:67
+msgid "Failed to generate tmp folder!"
+msgstr ""
+
+#: src/bin/config_data.c:86 src/bin/config_data.c:99
+#, c-format
+msgid "Cannot create a config folder \"%s\""
+msgstr ""
+
+#: src/bin/config_data.c:110
+#, c-format
+msgid "Cannot save a config file \"%s\""
+msgstr ""
+
+#: src/bin/config_data.c:149
+#, c-format
+msgid "Cannot load a config file \"%s\""
+msgstr ""
+
+#: src/bin/config_data.c:157 src/bin/file_mgr.c:193 src/bin/goto.c:132
+#: src/bin/menu.c:688 src/bin/newfile.c:141 src/bin/panes.c:281
+#: src/bin/search.c:332 src/bin/setting.c:476 src/bin/statusbar.c:42
+#: src/bin/text_setting.c:490 src/bin/text_setting.c:543
+#: src/bin/text_setting.c:574 src/bin/text_setting.c:1087 src/bin/tools.c:170
+msgid "Failed to allocate Memory!"
+msgstr ""
+
+#: src/bin/file_mgr.c:70
+msgid "EDC has been changed on the file system."
+msgstr ""
+
+#: src/bin/file_mgr.c:72
+msgid "Do you want to replace the contents?"
+msgstr ""
+
+#: src/bin/file_mgr.c:83
+msgid "Save As"
+msgstr ""
+
+#: src/bin/file_mgr.c:91 src/bin/search.c:402
+msgid "Replace"
+msgstr ""
+
+#: src/bin/file_mgr.c:97
+msgid "Ignore"
+msgstr ""
+
+#: src/bin/file_mgr.c:157
+#, c-format
+msgid "File saved. \"%s\""
+msgstr ""
+
+#: src/bin/file_mgr.c:159
+#, c-format
+msgid "Already saved. \"%s\""
+msgstr ""
+
+#: src/bin/goto.c:89
+msgid "Invalid line number"
+msgstr ""
+
+#: src/bin/goto.c:138
+msgid "EDC Editor Goto Line"
+msgstr ""
+
+#: src/bin/goto.c:142
+msgid "Go to Line"
+msgstr ""
+
+#: src/bin/goto.c:164
+#, c-format
+msgid "Enter line number [1..%d]:"
+msgstr ""
+
+#: src/bin/goto.c:188 src/bin/menu.c:162
+msgid "Ok"
+msgstr ""
+
+#: src/bin/goto.c:200 src/bin/search.c:424
+msgid "Failed to grab key - Escape"
+msgstr ""
+
+#: src/bin/live_edit.c:925
+msgid "Double click the part to confirm."
+msgstr ""
+
+#: src/bin/live_edit.c:1070
+msgid "Faild to allocate Memory!"
+msgstr ""
+
+#: src/bin/main.c:24
+msgid "Auto Completion Enabled."
+msgstr ""
+
+#: src/bin/main.c:25
+msgid "Auto Completion Disabled."
+msgstr ""
+
+#: src/bin/main.c:34
+msgid "Auto Indentation Enabled."
+msgstr ""
+
+#: src/bin/main.c:35
+msgid "Auto Indentation Disabled."
+msgstr ""
+
+#: src/bin/main.c:206
+#, c-format
+msgid "Font Size: %1.1fx"
+msgstr ""
+
+#: src/bin/main.c:459
+#, c-format
+msgid "Program Run: \"%s\""
+msgstr ""
+
+#: src/bin/main.c:558
+msgid "Insertion of template code is disabled while in Live Edit mode"
+msgstr ""
+
+#: src/bin/main.c:566
+#, c-format
+msgid "Template code inserted, (%s)"
+msgstr ""
+
+#: src/bin/main.c:572
+msgid ""
+"Can't insert template code here. Move the cursor inside the \"Collections,"
+"Images,Parts,Part,Programs\" scope."
+msgstr ""
+
+#: src/bin/main.c:825
+#, c-format
+msgid "Failed to grab key - %s"
+msgstr ""
+
+#: src/bin/menu.c:149
+msgid "New File: Choose a template"
+msgstr ""
+
+#: src/bin/menu.c:168 src/bin/menu.c:212 src/bin/setting.c:532
+msgid "Cancel"
+msgstr ""
+
+#: src/bin/menu.c:185
+msgid "Without save, you will lose last changes!"
+msgstr ""
+
+#: src/bin/menu.c:187
+msgid "Will you save changes?"
+msgstr ""
+
+#: src/bin/menu.c:198 src/bin/menu.c:549 src/bin/menu.c:649
+msgid "Save"
+msgstr ""
+
+#: src/bin/menu.c:206
+msgid "Discard"
+msgstr ""
+
+#: src/bin/menu.c:412
+msgid "Choose a file to save"
+msgstr ""
+
+#: src/bin/menu.c:436
+#, c-format
+msgid "Failed to save: %s."
+msgstr ""
+
+#: src/bin/menu.c:491
+msgid "Support only .edc file."
+msgstr ""
+
+#: src/bin/menu.c:501
+msgid "Choose a file to load."
+msgstr ""
+
+#: src/bin/menu.c:512
+#, c-format
+msgid "Failed to load: %s."
+msgstr ""
+
+#: src/bin/menu.c:541
+msgid "Save File: Choose a EDC"
+msgstr ""
+
+#: src/bin/menu.c:550 src/bin/menu.c:585
+msgid "Close"
+msgstr ""
+
+#: src/bin/menu.c:575
+msgid "Load File: Choose a EDC"
+msgstr ""
+
+#: src/bin/menu.c:584 src/bin/menu.c:653
+msgid "Load"
+msgstr ""
+
+#: src/bin/menu.c:644
+msgid "New"
+msgstr ""
+
+#: src/bin/menu.c:657 src/bin/setting.c:492
+msgid "Settings"
+msgstr ""
+
+#: src/bin/menu.c:661
+msgid "About"
+msgstr ""
+
+#: src/bin/menu.c:665
+msgid "Exit"
+msgstr ""
+
+#: src/bin/menu.c:672
+msgid "Close EDC Editor Menu (Esc)"
+msgstr ""
+
+#: src/bin/newfile.c:56 src/bin/newfile.c:79
+#, c-format
+msgid "Cannot find file! \"%s\""
+msgstr ""
+
+#: src/bin/newfile.c:125
+#, c-format
+msgid "Cannot find templates folder! \"%s\""
+msgstr ""
+
+#: src/bin/search.c:81
+#, c-format
+msgid "%d matches replaced"
+msgstr ""
+
+#: src/bin/search.c:130 src/bin/search.c:190
+#, c-format
+msgid "No \"%s\" in the text"
+msgstr ""
+
+#: src/bin/search.c:228 src/bin/search.c:394
+msgid "Backward"
+msgstr ""
+
+#: src/bin/search.c:260 src/bin/search.c:387
+msgid "Forward"
+msgstr ""
+
+#: src/bin/search.c:338
+msgid "EDC Editor Search"
+msgstr ""
+
+#: src/bin/search.c:341
+msgid "Find/Replace"
+msgstr ""
+
+#: src/bin/search.c:409
+msgid "Replace All"
+msgstr ""
+
+#: src/bin/setting.c:249
+msgid "Image Paths:"
+msgstr ""
+
+#: src/bin/setting.c:257
+msgid "Sound Paths:"
+msgstr ""
+
+#: src/bin/setting.c:265
+msgid "Font Paths:"
+msgstr ""
+
+#: src/bin/setting.c:273
+msgid "Data Paths:"
+msgstr ""
+
+#: src/bin/setting.c:278
+msgid "Preferences:"
+msgstr ""
+
+#: src/bin/setting.c:297
+msgid "Live View Scale"
+msgstr ""
+
+#: src/bin/setting.c:324
+msgid "Live View Size"
+msgstr ""
+
+#: src/bin/setting.c:385
+msgid "Part Highlighting"
+msgstr ""
+
+#: src/bin/setting.c:390
+msgid "Dummy Parts"
+msgstr ""
+
+#: src/bin/setting.c:395
+msgid "Status"
+msgstr ""
+
+#: src/bin/setting.c:400
+msgid "Tools"
+msgstr ""
+
+#: src/bin/setting.c:405
+msgid "Auto Hiding Console"
+msgstr ""
+
+#: src/bin/setting.c:502
+msgid "General"
+msgstr ""
+
+#: src/bin/setting.c:503
+msgid "Text Editor"
+msgstr ""
+
+#: src/bin/setting.c:518
+msgid "Apply"
+msgstr ""
+
+#: src/bin/setting.c:525
+msgid "Reset"
+msgstr ""
+
+#: src/bin/text_setting.c:525
+#, c-format
+msgid "Failed to open file \"%s\""
+msgstr ""
+
+#: src/bin/text_setting.c:802
+msgid "Double click a keyword to change its color :"
+msgstr ""
+
+#: src/bin/text_setting.c:848
+msgid "Font Size "
+msgstr ""
+
+#: src/bin/text_setting.c:857
+msgid "Line Number"
+msgstr ""
+
+#: src/bin/text_setting.c:862
+msgid "Auto Indentation"
+msgstr ""
+
+#: src/bin/text_setting.c:867
+msgid "Auto Completion"
+msgstr ""
+
+#: src/bin/text_setting.c:872
+msgid "Smart Undo/Redo"
+msgstr ""
+
+#: src/bin/text_setting.c:900
+msgid "Font Name"
+msgstr ""
+
+#: src/bin/text_setting.c:926
+msgid "Font Style"
+msgstr ""
+
+#: src/bin/tools.c:117
+msgid "Redo text."
+msgstr ""
+
+#: src/bin/tools.c:119
+msgid "No text to be redo."
+msgstr ""
+
+#: src/bin/tools.c:128
+msgid "Undo text."
+msgstr ""
+
+#: src/bin/tools.c:130
+msgid "No text to be undo."
+msgstr ""
+
+#: src/bin/tools.c:183
+msgid "EDC Editor Menu (Esc)"
+msgstr ""
+
+#: src/bin/tools.c:196
+msgid "Save File (Ctrl + S)"
+msgstr ""
+
+#: src/bin/tools.c:202
+msgid "Undo Text (Ctrl + Z)"
+msgstr ""
+
+#: src/bin/tools.c:208
+msgid "Redo Text (Ctrl + R)"
+msgstr ""
+
+#: src/bin/tools.c:214
+msgid "Find/Replace (Ctrl + F)"
+msgstr ""
+
+#: src/bin/tools.c:221
+msgid "Goto Lines (Ctrl + L)"
+msgstr ""
+
+#: src/bin/tools.c:228
+msgid "Line Numbers (F5)"
+msgstr ""
+
+#: src/bin/tools.c:239
+msgid "Part Highlighting (Ctrl + H)"
+msgstr ""
+
+#: src/bin/tools.c:246
+msgid "Dummy Parts (Ctrl + W)"
+msgstr ""
+
+#: src/bin/tools.c:253
+msgid "Live View Edit (Ctrl + E)"
+msgstr ""
+
+#: src/bin/tools.c:265
+msgid "Console Box (Alt + Down)"
+msgstr ""
+
+#: src/bin/tools.c:273
+msgid "Status (F11)"
+msgstr ""
+
+#: src/bin/tools.c:309
+msgid "Part Highlighting Enabled."
+msgstr ""
+
+#: src/bin/tools.c:311
+msgid "Part Highlighting Disabled."
+msgstr ""
+
+#: src/bin/tools.c:349
+msgid "Dummy Parts Enabled."
+msgstr ""
+
+#: src/bin/tools.c:351
+msgid "Dummy Parts Disabled."
+msgstr ""
diff --git a/po/en@boldquot.header b/po/en@boldquot.header
new file mode 100644 (file)
index 0000000..fedb6a0
--- /dev/null
@@ -0,0 +1,25 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
diff --git a/po/en@quot.header b/po/en@quot.header
new file mode 100644 (file)
index 0000000..a9647fc
--- /dev/null
@@ -0,0 +1,22 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
diff --git a/po/enventor.pot b/po/enventor.pot
new file mode 100644 (file)
index 0000000..fd76136
--- /dev/null
@@ -0,0 +1,475 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Enventor development team
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: enventor 0.7.0\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-01-02 22:29+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bin/base_gui.c:61
+#, c-format
+msgid "%s - EDC Editor"
+msgstr ""
+
+#: src/bin/config_data.c:67
+msgid "Failed to generate tmp folder!"
+msgstr ""
+
+#: src/bin/config_data.c:86 src/bin/config_data.c:99
+#, c-format
+msgid "Cannot create a config folder \"%s\""
+msgstr ""
+
+#: src/bin/config_data.c:110
+#, c-format
+msgid "Cannot save a config file \"%s\""
+msgstr ""
+
+#: src/bin/config_data.c:149
+#, c-format
+msgid "Cannot load a config file \"%s\""
+msgstr ""
+
+#: src/bin/config_data.c:157 src/bin/file_mgr.c:193 src/bin/goto.c:132
+#: src/bin/menu.c:688 src/bin/newfile.c:141 src/bin/panes.c:281
+#: src/bin/search.c:332 src/bin/setting.c:476 src/bin/statusbar.c:42
+#: src/bin/text_setting.c:490 src/bin/text_setting.c:543
+#: src/bin/text_setting.c:574 src/bin/text_setting.c:1087 src/bin/tools.c:170
+msgid "Failed to allocate Memory!"
+msgstr ""
+
+#: src/bin/file_mgr.c:70
+msgid "EDC has been changed on the file system."
+msgstr ""
+
+#: src/bin/file_mgr.c:72
+msgid "Do you want to replace the contents?"
+msgstr ""
+
+#: src/bin/file_mgr.c:83
+msgid "Save As"
+msgstr ""
+
+#: src/bin/file_mgr.c:91 src/bin/search.c:402
+msgid "Replace"
+msgstr ""
+
+#: src/bin/file_mgr.c:97
+msgid "Ignore"
+msgstr ""
+
+#: src/bin/file_mgr.c:157
+#, c-format
+msgid "File saved. \"%s\""
+msgstr ""
+
+#: src/bin/file_mgr.c:159
+#, c-format
+msgid "Already saved. \"%s\""
+msgstr ""
+
+#: src/bin/goto.c:89
+msgid "Invalid line number"
+msgstr ""
+
+#: src/bin/goto.c:138
+msgid "EDC Editor Goto Line"
+msgstr ""
+
+#: src/bin/goto.c:142
+msgid "Go to Line"
+msgstr ""
+
+#: src/bin/goto.c:164
+#, c-format
+msgid "Enter line number [1..%d]:"
+msgstr ""
+
+#: src/bin/goto.c:188 src/bin/menu.c:162
+msgid "Ok"
+msgstr ""
+
+#: src/bin/goto.c:200 src/bin/search.c:424
+msgid "Failed to grab key - Escape"
+msgstr ""
+
+#: src/bin/live_edit.c:925
+msgid "Double click the part to confirm."
+msgstr ""
+
+#: src/bin/live_edit.c:995
+msgid "Select a part to add in Live View."
+msgstr ""
+
+#: src/bin/live_edit.c:1070
+msgid "Faild to allocate Memory!"
+msgstr ""
+
+#: src/bin/main.c:24
+msgid "Auto Completion Enabled."
+msgstr ""
+
+#: src/bin/main.c:25
+msgid "Auto Completion Disabled."
+msgstr ""
+
+#: src/bin/main.c:34
+msgid "Auto Indentation Enabled."
+msgstr ""
+
+#: src/bin/main.c:35
+msgid "Auto Indentation Disabled."
+msgstr ""
+
+#: src/bin/main.c:180
+#, c-format
+msgid "Live View Scale: %2.2fx"
+msgstr ""
+
+#: src/bin/main.c:206
+#, c-format
+msgid "Font Size: %1.1fx"
+msgstr ""
+
+#: src/bin/main.c:459
+#, c-format
+msgid "Program Run: \"%s\""
+msgstr ""
+
+#: src/bin/main.c:558
+msgid "Insertion of template code is disabled while in Live Edit mode"
+msgstr ""
+
+#: src/bin/main.c:566
+#, c-format
+msgid "Template code inserted, (%s)"
+msgstr ""
+
+#: src/bin/main.c:572
+msgid ""
+"Can't insert template code here. Move the cursor inside the \"Collections,"
+"Images,Parts,Part,Programs\" scope."
+msgstr ""
+
+#: src/bin/main.c:825
+#, c-format
+msgid "Failed to grab key - %s"
+msgstr ""
+
+#: src/bin/menu.c:149
+msgid "New File: Choose a template"
+msgstr ""
+
+#: src/bin/menu.c:168 src/bin/menu.c:212 src/bin/setting.c:532
+msgid "Cancel"
+msgstr ""
+
+#: src/bin/menu.c:185
+msgid "Without save, you will lose last changes!"
+msgstr ""
+
+#: src/bin/menu.c:187
+msgid "Will you save changes?"
+msgstr ""
+
+#: src/bin/menu.c:198 src/bin/menu.c:549 src/bin/menu.c:649
+msgid "Save"
+msgstr ""
+
+#: src/bin/menu.c:206
+msgid "Discard"
+msgstr ""
+
+#: src/bin/menu.c:412
+msgid "Choose a file to save"
+msgstr ""
+
+#: src/bin/menu.c:436
+#, c-format
+msgid "Failed to save: %s."
+msgstr ""
+
+#: src/bin/menu.c:491
+msgid "Support only .edc file."
+msgstr ""
+
+#: src/bin/menu.c:501
+msgid "Choose a file to load."
+msgstr ""
+
+#: src/bin/menu.c:512
+#, c-format
+msgid "Failed to load: %s."
+msgstr ""
+
+#: src/bin/menu.c:541
+msgid "Save File: Choose a EDC"
+msgstr ""
+
+#: src/bin/menu.c:550 src/bin/menu.c:585
+msgid "Close"
+msgstr ""
+
+#: src/bin/menu.c:575
+msgid "Load File: Choose a EDC"
+msgstr ""
+
+#: src/bin/menu.c:584 src/bin/menu.c:653
+msgid "Load"
+msgstr ""
+
+#: src/bin/menu.c:644
+msgid "New"
+msgstr ""
+
+#: src/bin/menu.c:657 src/bin/setting.c:492
+msgid "Settings"
+msgstr ""
+
+#: src/bin/menu.c:661
+msgid "About"
+msgstr ""
+
+#: src/bin/menu.c:665
+msgid "Exit"
+msgstr ""
+
+#: src/bin/menu.c:672
+msgid "Close EDC Editor Menu (Esc)"
+msgstr ""
+
+#: src/bin/menu.c:673
+msgid "Back"
+msgstr ""
+
+#: src/bin/newfile.c:56 src/bin/newfile.c:79
+#, c-format
+msgid "Cannot find file! \"%s\""
+msgstr ""
+
+#: src/bin/newfile.c:125
+#, c-format
+msgid "Cannot find templates folder! \"%s\""
+msgstr ""
+
+#: src/bin/search.c:81
+#, c-format
+msgid "%d matches replaced"
+msgstr ""
+
+#: src/bin/search.c:130 src/bin/search.c:190
+#, c-format
+msgid "No \"%s\" in the text"
+msgstr ""
+
+#: src/bin/search.c:228 src/bin/search.c:394
+msgid "Backward"
+msgstr ""
+
+#: src/bin/search.c:260 src/bin/search.c:387
+msgid "Forward"
+msgstr ""
+
+#: src/bin/search.c:338
+msgid "EDC Editor Search"
+msgstr ""
+
+#: src/bin/search.c:341
+msgid "Find/Replace"
+msgstr ""
+
+#: src/bin/search.c:409
+msgid "Replace All"
+msgstr ""
+
+#: src/bin/setting.c:249
+msgid "Image Paths:"
+msgstr ""
+
+#: src/bin/setting.c:257
+msgid "Sound Paths:"
+msgstr ""
+
+#: src/bin/setting.c:265
+msgid "Font Paths:"
+msgstr ""
+
+#: src/bin/setting.c:273
+msgid "Data Paths:"
+msgstr ""
+
+#: src/bin/setting.c:278
+msgid "Preferences:"
+msgstr ""
+
+#: src/bin/setting.c:297
+msgid "Live View Scale"
+msgstr ""
+
+#: src/bin/setting.c:324
+msgid "Live View Size"
+msgstr ""
+
+#: src/bin/setting.c:385
+msgid "Part Highlighting"
+msgstr ""
+
+#: src/bin/setting.c:390
+msgid "Dummy Parts"
+msgstr ""
+
+#: src/bin/setting.c:395
+msgid "Status"
+msgstr ""
+
+#: src/bin/setting.c:400
+msgid "Tools"
+msgstr ""
+
+#: src/bin/setting.c:405
+msgid "Auto Hiding Console"
+msgstr ""
+
+#: src/bin/setting.c:502
+msgid "General"
+msgstr ""
+
+#: src/bin/setting.c:503
+msgid "Text Editor"
+msgstr ""
+
+#: src/bin/setting.c:518
+msgid "Apply"
+msgstr ""
+
+#: src/bin/setting.c:525
+msgid "Reset"
+msgstr ""
+
+#: src/bin/text_setting.c:525
+#, c-format
+msgid "Failed to open file \"%s\""
+msgstr ""
+
+#: src/bin/text_setting.c:802
+msgid "Double click a keyword to change its color :"
+msgstr ""
+
+#: src/bin/text_setting.c:848
+msgid "Font Size "
+msgstr ""
+
+#: src/bin/text_setting.c:857
+msgid "Line Number"
+msgstr ""
+
+#: src/bin/text_setting.c:862
+msgid "Auto Indentation"
+msgstr ""
+
+#: src/bin/text_setting.c:867
+msgid "Auto Completion"
+msgstr ""
+
+#: src/bin/text_setting.c:872
+msgid "Smart Undo/Redo"
+msgstr ""
+
+#: src/bin/text_setting.c:900
+msgid "Font Name"
+msgstr ""
+
+#: src/bin/text_setting.c:926
+msgid "Font Style"
+msgstr ""
+
+#: src/bin/tools.c:117
+msgid "Redo text."
+msgstr ""
+
+#: src/bin/tools.c:119
+msgid "No text to be redo."
+msgstr ""
+
+#: src/bin/tools.c:128
+msgid "Undo text."
+msgstr ""
+
+#: src/bin/tools.c:130
+msgid "No text to be undo."
+msgstr ""
+
+#: src/bin/tools.c:183
+msgid "EDC Editor Menu (Esc)"
+msgstr ""
+
+#: src/bin/tools.c:196
+msgid "Save File (Ctrl + S)"
+msgstr ""
+
+#: src/bin/tools.c:202
+msgid "Undo Text (Ctrl + Z)"
+msgstr ""
+
+#: src/bin/tools.c:208
+msgid "Redo Text (Ctrl + R)"
+msgstr ""
+
+#: src/bin/tools.c:214
+msgid "Find/Replace (Ctrl + F)"
+msgstr ""
+
+#: src/bin/tools.c:221
+msgid "Goto Lines (Ctrl + L)"
+msgstr ""
+
+#: src/bin/tools.c:228
+msgid "Line Numbers (F5)"
+msgstr ""
+
+#: src/bin/tools.c:239
+msgid "Part Highlighting (Ctrl + H)"
+msgstr ""
+
+#: src/bin/tools.c:246
+msgid "Dummy Parts (Ctrl + W)"
+msgstr ""
+
+#: src/bin/tools.c:253
+msgid "Live View Edit (Ctrl + E)"
+msgstr ""
+
+#: src/bin/tools.c:265
+msgid "Console Box (Alt + Down)"
+msgstr ""
+
+#: src/bin/tools.c:273
+msgid "Status (F11)"
+msgstr ""
+
+#: src/bin/tools.c:309
+msgid "Part Highlighting Enabled."
+msgstr ""
+
+#: src/bin/tools.c:311
+msgid "Part Highlighting Disabled."
+msgstr ""
+
+#: src/bin/tools.c:349
+msgid "Dummy Parts Enabled."
+msgstr ""
+
+#: src/bin/tools.c:351
+msgid "Dummy Parts Disabled."
+msgstr ""
diff --git a/po/insert-header.sin b/po/insert-header.sin
new file mode 100644 (file)
index 0000000..b26de01
--- /dev/null
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/quot.sed b/po/quot.sed
new file mode 100644 (file)
index 0000000..0122c46
--- /dev/null
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin
new file mode 100644 (file)
index 0000000..2436c49
--- /dev/null
@@ -0,0 +1,19 @@
+# Sed script that remove the POT-Creation-Date line in the header entry
+# from a POT file.
+#
+# The distinction between the first and the following occurrences of the
+# pattern is achieved by looking at the hold space.
+/^"POT-Creation-Date: .*"$/{
+x
+# Test if the hold space is empty.
+s/P/P/
+ta
+# Yes it was empty. First occurrence. Remove the line.
+g
+d
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/ru.gmo b/po/ru.gmo
new file mode 100644 (file)
index 0000000..acf8349
Binary files /dev/null and b/po/ru.gmo differ
diff --git a/po/ru.po b/po/ru.po
new file mode 100644 (file)
index 0000000..7667d7e
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,463 @@
+# Russian translation for Enventor project
+# Copyright (C) 2015 Enventor development team
+# This file is distributed under the same license as the enventor package.
+# NikaWhite belyavskijnb@gmail.com
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: enventor 0.6.0\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-01-02 22:29+0900\n"
+"PO-Revision-Date: 2015-12-10 12:07+0000\n"
+"Last-Translator: NikaWhite belyavskijnb@gmail.com \n"
+"Language-Team: \n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bin/base_gui.c:61
+#, c-format
+msgid "%s - EDC Editor"
+msgstr "%s - EdC Editor"
+
+#: src/bin/config_data.c:67
+msgid "Failed to generate tmp folder!"
+msgstr "Невозможно создать временную директорию!"
+
+#: src/bin/config_data.c:86 src/bin/config_data.c:99
+#, c-format
+msgid "Cannot create a config folder \"%s\""
+msgstr "Невозможно создать директорию с конфигурационными файлами. \"%s\""
+
+#: src/bin/config_data.c:110
+#, c-format
+msgid "Cannot save a config file \"%s\""
+msgstr "Неудалось сохранить файл настроек \"%s\""
+
+#: src/bin/config_data.c:149
+#, c-format
+msgid "Cannot load a config file \"%s\""
+msgstr "Неудалось загрузить настройки из файла \"%s\""
+
+#: src/bin/config_data.c:157 src/bin/file_mgr.c:193 src/bin/goto.c:132
+#: src/bin/menu.c:688 src/bin/newfile.c:141 src/bin/panes.c:281
+#: src/bin/search.c:332 src/bin/setting.c:476 src/bin/statusbar.c:42
+#: src/bin/text_setting.c:490 src/bin/text_setting.c:543
+#: src/bin/text_setting.c:574 src/bin/text_setting.c:1087 src/bin/tools.c:170
+msgid "Failed to allocate Memory!"
+msgstr "Ошибка выделения памяти!"
+
+#: src/bin/file_mgr.c:70
+msgid "EDC has been changed on the file system."
+msgstr "EDC-файл был изменен друшим приложением."
+
+#: src/bin/file_mgr.c:72
+msgid "Do you want to replace the contents?"
+msgstr "Вы уверенны, что хотите заменить файл?"
+
+#: src/bin/file_mgr.c:83
+msgid "Save As"
+msgstr "Сохранить как"
+
+#: src/bin/file_mgr.c:91 src/bin/search.c:402
+msgid "Replace"
+msgstr "Замена"
+
+#: src/bin/file_mgr.c:97
+msgid "Ignore"
+msgstr "Пропустить"
+
+#: src/bin/file_mgr.c:157
+#, c-format
+msgid "File saved. \"%s\""
+msgstr "Файл сохранен. \"%s\""
+
+#: src/bin/file_mgr.c:159
+#, c-format
+msgid "Already saved. \"%s\""
+msgstr "Сохранен. \"%s\""
+
+#: src/bin/goto.c:89
+msgid "Invalid line number"
+msgstr "Неверный номер строки."
+
+#: src/bin/goto.c:138
+msgid "EDC Editor Goto Line"
+msgstr "EDC Editor Перейти к строке"
+
+#: src/bin/goto.c:142
+msgid "Go to Line"
+msgstr "Перейти к строке"
+
+#: src/bin/goto.c:164
+#, c-format
+msgid "Enter line number [1..%d]:"
+msgstr "Введите номер строки [1..%d]:"
+
+#: src/bin/goto.c:188 src/bin/menu.c:162
+msgid "Ok"
+msgstr "Перейти"
+
+#: src/bin/goto.c:200 src/bin/search.c:424
+msgid "Failed to grab key - Escape"
+msgstr "Ошибка перехвата нажатия - Escape"
+
+#: src/bin/live_edit.c:925
+msgid "Double click the part to confirm."
+msgstr "Сделайте двойной клик мыши по примитиву для вставки."
+
+#: src/bin/live_edit.c:1070
+msgid "Faild to allocate Memory!"
+msgstr "Ошибка выделения памяти!"
+
+#: src/bin/main.c:24
+msgid "Auto Completion Enabled."
+msgstr "Автодополнение Включено."
+
+#: src/bin/main.c:25
+msgid "Auto Completion Disabled."
+msgstr "Автодополнение Выключенно"
+
+#: src/bin/main.c:34
+msgid "Auto Indentation Enabled."
+msgstr "Автовыравнивание Включено"
+
+#: src/bin/main.c:35
+msgid "Auto Indentation Disabled."
+msgstr "Автовыравнивание Выключено"
+
+#: src/bin/main.c:206
+#, c-format
+msgid "Font Size: %1.1fx"
+msgstr "Размер шрифта: %1.1fx"
+
+#: src/bin/main.c:459
+#, c-format
+msgid "Program Run: \"%s\""
+msgstr "Запущена программа: \"%s\""
+
+#: src/bin/main.c:558
+msgid "Insertion of template code is disabled while in Live Edit mode"
+msgstr "Невозможно вставить шаблон, пока активен режим Live Edit"
+
+#: src/bin/main.c:566
+#, c-format
+msgid "Template code inserted, (%s)"
+msgstr "Шаблон вставлен, (%s)"
+
+#: src/bin/main.c:572
+msgid ""
+"Can't insert template code here. Move the cursor inside the \"Collections,"
+"Images,Parts,Part,Programs\" scope."
+msgstr ""
+"Невозможно втавить шаблон в это место. Переместите курсор внутрь одного из "
+"блоков: \"Collections, Images,Parts,Part,Programs\""
+
+#: src/bin/main.c:825
+#, c-format
+msgid "Failed to grab key - %s"
+msgstr "Ошибка перехвата клавиши - %s"
+
+#: src/bin/menu.c:149
+msgid "New File: Choose a template"
+msgstr "Новый файл: Выберите шаблон"
+
+#: src/bin/menu.c:168 src/bin/menu.c:212 src/bin/setting.c:532
+msgid "Cancel"
+msgstr "Отмена"
+
+#: src/bin/menu.c:185
+msgid "Without save, you will lose last changes!"
+msgstr "Без сохранения все изменения будут утеряны!"
+
+#: src/bin/menu.c:187
+msgid "Will you save changes?"
+msgstr "Сохранить изменения?"
+
+#: src/bin/menu.c:198 src/bin/menu.c:549 src/bin/menu.c:649
+msgid "Save"
+msgstr "Сохранить"
+
+#: src/bin/menu.c:206
+msgid "Discard"
+msgstr "Не сохранять"
+
+#: src/bin/menu.c:412
+msgid "Choose a file to save"
+msgstr "Выбирете файл для сохранения"
+
+#: src/bin/menu.c:436
+#, c-format
+msgid "Failed to save: %s."
+msgstr "Неудалось сохранить: %s."
+
+#: src/bin/menu.c:491
+msgid "Support only .edc file."
+msgstr "Поддерживаются файлы с расширением .edc."
+
+#: src/bin/menu.c:501
+msgid "Choose a file to load."
+msgstr "Выбирете файл для загрузки."
+
+#: src/bin/menu.c:512
+#, c-format
+msgid "Failed to load: %s."
+msgstr "Невозможно загрузить: %s."
+
+#: src/bin/menu.c:541
+msgid "Save File: Choose a EDC"
+msgstr "Сохранение: Выберите .edc файл"
+
+#: src/bin/menu.c:550 src/bin/menu.c:585
+msgid "Close"
+msgstr "Закрыть"
+
+#: src/bin/menu.c:575
+msgid "Load File: Choose a EDC"
+msgstr "Загрузка: Выберите .edc файл"
+
+#: src/bin/menu.c:584 src/bin/menu.c:653
+msgid "Load"
+msgstr "Загрузить"
+
+#: src/bin/menu.c:644
+msgid "New"
+msgstr "Новый"
+
+#: src/bin/menu.c:657 src/bin/setting.c:492
+msgid "Settings"
+msgstr "Настройки"
+
+#: src/bin/menu.c:661
+msgid "About"
+msgstr "Помощь"
+
+#: src/bin/menu.c:665
+msgid "Exit"
+msgstr "Выход"
+
+#: src/bin/menu.c:672
+msgid "Close EDC Editor Menu (Esc)"
+msgstr "Закрыть меню (Esc)"
+
+#: src/bin/newfile.c:56 src/bin/newfile.c:79
+#, c-format
+msgid "Cannot find file! \"%s\""
+msgstr "Неудалось найти файл! \"%s\""
+
+#: src/bin/newfile.c:125
+#, c-format
+msgid "Cannot find templates folder! \"%s\""
+msgstr "Неудалось найди директорию с шаблонами! \"%s\""
+
+#: src/bin/search.c:81
+#, c-format
+msgid "%d matches replaced"
+msgstr "%d совпадений заменено."
+
+#: src/bin/search.c:130 src/bin/search.c:190
+#, c-format
+msgid "No \"%s\" in the text"
+msgstr "Строка \"%s\" не найдена"
+
+#: src/bin/search.c:228 src/bin/search.c:394
+msgid "Backward"
+msgstr "Назад"
+
+#: src/bin/search.c:260 src/bin/search.c:387
+msgid "Forward"
+msgstr "Вперед"
+
+#: src/bin/search.c:338
+msgid "EDC Editor Search"
+msgstr "Поиск"
+
+#: src/bin/search.c:341
+msgid "Find/Replace"
+msgstr "Поиск/Замена"
+
+#: src/bin/search.c:409
+msgid "Replace All"
+msgstr "Заменить все совпадения"
+
+#: src/bin/setting.c:249
+msgid "Image Paths:"
+msgstr "Изображения:"
+
+#: src/bin/setting.c:257
+msgid "Sound Paths:"
+msgstr "Звуки:      "
+
+#: src/bin/setting.c:265
+msgid "Font Paths:"
+msgstr "Шрифты:     "
+
+#: src/bin/setting.c:273
+msgid "Data Paths:"
+msgstr "Данные:     "
+
+#: src/bin/setting.c:278
+msgid "Preferences:"
+msgstr "Дополнительные настройки:"
+
+#: src/bin/setting.c:297
+msgid "Live View Scale"
+msgstr "Масштаб Live View"
+
+#: src/bin/setting.c:324
+msgid "Live View Size"
+msgstr "размер Live View"
+
+#: src/bin/setting.c:385
+msgid "Part Highlighting"
+msgstr "Подсветка примитивов"
+
+#: src/bin/setting.c:390
+msgid "Dummy Parts"
+msgstr "Изображение для контейнеров"
+
+#: src/bin/setting.c:395
+msgid "Status"
+msgstr "Строка статуса"
+
+#: src/bin/setting.c:400
+msgid "Tools"
+msgstr "Меню инструментов"
+
+#: src/bin/setting.c:405
+msgid "Auto Hiding Console"
+msgstr "Авто скрытие консоли"
+
+#: src/bin/setting.c:502
+msgid "General"
+msgstr "Общие"
+
+#: src/bin/setting.c:503
+msgid "Text Editor"
+msgstr "Текст"
+
+#: src/bin/setting.c:518
+msgid "Apply"
+msgstr "Применить"
+
+#: src/bin/setting.c:525
+msgid "Reset"
+msgstr "Сбросить"
+
+#: src/bin/text_setting.c:525
+#, c-format
+msgid "Failed to open file \"%s\""
+msgstr "Неудалось открыть файл \"%s\""
+
+#: src/bin/text_setting.c:802
+msgid "Double click a keyword to change its color :"
+msgstr "Двойной клик по слову позволит задать цвет:"
+
+#: src/bin/text_setting.c:848
+msgid "Font Size "
+msgstr "Размер шрифта "
+
+#: src/bin/text_setting.c:857
+msgid "Line Number"
+msgstr "Номера строк"
+
+#: src/bin/text_setting.c:862
+msgid "Auto Indentation"
+msgstr "Автовыравнивание"
+
+#: src/bin/text_setting.c:867
+msgid "Auto Completion"
+msgstr "Автодополнений"
+
+#: src/bin/text_setting.c:872
+msgid "Smart Undo/Redo"
+msgstr ""
+
+#: src/bin/text_setting.c:900
+msgid "Font Name"
+msgstr "Имя шрифта"
+
+#: src/bin/text_setting.c:926
+msgid "Font Style"
+msgstr "Стиль шрифта"
+
+#: src/bin/tools.c:117
+msgid "Redo text."
+msgstr "Восстановить изменения"
+
+#: src/bin/tools.c:119
+msgid "No text to be redo."
+msgstr "Нет действий для восстановления"
+
+#: src/bin/tools.c:128
+msgid "Undo text."
+msgstr "Отменить изменения"
+
+#: src/bin/tools.c:130
+msgid "No text to be undo."
+msgstr "Нет изменений для отмены"
+
+#: src/bin/tools.c:183
+msgid "EDC Editor Menu (Esc)"
+msgstr "Меню (Esc)"
+
+#: src/bin/tools.c:196
+msgid "Save File (Ctrl + S)"
+msgstr "Сохранить (Ctrl + S)"
+
+#: src/bin/tools.c:202
+msgid "Undo Text (Ctrl + Z)"
+msgstr "Отменить (Ctrl + Z)"
+
+#: src/bin/tools.c:208
+msgid "Redo Text (Ctrl + R)"
+msgstr "Повторить (Ctrl + R)"
+
+#: src/bin/tools.c:214
+msgid "Find/Replace (Ctrl + F)"
+msgstr "Поиск/Замена (Ctrl + F)"
+
+#: src/bin/tools.c:221
+msgid "Goto Lines (Ctrl + L)"
+msgstr "Перейти к строке (Ctrl + L)"
+
+#: src/bin/tools.c:228
+msgid "Line Numbers (F5)"
+msgstr "Номера строк (F5)"
+
+#: src/bin/tools.c:239
+msgid "Part Highlighting (Ctrl + H)"
+msgstr "Подсветка примитивов (Ctrl + H)"
+
+#: src/bin/tools.c:246
+msgid "Dummy Parts (Ctrl + W)"
+msgstr "Изображение для контейнеров (Ctrl + W)"
+
+#: src/bin/tools.c:253
+msgid "Live View Edit (Ctrl + E)"
+msgstr "Режим Live View (Ctrl + E)"
+
+#: src/bin/tools.c:265
+msgid "Console Box (Alt + Down)"
+msgstr "Показать/Скрыть консоль (Alt + Down)"
+
+#: src/bin/tools.c:273
+msgid "Status (F11)"
+msgstr "Строка статуса (F11)"
+
+#: src/bin/tools.c:309
+msgid "Part Highlighting Enabled."
+msgstr "Подсветка примитивов Включена"
+
+#: src/bin/tools.c:311
+msgid "Part Highlighting Disabled."
+msgstr "Подсветка примитивов Выключена"
+
+#: src/bin/tools.c:349
+msgid "Dummy Parts Enabled."
+msgstr "Изображение для контейнеров Включено"
+
+#: src/bin/tools.c:351
+msgid "Dummy Parts Disabled."
+msgstr "Изображения для контейнеров Выключено"
diff --git a/po/stamp-po b/po/stamp-po
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644 (file)
index 0000000..c06362f
--- /dev/null
@@ -0,0 +1,3 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = lib bin include
diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
new file mode 100644 (file)
index 0000000..b9fdae8
--- /dev/null
@@ -0,0 +1,49 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+LOCALE_DIR = @LOCALE_DIR@
+
+bin_PROGRAMS = enventor
+
+AM_CPPFLAGS = -DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+       -DPACKAGE_BIN_DIR=\"$(bindir)\" \
+       -DPACKAGE_LIB_DIR=\"$(libdir)\" \
+       -I$(top_srcdir)/src/lib \
+       -I$(top_srcdir)/src/bin \
+       -I$(top_srcdir)/src/include \
+       @ENVENTOR_CFLAGS@
+
+enventor_SOURCES = \
+       base_gui.c \
+       config_data.c \
+       main.c \
+       menu.c \
+       panes.c \
+       statusbar.c \
+       tools.c \
+       search.c \
+       goto.c \
+       newfile.c \
+       setting.c \
+       text_setting.c \
+       utils.c \
+       live_edit.c \
+       console.c \
+       file_mgr.c \
+       edc_navigator.c \
+       file_browser.c \
+       build_setting.c \
+       preference_setting.c \
+       help.c \
+       file_tab.c
+
+enventor_LDADD = \
+       $(top_builddir)/src/lib/libenventor.la \
+   @ENVENTOR_LIBS@
+enventor_LDFLAGS = $(LTLIBINTL)
+
+enventor_CFLAGS = \
+   -I$(top_builddir)/src/lib \
+       @ENVENTOR_CFLAGS@ \
+       -DLOCALE_DIR=\"@LOCALE_DIR@\"
+
+EXTRA_DIST =
diff --git a/src/bin/base_gui.c b/src/bin/base_gui.c
new file mode 100644 (file)
index 0000000..5e28d4a
--- /dev/null
@@ -0,0 +1,421 @@
+#include "common.h"
+
+typedef struct base_s
+{
+   Evas_Object *win;
+   Evas_Object *layout;
+   Evas_Object *console;
+   Enventor_Object *enventor;
+   Ecore_Timer *edc_navi_update_timer;
+   Eina_Bool console_msg : 1;
+} base_data;
+
+static base_data *g_bd = NULL;
+
+
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+win_delete_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+  menu_exit();
+}
+
+static void
+win_resize_cb(void *data EINA_UNUSED, Evas *o EINA_UNUSED, Evas_Object *obj,
+              void *event_info EINA_UNUSED)
+{
+   Evas_Coord w, h;
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   config_win_size_set(w, h);
+}
+
+static Eina_Bool
+edc_navigator_update_timer_cb(void *data)
+{
+   base_data *bd = data;
+   edc_navigator_group_update(stats_group_name_get());
+   bd->edc_navi_update_timer = NULL;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+base_error_msg_set(const char *msg)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+#ifdef __APPLE__
+   //FIXME: libpng library warning issue.
+   if (msg)
+     {
+        const char *except = "libpng warning: iCCP: known incorrect sRGB profile";
+        if (!strncmp(except, msg, strlen(except))) return;
+     }
+#endif
+
+   if (config_red_alert_get())
+     elm_object_signal_emit(bd->layout, "elm,state,alert,show", "");
+   console_text_set(bd->console, msg);
+   panes_editors_full_view(EINA_FALSE);
+   bd->console_msg = EINA_TRUE;
+}
+
+void
+base_title_set(const char *path)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+   char buf[PATH_MAX];
+   snprintf(buf, sizeof(buf), _("%s - EDC Editor"), path);
+   elm_win_title_set(bd->win, buf);
+}
+
+void
+base_statusbar_toggle(Eina_Bool toggle)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   if (toggle) config_stats_bar_set(!config_stats_bar_get());
+
+   if (config_stats_bar_get())
+     elm_object_signal_emit(bd->layout, "elm,state,statusbar,show", "");
+   else
+     elm_object_signal_emit(bd->layout, "elm,state,statusbar,hide", "");
+}
+
+void
+base_file_tab_toggle(Eina_Bool toggle)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   if (toggle) config_file_tab_set(!config_file_tab_get());
+
+   if (config_file_tab_get())
+     {
+        file_tab_disabled_set(EINA_FALSE);
+        elm_object_signal_emit(bd->layout, "elm,state,file_tab,show", "");
+     }
+   else
+     {
+        file_tab_disabled_set(EINA_TRUE);
+        elm_object_signal_emit(bd->layout, "elm,state,file_tab,hide", "");
+     }
+}
+
+void base_file_browser_toggle(Eina_Bool toggle)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   if (toggle) config_file_browser_set(!config_file_browser_get());
+
+   if (config_file_browser_get())
+     elm_object_signal_emit(bd->layout, "elm,state,file_browser,show", "");
+   else
+     elm_object_signal_emit(bd->layout, "elm,state,file_browser,hide", "");
+}
+
+void base_edc_navigator_deselect(void)
+{
+   if (config_edc_navigator_get())
+     edc_navigator_deselect();
+}
+
+void base_edc_navigator_toggle(Eina_Bool toggle)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   if (toggle) config_edc_navigator_set(!config_edc_navigator_get());
+
+   if (config_edc_navigator_get())
+     {
+        base_edc_navigator_group_update();
+        elm_object_signal_emit(bd->layout, "elm,state,edc_navigator,show", "");
+     }
+   else
+     {
+        elm_object_signal_emit(bd->layout, "elm,state,edc_navigator,hide", "");
+        edc_navigator_deselect();
+     }
+}
+
+void
+base_tools_toggle(Eina_Bool config)
+{
+   if (config) config_tools_set(!config_tools_get());
+
+   Eina_Bool visible = config_tools_get();
+
+   panes_live_view_tools_visible_set(visible);
+   panes_text_editor_tools_visible_set(visible);
+   file_browser_tools_visible_set(visible);
+   edc_navigator_tools_visible_set(visible);
+}
+
+Evas_Object *
+base_win_get(void)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(bd, NULL);
+
+   return bd->win;
+}
+
+Evas_Object *
+base_layout_get(void)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(bd, NULL);
+
+   return bd->layout;
+}
+
+void
+base_win_resize_object_add(Evas_Object *resize_obj)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   elm_win_resize_object_add(bd->win, resize_obj);
+}
+
+void base_live_edit_fixed_bar_set(Evas_Object *fixed_bar)
+{
+   panes_live_edit_fixed_bar_set(fixed_bar);
+}
+
+void base_tools_set(Evas_Object *live_view_tools,
+                    Evas_Object *text_editor_tools)
+{
+   panes_live_view_tools_set(live_view_tools);
+   panes_text_editor_tools_set(text_editor_tools);
+   file_browser_tools_set();
+   edc_navigator_tools_set();
+
+   Eina_Bool visible = config_tools_get();
+
+   panes_live_view_tools_visible_set(visible);
+   panes_text_editor_tools_visible_set(visible);
+   file_browser_tools_visible_set(visible);
+   edc_navigator_tools_visible_set(visible);
+}
+
+void
+base_live_view_full_view(void)
+{
+   panes_live_view_full_view();
+}
+
+void
+base_enventor_full_view(void)
+{
+   panes_text_editor_full_view();
+}
+
+void
+base_editors_full_view(void)
+{
+   base_console_toggle();
+}
+
+void
+base_console_full_view(void)
+{
+   panes_console_full_view();
+   tools_console_update(EINA_TRUE);
+}
+
+void
+base_live_view_set(Evas_Object *live_view)
+{
+   panes_live_view_set(live_view);
+}
+
+void
+base_console_auto_hide(void)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);;
+
+   if (!config_console_get()) return;
+   if (bd->console_msg) return;
+   panes_editors_full_view(EINA_TRUE);
+   tools_console_update(EINA_FALSE);
+}
+
+void
+base_console_toggle(void)
+{
+   if (panes_editors_full_view_get())
+     {
+        tools_console_update(EINA_TRUE);
+        panes_editors_full_view(EINA_FALSE);
+     }
+   else
+     {
+        tools_console_update(EINA_FALSE);
+        panes_editors_full_view(EINA_TRUE);
+     }
+}
+
+void
+base_gui_term(void)
+{
+   base_data *bd = g_bd;
+   if (!bd) return;
+
+   ecore_timer_del(bd->edc_navi_update_timer);
+   file_browser_term();
+   edc_navigator_term();
+   file_tab_term();
+   panes_term();
+
+   free(bd);
+   g_bd = NULL;
+}
+
+void
+base_edc_navigator_group_update(void)
+{
+   if (!config_edc_navigator_get()) return;
+
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   ecore_timer_del(bd->edc_navi_update_timer);
+   bd->edc_navi_update_timer = ecore_timer_add(EDC_NAVIGATOR_UPDATE_TIME,
+                                               edc_navigator_update_timer_cb,
+                                               bd);
+}
+
+void
+base_console_reset(void)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   console_text_set(bd->console, "");
+   bd->console_msg = EINA_FALSE;
+   if (config_console_get()) panes_editors_full_view(EINA_TRUE);
+}
+
+Eina_Bool
+base_gui_init(void)
+{
+   char buf[PATH_MAX];
+
+   base_data *bd = calloc(1, sizeof(base_data));
+   if (!bd)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return EINA_FALSE;
+     }
+   g_bd = bd;
+
+   //Window
+   Evas_Object *win = elm_win_util_standard_add("EDC Editor", "EDC Editor");
+   elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+
+   Evas_Coord w, h;
+   config_win_size_get(&w, &h);
+   if ((w > 0) && (h > 0))
+     evas_object_resize(win, w, h);
+
+   evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, win_resize_cb,
+                                  NULL);
+   evas_object_smart_callback_add(win, "delete,request", win_delete_request_cb,
+                                  NULL);
+
+   //Window icon
+   Evas_Object *icon = evas_object_image_add(evas_object_evas_get(win));
+#ifdef _WIN32
+   snprintf(buf, sizeof(buf), "%s/images/enventor.ico",
+            elm_app_data_dir_get());
+#else
+   snprintf(buf, sizeof(buf), "%s/images/enventor_logo.png",
+            elm_app_data_dir_get());
+#endif
+   evas_object_image_file_set(icon, buf, NULL);
+   elm_win_icon_object_set(win, icon);
+
+   //Base Layout
+   Evas_Object *layout = elm_layout_add(win);
+   elm_layout_file_set(layout, EDJE_PATH,  "main_layout");
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, layout);
+   evas_object_show(layout);
+
+   //Panes
+   Evas_Object *panes = panes_init(layout);
+   elm_object_part_content_set(layout, "elm.swallow.panes", panes);
+
+   //Console
+   Evas_Object *console = console_create(panes);
+   panes_console_set(console);
+
+   if (config_console_get())
+     panes_editors_full_view(EINA_TRUE);
+
+   //File Browser
+   Evas_Object *file_browser = file_browser_init(layout);
+   elm_object_part_content_set(layout, "elm.swallow.file_browser",
+                               file_browser);
+   file_browser_workspace_set(config_workspace_path_get());
+
+   //EDC Navigator
+   Evas_Object *edc_navigator = edc_navigator_init(layout);
+   elm_object_part_content_set(layout, "elm.swallow.edc_navigator",
+                               edc_navigator);
+   //File Tab
+   Evas_Object *file_tab = file_tab_init(layout);
+   elm_object_part_content_set(layout, "elm.swallow.file_tab", file_tab);
+
+   bd->win = win;
+   bd->layout = layout;
+   bd->console = console;
+
+   return EINA_TRUE;
+}
+
+void
+base_gui_show(void)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   evas_object_resize(bd->win, INIT_WIN_W, INIT_WIN_H);
+   evas_object_show(bd->win);
+}
+
+Enventor_Object *
+base_enventor_get(void)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(bd, NULL);
+
+   return bd->enventor;
+}
+
+void
+base_enventor_set(Enventor_Object *enventor)
+{
+   base_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   bd->enventor = enventor;
+
+   panes_text_editor_set(enventor);
+}
diff --git a/src/bin/build_setting.c b/src/bin/build_setting.c
new file mode 100644 (file)
index 0000000..9e9e4cc
--- /dev/null
@@ -0,0 +1,271 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "common.h"
+
+typedef struct build_setting_s
+{
+   Evas_Object *layout;
+   Evas_Object *main_edc_entry;
+   Evas_Object *img_path_entry;
+   Evas_Object *snd_path_entry;
+   Evas_Object *fnt_path_entry;
+   Evas_Object *dat_path_entry;
+
+} build_setting_data;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static Evas_Object *
+entry_create(Evas_Object *parent)
+{
+   Evas_Object *entry = elm_entry_add(parent);
+   elm_entry_single_line_set(entry, EINA_TRUE);
+   elm_entry_scrollable_set(entry, EINA_TRUE);
+   evas_object_show(entry);
+
+   return entry;
+}
+
+static void
+main_edc_entry_update(Evas_Object *entry, const char *path)
+{
+   elm_entry_entry_set(entry, path);
+}
+
+static void
+img_path_entry_update(Evas_Object *entry, Eina_List *edc_img_paths)
+{
+   elm_entry_entry_set(entry, NULL);
+
+   Eina_List *l;
+   char *edc_img_path;
+   EINA_LIST_FOREACH(edc_img_paths, l, edc_img_path)
+     {
+        elm_entry_entry_append(entry, edc_img_path);
+        elm_entry_entry_append(entry, ";");
+     }
+}
+
+static void
+fnt_path_entry_update(Evas_Object *entry, Eina_List *edc_fnt_paths)
+{
+   elm_entry_entry_set(entry, NULL);
+
+   Eina_List *l;
+   char *edc_fnt_path;
+   EINA_LIST_FOREACH(edc_fnt_paths, l, edc_fnt_path)
+     {
+        elm_entry_entry_append(entry, edc_fnt_path);
+        elm_entry_entry_append(entry, ";");
+     }
+}
+
+static void
+dat_path_entry_update(Evas_Object *entry, Eina_List *edc_dat_paths)
+{
+   elm_entry_entry_set(entry, NULL);
+
+   Eina_List *l;
+   char *edc_dat_path;
+   EINA_LIST_FOREACH(edc_dat_paths, l, edc_dat_path)
+     {
+        elm_entry_entry_append(entry, edc_dat_path);
+        elm_entry_entry_append(entry, ";");
+     }
+}
+
+static void
+snd_path_entry_update(Evas_Object *entry, Eina_List *edc_snd_paths)
+{
+   elm_entry_entry_set(entry, NULL);
+
+   Eina_List *l;
+   char *edc_snd_path;
+   EINA_LIST_FOREACH(edc_snd_paths, l, edc_snd_path)
+     {
+        elm_entry_entry_append(entry, edc_snd_path);
+        elm_entry_entry_append(entry, ";");
+     }
+}
+
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+void
+build_setting_focus_set(build_setting_data *bsd)
+{
+   EINA_SAFETY_ON_NULL_RETURN(bsd);
+
+   elm_object_focus_set(bsd->main_edc_entry, EINA_TRUE);
+}
+
+void
+build_setting_config_set(build_setting_data *bsd)
+{
+   if (!bsd) return;
+
+   config_input_path_set(elm_object_text_get(bsd->main_edc_entry));
+   config_img_path_set(elm_object_text_get(bsd->img_path_entry));
+   config_snd_path_set(elm_object_text_get(bsd->snd_path_entry));
+   config_fnt_path_set(elm_object_text_get(bsd->fnt_path_entry));
+   config_dat_path_set(elm_object_text_get(bsd->dat_path_entry));
+}
+
+void
+build_setting_reset(build_setting_data *bsd)
+{
+   if (!bsd) return;
+
+   main_edc_entry_update(bsd->main_edc_entry, config_input_path_get());
+   img_path_entry_update(bsd->img_path_entry,
+                         (Eina_List *)config_img_path_list_get());
+   snd_path_entry_update(bsd->snd_path_entry,
+                         (Eina_List *)config_snd_path_list_get());
+   fnt_path_entry_update(bsd->fnt_path_entry,
+                         (Eina_List *)config_fnt_path_list_get());
+   dat_path_entry_update(bsd->dat_path_entry,
+                         (Eina_List *)config_dat_path_list_get());
+}
+
+Evas_Object *
+build_setting_content_get(build_setting_data *bsd, Evas_Object *parent)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(bsd, NULL);
+
+   if (bsd->layout) return bsd->layout;
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(parent);
+   elm_layout_file_set(layout, EDJE_PATH, "build_setting_layout");
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(layout);
+
+   //Main EDC Path Entry
+   Evas_Object *main_edc_entry = entry_create(layout);
+   main_edc_entry_update(main_edc_entry, config_input_path_get());
+   elm_object_focus_set(main_edc_entry, EINA_TRUE);
+   elm_object_part_content_set(layout, "elm.swallow.main_edc_entry",
+                               main_edc_entry);
+   elm_layout_text_set(layout, "main_edc_guide", _("Main EDC File"));
+
+   //Main EDC Path Tooltip
+   Evas_Object *main_edc_tooltip = elm_button_add(layout);
+   elm_object_style_set(main_edc_tooltip, ENVENTOR_NAME);
+   elm_object_part_content_set(layout, "main_edc_tooltip", main_edc_tooltip);
+
+   elm_object_tooltip_text_set(main_edc_tooltip,
+                               _("Main EDC File path, which is containing<br>"
+                                 "collections, used for a current<br>"
+                                 "project."));
+   elm_object_focus_allow_set(main_edc_tooltip, EINA_FALSE);
+
+   //Image Path Entry
+   Evas_Object *img_path_entry = entry_create(layout);
+   img_path_entry_update(img_path_entry,
+                         (Eina_List *)config_img_path_list_get());
+   elm_object_part_content_set(layout, "elm.swallow.img_path_entry",
+                               img_path_entry);
+   //Tizen Only
+   elm_layout_text_set(layout, "img_path_guide", _("Image path"));
+
+   //Image Path Tooltip
+   Evas_Object *img_path_tooltip = elm_button_add(layout);
+   elm_object_style_set(img_path_tooltip, ENVENTOR_NAME);
+   elm_object_part_content_set(layout, "img_path_tooltip", img_path_tooltip);
+
+   elm_object_tooltip_text_set(img_path_tooltip,
+                               _("Image resource path used for<br>"
+                                 "a current project."));
+   elm_object_focus_allow_set(img_path_tooltip, EINA_FALSE);
+
+   //Sound Path Entry
+   Evas_Object *snd_path_entry = entry_create(layout);
+   snd_path_entry_update(snd_path_entry,
+                         (Eina_List *)config_snd_path_list_get());
+   elm_object_part_content_set(layout, "elm.swallow.snd_path_entry",
+                               snd_path_entry);
+   //Tizen Only
+   elm_layout_text_set(layout, "snd_path_guide", _("Sound path"));
+
+   //Sound Path Tooltip
+   Evas_Object *snd_path_tooltip = elm_button_add(layout);
+   elm_object_style_set(snd_path_tooltip, ENVENTOR_NAME);
+   elm_object_part_content_set(layout, "snd_path_tooltip", snd_path_tooltip);
+
+   elm_object_tooltip_text_set(snd_path_tooltip,
+                               _("Sound resource path used for<br>"
+                                 "a current project."));
+   elm_object_focus_allow_set(snd_path_tooltip, EINA_FALSE);
+
+   //Font Path Entry
+   Evas_Object *fnt_path_entry = entry_create(layout);
+   fnt_path_entry_update(fnt_path_entry,
+                         (Eina_List *)config_fnt_path_list_get());
+   elm_object_part_content_set(layout, "elm.swallow.fnt_path_entry",
+                               fnt_path_entry);
+   //Tizen Only
+   elm_layout_text_set(layout, "fnt_path_guide", _("Font path"));
+
+   //Font Path Tooltip
+   Evas_Object *font_path_tooltip = elm_button_add(layout);
+   elm_object_style_set(font_path_tooltip, ENVENTOR_NAME);
+   elm_object_part_content_set(layout, "fnt_path_tooltip", font_path_tooltip);
+
+   elm_object_tooltip_text_set(font_path_tooltip,
+                               _("Font resource path used for<br>"
+                                 "a current project."));
+   elm_object_focus_allow_set(font_path_tooltip, EINA_FALSE);
+
+   //Data Path Entry
+   Evas_Object *dat_path_entry = entry_create(layout);
+   dat_path_entry_update(dat_path_entry,
+                         (Eina_List *)config_dat_path_list_get());
+   elm_object_part_content_set(layout, "elm.swallow.dat_path_entry",
+                               dat_path_entry);
+   //Tizen Only
+   elm_layout_text_set(layout, "dat_path_guide", _("Data path"));
+
+   //Data Path Tooltip
+   Evas_Object *data_path_tooltip = elm_button_add(layout);
+   elm_object_style_set(data_path_tooltip, ENVENTOR_NAME);
+   elm_object_part_content_set(layout, "data_path_tooltip", data_path_tooltip);
+
+   elm_object_tooltip_text_set(data_path_tooltip,
+                        _("Data resource path used for<br>"
+                         "a current project."));
+   elm_object_focus_allow_set(data_path_tooltip, EINA_FALSE);
+
+   bsd->layout = layout;
+   bsd->main_edc_entry = main_edc_entry;
+   bsd->img_path_entry = img_path_entry;
+   bsd->snd_path_entry = snd_path_entry;
+   bsd->fnt_path_entry = fnt_path_entry;
+   bsd->dat_path_entry = dat_path_entry;
+
+   return layout;
+}
+
+build_setting_data *
+build_setting_init(void)
+{
+   build_setting_data *bsd = calloc(1, sizeof(build_setting_data));
+   if (!bsd)
+     {
+        EINA_LOG_ERR(_("Failed to allocate Memory!"));
+        return NULL;
+     }
+   return bsd;
+}
+
+void
+build_setting_term(build_setting_data *bsd)
+{
+   if (!bsd) return;
+
+   evas_object_del(bsd->layout);
+   free(bsd);
+}
diff --git a/src/bin/config_data.c b/src/bin/config_data.c
new file mode 100644 (file)
index 0000000..dd3b096
--- /dev/null
@@ -0,0 +1,1133 @@
+#include "common.h"
+
+typedef struct config_s
+{
+   const char *input_path;
+   const char *output_path;
+   //Tizen Only
+#ifdef _WIN32
+   const char *win_output_path;
+#endif
+   //
+   const char *workspace_path;
+   const char *font_name;
+   const char *font_style;
+
+   Eina_List *img_path_list;
+   Eina_List *snd_path_list;
+   Eina_List *fnt_path_list;
+   Eina_List *dat_path_list;
+   Eina_Strbuf *img_path_buf; //pre-stored image paths for compile.
+   Eina_Strbuf *snd_path_buf; //pre-stored sound paths for compile.
+   Eina_Strbuf *fnt_path_buf; //pre-stored font paths for compile.
+   Eina_Strbuf *dat_path_buf; //pre-stored data paths for compile.
+
+   Eina_List *syntax_color_list;
+
+   unsigned int version;
+   float font_scale;
+   double editor_size;
+   double console_size;
+
+   void (*update_cb)(void *data);
+   void *update_cb_data;
+   Evas_Coord view_size_w, view_size_h;
+   Evas_Coord win_size_w, win_size_h;
+   //Tizen Only
+   int color_palette;
+
+   Eina_Bool stats_bar;
+   Eina_Bool linenumber;
+   Eina_Bool part_highlight;
+   Eina_Bool dummy_parts;
+   Eina_Bool wireframes;
+   Eina_Bool mirror_mode;
+   Eina_Bool auto_indent;
+   Eina_Bool tools;
+   Eina_Bool console;
+   Eina_Bool auto_complete;
+   Eina_Bool smart_undo_redo;
+   Eina_Bool file_browser;
+   Eina_Bool edc_navigator;
+   Eina_Bool red_alert;
+   Eina_Bool file_tab;
+} config_data;
+
+static config_data *g_cd = NULL;
+static Eet_Data_Descriptor *edd_base = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+config_edj_path_update(config_data *cd)
+{
+   Eina_Tmpstr *tmp_path;
+#ifdef _WIN32
+   if (!eina_file_mkstemp(DEFAULT_EDJ_FORMAT, &tmp_path))
+#else
+   //apply edj path also
+   char buf[PATH_MAX];
+   char *ext = strstr(cd->input_path, ".edc");
+   const char *file = ecore_file_file_get(cd->input_path);
+   if (ext && file)
+     {
+        char filename[PATH_MAX];
+        snprintf(filename, (ext - file) + 1, "%s", file);
+        snprintf(buf, sizeof(buf), "%s_XXXXXX.edj", filename);
+     }
+   else
+     snprintf(buf, sizeof(buf), "%s_XXXXXX.edj", file);
+
+   if (!eina_file_mkstemp(buf, &tmp_path))
+#endif
+     {
+        EINA_LOG_ERR(_("Failed to generate tmp folder!"));
+        return;
+     }
+
+   eina_stringshare_replace(&cd->output_path, tmp_path);
+   eina_tmpstr_del(tmp_path);
+}
+
+static void
+config_save(config_data *cd)
+{
+   char buf[PATH_MAX];
+   const char *config_home = efreet_config_home_get();
+   if (!config_home) return;
+
+   //Create config home directory if it doesn't exist.
+   if (!ecore_file_exists(config_home))
+     {
+        Eina_Bool success = ecore_file_mkdir(config_home);
+        if (!success)
+          {
+             EINA_LOG_ERR(_("Cannot create a config folder \"%s\""),
+                          config_home);
+             return;
+          }
+     }
+
+   snprintf(buf, sizeof(buf), "%s/enventor", config_home);
+
+   //Create enventor config folder if it doesn't exist.
+   if (!ecore_file_exists(buf))
+     {
+        Eina_Bool success = ecore_file_mkdir(buf);
+        if (!success)
+          {
+             EINA_LOG_ERR(_("Cannot create a enventor config folder \"%s\""),
+                          buf);
+             return;
+          }
+     }
+
+   //Save config file.
+   snprintf(buf, sizeof(buf), "%s/enventor/config.eet", config_home);
+   Eet_File *ef = eet_open(buf, EET_FILE_MODE_WRITE);
+   if (!ef)
+     {
+        EINA_LOG_ERR(_("Cannot save a config file \"%s\""), buf);
+        return;
+     }
+
+   eet_data_write(ef, edd_base, "config", cd, 1);
+   eet_close(ef);
+}
+
+static Eina_Strbuf *
+config_paths_buf_set(Eina_List *paths, const char *prefix)
+{
+   Eina_List *l;
+   const char *s;
+
+   Eina_Strbuf *buf = eina_strbuf_new();
+
+   EINA_LIST_FOREACH(paths, l, s)
+     {
+        eina_strbuf_append(buf, prefix);
+        eina_strbuf_append(buf, s);
+     }
+
+   return buf;
+}
+
+static config_data *
+config_load(void)
+{
+   char buf[PATH_MAX];
+   snprintf(buf, sizeof(buf), "%s/enventor/config.eet",
+            efreet_config_home_get());
+
+   config_data *cd = NULL;
+   Eet_File *ef = eet_open(buf, EET_FILE_MODE_READ);
+   if (ef)
+     {
+        cd = eet_data_read(ef, edd_base, "config");
+        eet_close(ef);
+     }
+   else EINA_LOG_WARN(_("Cannot load a config file \"%s\""), buf);
+
+   //failed to load config file, create default structure.
+   if (!cd)
+     {
+        cd = calloc(1, sizeof(config_data));
+        if (!cd)
+          {
+             EINA_LOG_ERR(_("Failed to allocate Memory!"));
+             return NULL;
+          }
+     }
+   // loaded config is not compatile with current version of Enventor
+   if (!ef || cd->version < ENVENTOR_CONFIG_VERSION)
+     {
+        cd->img_path_list = NULL;
+        cd->snd_path_list = NULL;
+        cd->fnt_path_list = NULL;
+        cd->dat_path_list = NULL;
+        cd->font_scale = 1.4;
+        cd->view_size_w = 300;
+        cd->view_size_h = 300;
+        cd->win_size_w = WIN_DEFAULT_W;
+        cd->win_size_h = WIN_DEFAULT_H;
+        cd->editor_size = DEFAULT_EDITOR_SIZE;
+        cd->console_size = DEFAULT_CONSOLE_SIZE;
+        cd->color_palette = 1;
+        cd->stats_bar = EINA_TRUE;
+        cd->linenumber = EINA_TRUE;
+        cd->part_highlight = EINA_TRUE;
+        cd->dummy_parts = EINA_TRUE;
+        cd->wireframes = EINA_FALSE;
+        cd->mirror_mode = EINA_FALSE;
+        cd->auto_indent = EINA_TRUE;
+        cd->tools = EINA_TRUE;
+        cd->console = EINA_TRUE;
+        cd->auto_complete = EINA_TRUE;
+        cd->version = ENVENTOR_CONFIG_VERSION;
+        cd->smart_undo_redo = EINA_FALSE;
+        cd->file_browser = EINA_TRUE;
+        cd->edc_navigator = EINA_TRUE;
+        cd->red_alert = EINA_FALSE;
+        cd->file_tab = EINA_TRUE;
+     }
+
+   g_cd = cd;
+
+   if (!cd->img_path_list)
+     {
+        snprintf(buf, sizeof(buf), "%s/images", elm_app_data_dir_get());
+        config_img_path_set(buf);
+     }
+   else cd->img_path_buf =
+     config_paths_buf_set(cd->img_path_list, " -id ");
+
+   if (!cd->snd_path_list)
+     {
+        snprintf(buf, sizeof(buf), "%s/sounds", elm_app_data_dir_get());
+        config_snd_path_set(buf);
+     }
+   else cd->snd_path_buf =
+     config_paths_buf_set(cd->snd_path_list, " -sd ");
+
+   if (!cd->fnt_path_list)
+     {
+        snprintf(buf, sizeof(buf), "%s/fonts", elm_app_data_dir_get());
+        config_fnt_path_set(buf);
+     }
+   else cd->fnt_path_buf =
+     config_paths_buf_set(cd->fnt_path_list, " -fd ");
+
+   if (!cd->dat_path_list)
+     {
+        snprintf(buf, sizeof(buf), "%s/data", elm_app_data_dir_get());
+        config_dat_path_set(buf);
+     }
+   else cd->dat_path_buf =
+     config_paths_buf_set(cd->dat_path_list, " -dd ");
+
+   if (!cd->syntax_color_list)
+     {
+        Enventor_Syntax_Color_Type color_type = ENVENTOR_SYNTAX_COLOR_STRING;
+        for (; color_type < ENVENTOR_SYNTAX_COLOR_LAST; color_type++)
+          cd->syntax_color_list = eina_list_append(cd->syntax_color_list, NULL);
+     }
+
+   //Tizen Only : Add Tizen Font Path
+   const char default_font[] = "Eco Sans Mono";
+#ifdef _WIN32
+//   snprintf(buf, sizeof(buf), "c:\\Windows\\Fonts");
+   snprintf(buf, sizeof(buf), "%s/.fonts", eina_environment_home_get());
+#elif __APPLE__
+   snprintf(buf, sizeof(buf), "%s/Library/Fonts", eina_environment_home_get());
+#else
+   snprintf(buf, sizeof(buf), "%s/.fonts", eina_environment_home_get());
+#endif
+   evas_font_path_global_append(buf);
+
+   if (!cd->font_name)
+     eina_stringshare_replace(&cd->font_name, default_font);
+   if (!cd->font_style)
+     eina_stringshare_replace(&cd->font_style, "Regular");
+
+   return cd;
+}
+
+static void
+eddc_init(void)
+{
+   Eet_Data_Descriptor_Class eddc;
+   eet_eina_stream_data_descriptor_class_set(&eddc, sizeof(eddc),
+                                             "config", sizeof(config_data));
+   edd_base = eet_data_descriptor_stream_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(edd_base, config_data,
+                                       "img_path_list", img_path_list);
+   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(edd_base, config_data,
+                                       "snd_path_list", snd_path_list);
+   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(edd_base, config_data,
+                                       "fnt_path_list", fnt_path_list);
+   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(edd_base, config_data,
+                                       "dat_path_list", dat_path_list);
+   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(edd_base, config_data,
+                                       "syntax_color_list", syntax_color_list);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "version", version, EET_T_UINT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "font_name", font_name,
+                                 EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "font_style", font_style,
+                                 EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "font_scale", font_scale,
+                                 EET_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "editor_size",
+                                 editor_size, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "console_size",
+                                 console_size, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "view_size_w",
+                                 view_size_w, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "view_size_h",
+                                 view_size_h, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "win_size_w",
+                                 win_size_w, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "win_size_h",
+                                 win_size_h, EET_T_INT);
+   //Tizen Only
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "color_palette",
+                                 color_palette, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "stats_bar", stats_bar,
+                                 EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "linenumber",
+                                 linenumber, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "part_highlight",
+                                 part_highlight, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "dummy_parts",
+                                 dummy_parts, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "wireframes",
+                                 wireframes, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "mirror_mode",
+                                 mirror_mode, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "auto_indent",
+                                 auto_indent, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "tools",
+                                 tools, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "console",
+                                 console, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "auto_complete",
+                                    auto_complete, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "smart_undo_redo",
+                                    smart_undo_redo, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "file_browser",
+                                    file_browser, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "edc_navigator",
+                                    edc_navigator, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "red_alert",
+                                    red_alert, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "file_tab", file_tab,
+                                 EET_T_UCHAR);
+}
+
+void
+config_input_path_set(const char *input_path)
+{
+   config_data *cd = g_cd;
+   eina_stringshare_replace(&cd->input_path, input_path);
+   config_edj_path_update(cd);
+}
+
+Eina_Bool
+config_init(const char *input_path, const char *output_path,
+            const char *workspace_path,
+            Eina_List *img_path, Eina_List *snd_path,
+            Eina_List *fnt_path, Eina_List *dat_path)
+{
+   eddc_init();
+
+   config_data *cd = config_load();
+   if (!cd) return EINA_FALSE;
+   g_cd = cd;
+
+   if (input_path[0]) config_input_path_set(input_path);
+   //Tizen Only
+#ifdef _WIN32
+   if (output_path[0]) eina_stringshare_replace(&cd->win_output_path, output_path);
+#endif
+   //
+   if (output_path[0]) eina_stringshare_replace(&cd->output_path, output_path);
+
+   if (workspace_path[0])
+     eina_stringshare_replace(&cd->workspace_path, workspace_path);
+
+   if (img_path)
+     cd->img_path_list = img_path;
+
+   if (snd_path)
+     cd->snd_path_list = snd_path;
+
+   if (fnt_path)
+     cd->fnt_path_list = fnt_path;
+
+   if (dat_path)
+     cd->dat_path_list = dat_path;
+
+   return EINA_TRUE;
+}
+
+void
+config_term(void)
+{
+   config_data *cd = g_cd;
+   if (!cd) return;
+
+   config_save(cd);
+
+   eina_stringshare_del(cd->input_path);
+   eina_stringshare_del(cd->output_path);
+   //Tizen Only
+#ifdef _WIN32
+   eina_stringshare_del(cd->win_output_path);
+#endif
+   //
+   eina_stringshare_del(cd->workspace_path);
+
+   Eina_Stringshare *str;
+   EINA_LIST_FREE(cd->img_path_list, str) eina_stringshare_del(str);
+   EINA_LIST_FREE(cd->snd_path_list, str) eina_stringshare_del(str);
+   EINA_LIST_FREE(cd->fnt_path_list, str) eina_stringshare_del(str);
+   EINA_LIST_FREE(cd->dat_path_list, str) eina_stringshare_del(str);
+
+   EINA_LIST_FREE(cd->syntax_color_list, str) eina_stringshare_del(str);
+
+   if (cd->img_path_buf) eina_strbuf_free(cd->img_path_buf);
+   if (cd->snd_path_buf) eina_strbuf_free(cd->snd_path_buf);
+   if (cd->fnt_path_buf) eina_strbuf_free(cd->fnt_path_buf);
+   if (cd->dat_path_buf) eina_strbuf_free(cd->dat_path_buf);
+
+   eet_data_descriptor_free(edd_base);
+   free(cd);
+}
+
+void
+config_snd_path_set(const char *snd_path)
+{
+   config_data *cd = g_cd;
+
+   //Free the existing paths
+   const char *s;
+   EINA_LIST_FREE(cd->snd_path_list, s) eina_stringshare_del(s);
+
+   if (cd->snd_path_buf) eina_strbuf_free(cd->snd_path_buf);
+   cd->snd_path_buf = eina_strbuf_new();
+
+   //parse paths by ';'
+   const char *lex;
+   Eina_Stringshare *append;
+
+   while(snd_path && (strlen(snd_path) > 0))
+     {
+        lex = strstr(snd_path, ";");
+        if (lex)
+          {
+             append = eina_stringshare_add_length(snd_path,
+                                                  (lex - snd_path));
+             cd->snd_path_list = eina_list_append(cd->snd_path_list,
+                                                      append);
+             eina_strbuf_append(cd->snd_path_buf, " -sd ");
+             eina_strbuf_append(cd->snd_path_buf, append);
+             lex++;
+          }
+        else
+          {
+             append = eina_stringshare_add(snd_path);
+             cd->snd_path_list = eina_list_append(cd->snd_path_list,
+                                                      append);
+             eina_strbuf_append(cd->snd_path_buf, " -sd ");
+             eina_strbuf_append(cd->snd_path_buf, append);
+          }
+
+        snd_path = lex;
+     }
+}
+
+void
+config_dat_path_set(const char *dat_path)
+{
+   config_data *cd = g_cd;
+
+   //Free the existing paths
+   const char *s;
+   EINA_LIST_FREE(cd->dat_path_list, s) eina_stringshare_del(s);
+
+   if (cd->dat_path_buf) eina_strbuf_free(cd->dat_path_buf);
+   cd->dat_path_buf = eina_strbuf_new();
+
+   //parse paths by ';'
+   const char *lex;
+   Eina_Stringshare *append;
+
+   while(dat_path && (strlen(dat_path) > 0))
+     {
+        lex = strstr(dat_path, ";");
+        if (lex)
+          {
+             append = eina_stringshare_add_length(dat_path,
+                                                  (lex - dat_path));
+             cd->dat_path_list = eina_list_append(cd->dat_path_list,
+                                                      append);
+             eina_strbuf_append(cd->dat_path_buf, " -dd ");
+             eina_strbuf_append(cd->dat_path_buf, append);
+             lex++;
+          }
+        else
+          {
+             append = eina_stringshare_add(dat_path);
+             cd->dat_path_list = eina_list_append(cd->dat_path_list,
+                                                      append);
+             eina_strbuf_append(cd->dat_path_buf, " -dd ");
+             eina_strbuf_append(cd->dat_path_buf, append);
+          }
+
+        dat_path = lex;
+     }
+}
+
+void
+config_fnt_path_set(const char *fnt_path)
+{
+   config_data *cd = g_cd;
+
+   //Free the existing paths
+   const char *s;
+   EINA_LIST_FREE(cd->fnt_path_list, s) eina_stringshare_del(s);
+
+   if (cd->fnt_path_buf) eina_strbuf_free(cd->fnt_path_buf);
+   cd->fnt_path_buf = eina_strbuf_new();
+
+   //parse paths by ';'
+   const char *lex;
+   Eina_Stringshare *append;
+
+   while(fnt_path && (strlen(fnt_path) > 0))
+     {
+        lex = strstr(fnt_path, ";");
+        if (lex)
+          {
+             append = eina_stringshare_add_length(fnt_path,
+                                                  (lex - fnt_path));
+             cd->fnt_path_list = eina_list_append(cd->fnt_path_list,
+                                                      append);
+             eina_strbuf_append(cd->fnt_path_buf, " -fd ");
+             eina_strbuf_append(cd->fnt_path_buf, append);
+             lex++;
+          }
+        else
+          {
+             append = eina_stringshare_add(fnt_path);
+             cd->fnt_path_list = eina_list_append(cd->fnt_path_list,
+                                                      append);
+             eina_strbuf_append(cd->fnt_path_buf, " -fd ");
+             eina_strbuf_append(cd->fnt_path_buf, append);
+          }
+
+        fnt_path = lex;
+     }
+}
+
+void
+config_img_path_set(const char *img_path)
+{
+   config_data *cd = g_cd;
+
+   //Free the existing paths
+   const char *s;
+   EINA_LIST_FREE(cd->img_path_list, s) eina_stringshare_del(s);
+
+   if (cd->img_path_buf) eina_strbuf_free(cd->img_path_buf);
+   cd->img_path_buf = eina_strbuf_new();
+
+   //parse paths by ';'
+   const char *lex;
+   Eina_Stringshare *append;
+
+   while(img_path && (strlen(img_path) > 0))
+     {
+        lex = strstr(img_path, ";");
+        if (lex)
+          {
+             append = eina_stringshare_add_length(img_path,
+                                                  (lex - img_path));
+             cd->img_path_list = eina_list_append(cd->img_path_list,
+                                                      append);
+             eina_strbuf_append(cd->img_path_buf, " -id ");
+             eina_strbuf_append(cd->img_path_buf, append);
+             lex++;
+          }
+        else
+          {
+             append = eina_stringshare_add(img_path);
+             cd->img_path_list = eina_list_append(cd->img_path_list,
+                                                      append);
+             eina_strbuf_append(cd->img_path_buf, " -id ");
+             eina_strbuf_append(cd->img_path_buf, append);
+          }
+
+        img_path = lex;
+     }
+}
+
+void
+config_apply(void)
+{
+   config_data *cd = g_cd;
+   if (cd->update_cb) cd->update_cb(cd->update_cb_data);
+}
+
+Eina_List *
+config_img_path_list_get(void)
+{
+   config_data *cd = g_cd;
+   return cd->img_path_list;
+}
+
+Eina_List *
+config_snd_path_list_get(void)
+{
+   config_data *cd = g_cd;
+   return cd->snd_path_list;
+}
+
+Eina_List *
+config_dat_path_list_get(void)
+{
+   config_data *cd = g_cd;
+   return cd->dat_path_list;
+}
+
+Eina_List *
+config_fnt_path_list_get(void)
+{
+   config_data *cd = g_cd;
+   return cd->fnt_path_list;
+}
+
+const char *
+config_img_path_get(void)
+{
+   config_data *cd = g_cd;
+   if (!cd->img_path_buf) return NULL;
+   return eina_strbuf_string_get(cd->img_path_buf);
+}
+
+const char *
+config_snd_path_get(void)
+{
+   config_data *cd = g_cd;
+   if (!cd->snd_path_buf) return NULL;
+   return eina_strbuf_string_get(cd->snd_path_buf);
+}
+
+const char *
+config_dat_path_get(void)
+{
+   config_data *cd = g_cd;
+   if (!cd->dat_path_buf) return NULL;
+   return eina_strbuf_string_get(cd->dat_path_buf);
+}
+
+const char *
+config_fnt_path_get(void)
+{
+   config_data *cd = g_cd;
+   if (!cd->fnt_path_buf) return NULL;
+   return eina_strbuf_string_get(cd->fnt_path_buf);
+}
+
+const char *
+config_input_path_get(void)
+{
+   config_data *cd = g_cd;
+   return cd->input_path;
+}
+
+const char *
+config_output_path_get(void)
+{
+   config_data *cd = g_cd;
+   return cd->output_path;
+}
+
+//Tizen Only
+#ifdef _WIN32
+const char *
+config_win_output_path_get(void)
+{
+   config_data *cd = g_cd;
+   return cd->win_output_path;
+}
+#endif
+
+const char *
+config_workspace_path_get(void)
+{
+   config_data *cd = g_cd;
+   return cd->workspace_path;
+}
+
+void
+config_syntax_color_set(Enventor_Syntax_Color_Type color_type,
+                        const char *val)
+{
+   config_data *cd = g_cd;
+   Eina_List *target_list;
+
+   target_list = eina_list_nth_list(cd->syntax_color_list, color_type);
+   if (!target_list) return;
+
+   eina_stringshare_del(eina_list_data_get(target_list));
+   if (val)
+     eina_list_data_set(target_list, eina_stringshare_add(val));
+}
+
+const char *
+config_syntax_color_get(Enventor_Syntax_Color_Type color_type)
+{
+   config_data *cd = g_cd;
+   return (const char *) eina_list_nth(cd->syntax_color_list, color_type);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+Eina_Bool
+config_linenumber_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->linenumber;
+}
+
+void
+config_linenumber_set(Eina_Bool enabled)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->linenumber = enabled;
+}
+
+Eina_Bool
+config_file_tab_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->file_tab;
+}
+
+void
+config_file_tab_set(Eina_Bool enabled)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->file_tab = enabled;
+}
+
+Eina_Bool
+config_stats_bar_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->stats_bar;
+}
+
+void
+config_stats_bar_set(Eina_Bool enabled)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->stats_bar = enabled;
+}
+
+void
+config_update_cb_set(void (*cb)(void *data), void *data)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->update_cb = cb;
+   cd->update_cb_data = data;
+}
+
+Eina_Bool
+config_part_highlight_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->part_highlight;
+}
+
+void
+config_part_highlight_set(Eina_Bool highlight)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->part_highlight = highlight;
+}
+
+Eina_Bool
+config_dummy_parts_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->dummy_parts;
+}
+
+void
+config_dummy_parts_set(Eina_Bool dummy_parts)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->dummy_parts = dummy_parts;
+}
+
+Eina_Bool
+config_wireframes_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->wireframes;
+}
+
+void
+config_wireframes_set(Eina_Bool wireframes)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->wireframes = wireframes;
+}
+
+Eina_Bool
+config_mirror_mode_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->mirror_mode;
+}
+
+void
+config_mirror_mode_set(Eina_Bool mirror_mode)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->mirror_mode = mirror_mode;
+}
+
+Eina_Bool
+config_auto_indent_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->auto_indent;
+}
+
+Eina_Bool
+config_auto_complete_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->auto_complete;
+}
+
+void
+config_font_set(const char *font_name, const char *font_style)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   eina_stringshare_replace(&cd->font_name, font_name);
+   eina_stringshare_replace(&cd->font_style, font_style);
+}
+
+void
+config_font_get(const char **font_name, const char **font_style)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   if (font_name) *font_name = cd->font_name;
+   if (font_style) *font_style = cd->font_style;
+}
+
+void
+config_font_scale_set(float font_scale)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   if (font_scale > MAX_FONT_SCALE)
+     font_scale = MAX_FONT_SCALE;
+   else if (font_scale < MIN_FONT_SCALE)
+     font_scale = MIN_FONT_SCALE;
+
+   cd->font_scale = font_scale;
+}
+
+float
+config_font_scale_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, 0);
+
+   return cd->font_scale;
+}
+
+//Tizen Only
+int
+config_font_color_palette_get(void)
+{
+   config_data *cd = g_cd;
+   return cd->color_palette;
+}
+
+void
+config_font_color_palette_set(int color_palette)
+{
+   config_data *cd = g_cd;
+   cd->color_palette = color_palette;
+}
+
+Eina_Bool
+config_smart_undo_redo_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->smart_undo_redo;
+}
+
+void
+config_smart_undo_redo_set(Eina_Bool smart_undo_redo)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->smart_undo_redo = smart_undo_redo;
+}
+
+void
+config_auto_complete_set(Eina_Bool auto_complete)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->auto_complete = auto_complete;
+}
+
+void
+config_auto_indent_set(Eina_Bool auto_indent)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->auto_indent = auto_indent;
+}
+
+void
+config_view_size_set(Evas_Coord w, Evas_Coord h)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->view_size_w = w;
+   cd->view_size_h = h;
+}
+
+void
+config_view_size_get(Evas_Coord *w, Evas_Coord *h)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   if (w) *w = cd->view_size_w;
+   if (h) *h = cd->view_size_h;
+}
+
+double
+config_editor_size_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, 0);
+
+   return cd->editor_size;
+}
+
+void
+config_editor_size_set(double size)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->editor_size = size;
+}
+
+double
+config_console_size_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, 0);
+
+   return cd->console_size;
+}
+
+void
+config_console_size_set(double size)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->console_size = size;
+}
+
+void
+config_win_size_set(Evas_Coord w, Evas_Coord h)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->win_size_w = w;
+   cd->win_size_h = h;
+}
+
+void
+config_win_size_get(Evas_Coord *w, Evas_Coord *h)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   if (w) *w = cd->win_size_w;
+   if (h) *h = cd->win_size_h;
+}
+
+Eina_Bool
+config_console_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->console;
+}
+
+void
+config_console_set(Eina_Bool enabled)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->console = enabled;
+}
+
+Eina_Bool
+config_tools_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->tools;
+}
+
+void
+config_tools_set(Eina_Bool enabled)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->tools = enabled;
+}
+
+void
+config_red_alert_set(Eina_Bool enabled)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->red_alert = enabled;
+}
+
+Eina_Bool
+config_red_alert_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->red_alert;
+}
+
+void
+config_file_browser_set(Eina_Bool enabled)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->file_browser = enabled;
+}
+
+Eina_Bool
+config_file_browser_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->file_browser;
+}
+
+void
+config_edc_navigator_set(Eina_Bool enabled)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN(cd);
+
+   cd->edc_navigator = enabled;
+}
+
+Eina_Bool
+config_edc_navigator_get(void)
+{
+   config_data *cd = g_cd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cd, EINA_FALSE);
+
+   return cd->edc_navigator;
+}
diff --git a/src/bin/console.c b/src/bin/console.c
new file mode 100644 (file)
index 0000000..273ee59
--- /dev/null
@@ -0,0 +1,201 @@
+#include "common.h"
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+token_value_get(char *src, char *key_str, char end_key, int offset, char *dst)
+{
+   char *psrc = src;
+   int count = 0;
+   psrc += strlen(key_str) + offset;
+   while (*psrc != end_key)
+     dst[count++] = *psrc++;
+   dst[count] = '\0';
+}
+
+static void
+error_word_select(Evas_Object *console)
+{
+   Enventor_Item *it = file_mgr_focused_item_get();
+   if (!it)
+     {
+        EINA_LOG_ERR("No focused item??");
+        return;
+     }
+
+   if (elm_entry_is_empty(console)) return;
+
+   //Convert console text including markup text to the plain text
+   const char *markup_text = elm_entry_entry_get(console);
+   if (!markup_text) return;
+   char *console_text = elm_entry_markup_to_utf8(markup_text);
+   if (!console_text) return;
+
+   char error_word[1024];
+   char error_line[1024];
+   char *error_token, *edc_token;
+
+   //Parse edc line
+   if ((edc_token = strstr(console_text, "edc : ")))
+     token_value_get(edc_token, "edc : ", ' ', 0, error_line);
+   else
+     goto end;
+
+   //Parse error word
+   if ((error_token = strstr(console_text, "keyword")))
+     token_value_get(error_token, "keyword", ' ', 1, error_word);
+   else if ((error_token = strstr(console_text, "name")))
+     token_value_get(error_token, "name", ' ', 1, error_word);
+   else
+     goto end;
+
+   //Find error word position
+   enventor_item_line_goto(it, atoi(error_line));
+   int pos = enventor_item_cursor_pos_get(it);
+   const char *entry_text = enventor_item_text_get(it);
+   char *utf8 = elm_entry_markup_to_utf8(entry_text);
+   if(!utf8) goto end;
+
+   const char *search_line = utf8 + pos;
+   const char *matched = strstr(search_line, error_word);
+   if (!matched)
+     {
+        free(utf8);
+        goto end;
+     }
+
+   int start, end;
+   start = matched - utf8;
+   end = start + strlen(error_word);
+
+   //Select error word
+   enventor_item_select_region_set(it, start, end);
+   free(utf8);
+
+end:
+   free(console_text);
+}
+
+static void
+set_console_error_msg(Evas_Object *console, const char *src)
+{
+   if (!src || !strcmp(src, ""))
+     {
+        elm_entry_entry_set(console, NULL);
+        return;
+     }
+
+   /* We cut error messages since it contains unnecessary information.
+      Most of the time, first one line has a practical information. */
+   const char *new_line  = "<br/>";
+   const char *eol = strstr(src, new_line);
+   if (!eol) return;
+
+   char * single_error_msg = alloca((eol - src) + 1);
+   if (!single_error_msg) return;
+
+   strncpy(single_error_msg, src, eol - src);
+   single_error_msg[eol - src] = '\0';
+
+   char *color_msg = error_msg_syntax_color_set(single_error_msg);
+   elm_entry_entry_set(console, color_msg);
+   free(color_msg);
+}
+
+char*
+error_msg_syntax_color_set(char *text)
+{
+   char *color_error_msg;
+   const char color_end[] = "</color>";
+
+   //Tizen Only
+   const char color_default[] = "<color=#666666>";
+   const char color_red[] = "<color=#eb5555>";
+   const char color_green[] = "<color=#008aee>";
+   const char color_yellow[] = "<color=#f5832c>";
+   //const char color_red[] = "<color=#FF4848>";
+   //const char color_green[] = "<color=#5CD1E5>";
+   //const char color_yellow[] = "<color=#FFBB00>";
+
+   color_error_msg = (char *)calloc(1024, sizeof(char));
+   char *token = strtok(text, " ");
+   //Tizen Only
+   strncat(color_error_msg, color_default, 15);
+   //
+   while (token != NULL)
+     {
+        if (strstr(token, "edje_cc:"))
+          {
+             strncat(color_error_msg, color_red, 15);
+             strncat(color_error_msg, token, strlen(token));
+             strncat(color_error_msg, color_end, 8);
+          }
+        else if (strstr(token, "Error"))
+          {
+             strncat(color_error_msg, color_red, 15);
+             strncat(color_error_msg, token, strlen(token));
+             strncat(color_error_msg, color_end, 8);
+          }
+        else if (strstr(token, ".edc"))
+          {
+             strncat(color_error_msg, color_yellow, 15);
+             if (strstr(strstr(token, ".edc"), ":"))
+               {
+                  char *number = strstr(strstr(token, ".edc"), ":");
+                  int len = strlen(token) - strlen(number);
+                  strncat(color_error_msg, token, len);
+                  strncat(color_error_msg, color_end, 8);
+                  strncat(color_error_msg, " : ", 3);
+                  strncat(color_error_msg, color_green, 15);
+                  strncat(color_error_msg, number + 1, strlen(number) - 1);
+                  strncat(color_error_msg, color_end, 8);
+               }
+             else
+               {
+                  strncat(color_error_msg, token, strlen(token));
+                  strncat(color_error_msg, color_end, 8);
+               }
+          }
+        else
+          {
+             strncat(color_error_msg, token, strlen(token));
+          }
+        strncat(color_error_msg, " ", 1);
+        token = strtok(NULL, " ");
+     }
+   //Tizen Only
+   strncat(color_error_msg, color_end, 8);
+   //
+   return color_error_msg;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+console_text_set(Evas_Object *console, const char *text)
+{
+   set_console_error_msg(console, text);
+   error_word_select(console);
+}
+
+Evas_Object *
+console_create(Evas_Object *parent)
+{
+   Evas_Object *obj = elm_entry_add(parent);
+   //Tizen Only
+   elm_object_style_set(obj, "enventor_console");
+   //
+   elm_entry_scrollable_set(obj, EINA_TRUE);
+   elm_entry_editable_set(obj, EINA_FALSE);
+   elm_entry_line_wrap_set(obj, ELM_WRAP_WORD);
+   elm_object_focus_allow_set(obj, EINA_FALSE);
+   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);
+
+   return obj;
+}
diff --git a/src/bin/edc_navigator.c b/src/bin/edc_navigator.c
new file mode 100644 (file)
index 0000000..717dd89
--- /dev/null
@@ -0,0 +1,1683 @@
+#include "common.h"
+
+#define EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT
+#include <Edje_Edit.h>
+
+#define IDX_MAX 999999
+#define PROGRAM_IDX (IDX_MAX - 1)
+
+#define ESCAPE_GOTO_END() \
+   p++; \
+   p = strstr(p, "\""); \
+   if (!p) goto end; \
+   p++; \
+   continue
+
+#define ESCAPE_RET_NULL() \
+   p++; \
+   p = strstr(p, "\""); \
+   if (!p) return NULL; \
+   p++; \
+   continue
+
+typedef struct group_it_s group_it;
+typedef struct part_it_s part_it;
+typedef struct state_it_s state_it;
+typedef struct programs_it_s programs_it;
+typedef struct program_it_s program_it;
+typedef struct list_it_s list_it;
+
+typedef struct edc_navigator_s
+{
+   Evas_Object *base_layout;
+   Evas_Object *genlist;
+
+   Eina_List *groups;
+
+   Elm_Genlist_Item_Class *group_itc;
+   Elm_Genlist_Item_Class *part_itc;
+   Elm_Genlist_Item_Class *state_itc;
+   Elm_Genlist_Item_Class *programs_itc;
+   Elm_Genlist_Item_Class *program_itc;
+
+   Eina_Bool selected : 1;
+
+} navi_data;
+
+typedef enum
+{
+   Item_Type_Group = 0,
+   Item_Type_Part = 1,
+   Item_Type_State = 2,
+   Item_Type_Programs = 3,
+   Item_Type_Program = 4
+} Item_Type;
+
+struct list_it_s
+{
+   Item_Type type;
+   int idx;
+};
+
+struct programs_it_s
+{
+   list_it tag;
+   Elm_Object_Item *it;
+   Eina_List *programs;
+   group_it *git;
+};
+
+struct group_it_s
+{
+   list_it tag;
+   char *name;
+   Elm_Object_Item *it;
+   Eina_List *parts;
+   navi_data *nd;
+
+   programs_it programs;
+
+   Eina_Bool discarded: 1;
+};
+
+struct part_it_s
+{
+   list_it tag;
+   char *name;
+   Elm_Object_Item *it;
+   Edje_Part_Type type;
+   Eina_List *states;
+   group_it *git;
+
+   Eina_Bool discarded : 1;
+};
+
+struct state_it_s
+{
+   list_it tag;
+   char *name;
+   Elm_Object_Item *it;
+   part_it *pit;
+
+   Eina_Bool discarded : 1;
+};
+
+struct program_it_s
+{
+   list_it tag;
+   char *name;
+   Elm_Object_Item *it;
+   programs_it *pit;
+
+   Eina_Bool discarded : 1;
+};
+
+static navi_data *g_nd = NULL;
+
+static const char *RECT_TYPE_STR = "rect";
+static const char *TEXT_TYPE_STR = "text";
+static const char *IMAGE_TYPE_STR = "image";
+static const char *SWALLOW_TYPE_STR = "swallow";
+static const char *TEXTBLOCK_TYPE_STR = "textblock";
+static const char *SPACER_TYPE_STR = "spacer";
+static const char *PART_TYPE_STR = "part";
+
+static void group_contract(group_it *git);
+static void part_contract(part_it *pit);
+static void programs_contract(programs_it *pit);
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+static void
+gl_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   navi_data *nd = data;
+   nd->selected = EINA_TRUE;
+}
+
+static void
+gl_unselected_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                 void *event_info EINA_UNUSED)
+{
+   navi_data *nd = data;
+   nd->selected = EINA_FALSE;
+}
+
+static void
+navigator_item_deselect(navi_data *nd)
+{
+   Elm_Object_Item *it = elm_genlist_selected_item_get(nd->genlist);
+   if (it) elm_genlist_item_selected_set(it, EINA_FALSE);
+}
+
+static void
+navigator_state_free(state_it *sit)
+{
+   elm_object_item_del(sit->it);
+   free(sit->name);
+   free(sit);
+}
+
+static void
+navigator_states_clear(part_it *pit)
+{
+   state_it *sit;
+   EINA_LIST_FREE(pit->states, sit)
+     navigator_state_free(sit);
+
+   pit->states = NULL;
+}
+
+static void
+navigator_program_free(program_it *pit)
+{
+   elm_object_item_del(pit->it);
+   free(pit->name);
+   free(pit);
+}
+
+static void
+navigator_sub_programs_clear(programs_it *pit)
+{
+   program_it *spit;
+   EINA_LIST_FREE(pit->programs, spit)
+     navigator_program_free(spit);
+
+   pit->programs = NULL;
+}
+
+static void
+navigator_part_free(part_it *pit)
+{
+   state_it *sit;
+   EINA_LIST_FREE(pit->states, sit)
+     navigator_state_free(sit);
+
+   elm_object_item_del(pit->it);
+   free(pit->name);
+   free(pit);
+}
+
+static void
+navigator_parts_clear(group_it *git)
+{
+   part_it *pit;
+   EINA_LIST_FREE(git->parts, pit)
+     navigator_part_free(pit);
+
+   git->parts = NULL;
+}
+
+static void
+navigator_programs_clear(group_it *git)
+{
+   programs_it *pit = &git->programs;
+
+   if (!pit->it) return;
+
+   program_it *spit;
+   EINA_LIST_FREE(pit->programs, spit)
+     navigator_program_free(spit);
+
+   pit->programs = NULL;
+   elm_object_item_del(pit->it);
+   pit->it = NULL;
+}
+
+static void
+navigator_group_free(group_it *git)
+{
+   navigator_parts_clear(git);
+   navigator_programs_clear(git);
+   elm_object_item_del(git->it);
+   free(git->name);
+   free(git);
+}
+
+static void
+navigator_groups_clear(navi_data *nd)
+{
+   group_it *git;
+   EINA_LIST_FREE(nd->groups, git)
+     navigator_group_free(git);
+
+   nd->groups = NULL;
+}
+
+static const char *
+part_type_get(part_it *pit)
+{
+   switch (pit->type)
+     {
+      case EDJE_PART_TYPE_RECTANGLE:
+         return RECT_TYPE_STR;
+      case EDJE_PART_TYPE_TEXT:
+         return TEXT_TYPE_STR;
+      case EDJE_PART_TYPE_IMAGE:
+         return IMAGE_TYPE_STR;
+      case EDJE_PART_TYPE_SWALLOW:
+         return SWALLOW_TYPE_STR;
+      case EDJE_PART_TYPE_TEXTBLOCK:
+         return TEXTBLOCK_TYPE_STR;
+      case EDJE_PART_TYPE_SPACER:
+         return SPACER_TYPE_STR;
+      default:
+         return PART_TYPE_STR;
+     }
+}
+
+static char *
+find_group_proc_internal(char *utf8, char *utf8_end, const char *group_name)
+{
+   char *p = utf8;
+   char *result = NULL;
+
+   int group_name_len = strlen(group_name);
+
+   //Find group
+   while (utf8_end > p)
+     {
+        //Skip " ~ " Section
+        if (*p == '\"')
+          {
+             ESCAPE_RET_NULL();
+          }
+
+        if (!strncmp("group", p, strlen("group")))
+          {
+             p = strstr((p + 5), "\"");
+             if (!p) return NULL;
+             p++;
+             if (!strncmp(group_name, p, group_name_len))
+               {
+                  //Compare Elaborately
+                  char *next_quote = strstr(p, "\"");
+                  if (group_name_len == (next_quote - p))
+                    {
+                       result = p;
+                       break;
+                    }
+                  else
+                    {
+                       ESCAPE_RET_NULL();
+                    }
+               }
+             else
+               {
+                  ESCAPE_RET_NULL();
+               }
+          }
+        p++;
+     }
+
+   return result;
+}
+
+static void
+find_group_proc(const char *group_name)
+{
+   if (!group_name) return;
+
+   const char *text = enventor_item_text_get(file_mgr_focused_item_get());
+
+   if (!text) return;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   char *utf8_end = utf8 + strlen(utf8);
+   char *result = find_group_proc_internal(utf8, utf8_end, group_name);
+
+   //No found
+   if (!result) goto end;
+
+   //Got you!
+   enventor_item_select_region_set(file_mgr_focused_item_get(),
+                                   (result - utf8),
+                                   (result - utf8) + strlen(group_name));
+end:
+   free(utf8);
+}
+
+static char *
+find_part_proc_internal(char *utf8, char *utf8_end, const char* group_name,
+                        const char *part_name, const char *part_type)
+{
+   char *p = find_group_proc_internal(utf8, utf8_end, group_name);
+
+   //No found
+   if (!p) return NULL;
+
+   p = strstr(p, "\"");
+   if (!p) return NULL;
+   p++;
+
+   char *result = NULL;
+
+   //goto parts
+   p = strstr(p, "parts");
+   if (!p) return NULL;
+
+   int part_name_len = strlen(part_name);
+
+   //Find part
+   while (utf8_end > p)
+     {
+        //Skip " ~ " Section
+        if (*p == '\"')
+          {
+             ESCAPE_RET_NULL();
+          }
+
+        if (!strncmp(part_type, p, strlen(part_type)))
+          {
+             p = strstr((p + strlen(part_type)), "\"");
+             if (!p) return NULL;
+             p++;
+             if (!strncmp(part_name, p, part_name_len))
+               {
+                  //Compare Elaborately
+                  char *next_quote = strstr(p, "\"");
+                  if (part_name_len == (next_quote - p))
+                    {
+                       result = p;
+                       break;
+                    }
+                  else
+                    {
+                       ESCAPE_RET_NULL();
+                    }
+               }
+             else
+               {
+                  ESCAPE_RET_NULL();
+               }
+          }
+
+        //compatibility: "part"
+        if (!strncmp("part", p, strlen("part")))
+          {
+             p = strstr((p + 4), "\"");
+             if (!p) return NULL;
+             p++;
+             if (!strncmp(part_name, p, strlen(part_name)))
+               {
+                  //Compare Elaborately
+                  char *next_quote = strstr(p, "\"");
+                  if (part_name_len == (next_quote - p))
+                    {
+                       result = p;
+                       break;
+                    }
+                  else
+                    {
+                       ESCAPE_RET_NULL();
+                    }
+               }
+             else
+               {
+                  ESCAPE_RET_NULL();
+               }
+          }
+
+        p++;
+     }
+
+   return result;
+}
+
+static void
+find_part_proc(const char *group_name, const char *part_name,
+               const char *part_type)
+{
+   if (!group_name || !part_name) return;
+
+   const char *text = enventor_item_text_get(file_mgr_focused_item_get());
+   if (!text) return;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   char *utf8_end = utf8 + strlen(utf8);
+
+   const char *result = find_part_proc_internal(utf8, utf8_end, group_name,
+                                                part_name, part_type);
+   if (!result) goto end;
+
+   //Got you!
+   enventor_item_select_region_set(file_mgr_focused_item_get(),
+                                   (result - utf8),
+                                   (result - utf8) + strlen(part_name));
+end:
+   free(utf8);
+}
+
+static void
+find_state_proc(const char *group_name, const char *part_name,
+                const char *part_type, const char *state_name)
+{
+   if (!group_name || !part_name) return;
+
+   const char *text = enventor_item_text_get(file_mgr_focused_item_get());
+   if (!text) return;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   char *utf8_end = utf8 + strlen(utf8);
+
+   char *p = find_part_proc_internal(utf8, utf8_end, group_name,
+                                     part_name, part_type);
+   if (!p) goto end;
+
+   p = strstr(p, "\"");
+   if (!p) goto end;
+   p++;
+
+   char *result = NULL;
+
+   int state_name_len = strlen(state_name);
+
+   //Find programs
+   while (utf8_end > p)
+     {
+        //Skip " ~ " Section
+        if (*p == '\"')
+          {
+             ESCAPE_GOTO_END();
+          }
+
+        if (!strncmp("desc", p, strlen("desc")))
+          {
+             p = strstr((p + 4), "\"");
+             if (!p) goto end;
+             p++;
+             if (!strncmp(state_name, p, state_name_len))
+               {
+                  //Compare Elaborately
+                  char *next_quote = strstr(p, "\"");
+                  if (state_name_len == (next_quote - p))
+                    {
+                       result = p;
+                       break;
+                    }
+                  else
+                    {
+                       ESCAPE_GOTO_END();
+                    }
+               }
+             else
+               {
+                  ESCAPE_GOTO_END();
+               }
+          }
+        p++;
+     }
+
+   if (!result) goto end;
+
+   //Got you!
+   enventor_item_select_region_set(file_mgr_focused_item_get(),
+                                   (result - utf8),
+                                   (result - utf8) + strlen(state_name));
+end:
+   free(utf8);
+}
+
+static char*
+find_programs_proc_internal(char *utf8, char *utf8_end, const char *group_name)
+{
+   char *p = find_group_proc_internal(utf8, utf8_end, group_name);
+   if (!p) return NULL;
+
+   p = strstr(p, "\"");
+   if (!p) return NULL;
+   p++;
+
+   char *result = NULL;
+
+   //Find programs
+   while (utf8_end > p)
+     {
+        //Skip " ~ " Section
+        if (*p == '\"')
+          {
+             ESCAPE_RET_NULL();
+          }
+
+        if (!strncmp("programs", p, strlen("programs")))
+          {
+             result = p;
+             break;
+          }
+        p++;
+     }
+
+   return result;
+}
+
+static void
+find_programs_proc(const char *group_name)
+{
+   if (!group_name) return;
+
+   const char *text = enventor_item_text_get(file_mgr_focused_item_get());
+   if (!text) return;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   char *utf8_end = utf8 + strlen(utf8);
+
+   char *result = find_programs_proc_internal(utf8, utf8_end, group_name);
+
+   //No found
+   if (!result) goto end;
+
+   //Got you!
+   enventor_item_select_region_set(file_mgr_focused_item_get(),
+                                   (result - utf8),
+                                   (result - utf8) + strlen("programs"));
+end:
+   free(utf8);
+}
+
+static void
+find_program_proc(const char *group_name, const char *program_name)
+{
+   if (!group_name || !program_name) return;
+
+   const char *text = enventor_item_text_get(file_mgr_focused_item_get());
+   if (!text) return;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   char *utf8_end = utf8 + strlen(utf8);
+   char *p = find_programs_proc_internal(utf8, utf8_end, group_name);
+   if (!p) goto end;
+
+   char *result = NULL;
+
+   p += strlen("programs");
+
+   int program_name_len = strlen(program_name);
+
+   //Find program
+   while (utf8_end > p)
+     {
+        //Skip " ~ " Section
+        if (*p == '\"')
+          {
+             ESCAPE_GOTO_END();
+          }
+
+        if (!strncmp("program", p, strlen("program")))
+          {
+             p = strstr((p + 6), "\"");
+             if (!p) goto end;
+             p++;
+             if (!strncmp(program_name, p, program_name_len))
+               {
+                  //Compare Elaborately
+                  char *next_quote = strstr(p, "\"");
+                  if (program_name_len == (next_quote - p))
+                    {
+                       result = p;
+                       break;
+                    }
+                  else
+                    {
+                       ESCAPE_GOTO_END();
+                    }
+               }
+             else
+               {
+                  ESCAPE_GOTO_END();
+               }
+          }
+        p++;
+     }
+
+   //No found
+   if (!result) goto end;
+
+   //Got you!
+   enventor_item_select_region_set(file_mgr_focused_item_get(),
+                                   (result - utf8),
+                                   (result - utf8) + strlen(program_name));
+end:
+   free(utf8);
+}
+
+/* State Related */
+
+static char *
+gl_state_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                     const char *part EINA_UNUSED)
+{
+   state_it *sit = data;
+   return strdup(sit->name);
+}
+
+static void
+gl_state_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                     void *event_info EINA_UNUSED)
+{
+   state_it *sit = data;
+   find_state_proc(sit->pit->git->name, sit->pit->name, part_type_get(sit->pit),
+                   sit->name);
+}
+
+static void
+states_update(navi_data *nd, part_it *pit)
+{
+   Enventor_Object *enventor = base_enventor_get();
+   Eina_List *state_list = enventor_object_part_states_list_get(enventor,
+                                                                pit->name);
+   char *name;
+   Eina_List *l, *ll;
+   state_it *sit;
+   int idx = 0;
+
+   if (!state_list)
+     {
+        navigator_states_clear(pit);
+        return;
+     }
+
+   //1. Prepare for validation.
+   EINA_LIST_FOREACH(pit->states, l, sit)
+     {
+        sit->discarded = EINA_TRUE;
+        sit->tag.idx = IDX_MAX;
+     }
+
+   //2. New States
+   EINA_LIST_FOREACH(state_list, l, name)
+     {
+        Eina_Bool new_state = EINA_TRUE;
+        idx++;
+
+        //Check if it is existed?
+        EINA_LIST_FOREACH(pit->states, ll, sit)
+          {
+             if (!strcmp(name, sit->name) &&
+                 (strlen(name) == strlen(sit->name)))
+               {
+                  sit->discarded = EINA_FALSE;
+                  new_state = EINA_FALSE;
+                  //update index of the item
+                  sit->tag.idx = idx;
+                  break;
+               }
+
+          }
+        if (!new_state) continue;
+
+        //Ok, this state is newly added
+        sit = calloc(1, sizeof(state_it));
+        if (!sit)
+          {
+             EINA_LOG_ERR(_("Failed to allocate Memory!"));
+             continue;
+          }
+        sit->tag.type = Item_Type_State;
+        sit->tag.idx = idx;
+        //Parsing "default" "0.00". We don't take care 0.00 in the state name.
+        const char *brk = strpbrk(name, " ");
+        if (brk) sit->name = strndup(name, brk - name);
+        else sit->name = strdup(name);
+
+        sit->pit = pit;
+        //Tizen_Only: This API should be changed to elm_genlist_item_sorted_insert
+        sit->it = elm_genlist_item_append(nd->genlist,
+                                          nd->state_itc,
+                                          sit,
+                                          pit->it,
+                                          ELM_GENLIST_ITEM_NONE,
+                                          gl_state_selected_cb,
+                                          sit);
+        //
+        pit->states = eina_list_append(pit->states, sit);
+     }
+
+   //3. Update states
+   EINA_LIST_FOREACH_SAFE(pit->states, l, ll, sit)
+     {
+        //Remove them from the previous list.
+        if (sit->discarded)
+          {
+             pit->states = eina_list_remove_list(pit->states, l);
+             navigator_state_free(sit);
+             continue;
+          }
+     }
+
+   edje_edit_string_list_free(state_list);
+}
+
+static Evas_Object *
+gl_state_content_get_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                        const char *part)
+{
+   //Tizen Only
+   //if (strcmp("elm.swallow.icon", part)) return NULL;
+   //
+   //Evas_Object *image = elm_image_add(obj);
+   //elm_image_file_set(image, EDJE_PATH, "navi_state");
+   //
+   //return image;
+
+   if (!strcmp("elm.swallow.icon", part))
+     {
+        Evas_Object *image = elm_image_add(obj);
+        elm_image_file_set(image, EDJE_PATH, "navi_state");
+        return image;
+     }
+   else if (!strcmp("elm.swallow.icon_selected", part))
+     {
+        Evas_Object *image = elm_image_add(obj);
+        elm_image_file_set(image, EDJE_PATH, "navi_state_selected");
+        return image;
+     }
+
+   return NULL;
+}
+
+/* Program Related */
+
+static void
+program_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   program_it *pit = data;
+   enventor_object_program_run(base_enventor_get(), pit->name);
+
+   if (!config_stats_bar_get()) return;
+
+   char buf[256];
+   snprintf(buf, sizeof(buf),_("Program Run: \"%s\""), pit->name);
+   stats_info_msg_update(buf);
+}
+
+static char *
+gl_program_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       const char *part EINA_UNUSED)
+{
+   program_it *spit = data;
+   return strdup(spit->name);
+}
+
+static Evas_Object *
+gl_program_content_get_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                          const char *part)
+{
+   //1. Icon
+   if (!strcmp("elm.swallow.icon", part))
+     {
+        Evas_Object *image = elm_image_add(obj);
+        elm_image_file_set(image, EDJE_PATH, "navi_state");
+        return image;
+     }
+   //Tizen Only
+   else if (!strcmp("elm.swallow.icon_selected", part))
+     {
+        Evas_Object *image = elm_image_add(obj);
+        elm_image_file_set(image, EDJE_PATH, "navi_state_selected");
+        return image;
+     }
+
+   //2. Play Button
+   program_it *pit = data;
+
+   //Box
+   Evas_Object *box = elm_box_add(obj);
+   elm_object_tooltip_text_set(box, "Play the program.");
+
+   //Button
+   Evas_Object *btn = elm_button_add(box);
+   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_object_scale_set(btn, 0.5);
+   evas_object_smart_callback_add(btn, "clicked", program_btn_clicked_cb,
+                                  pit);
+   evas_object_show(btn);
+
+   //Image
+   Evas_Object *img = elm_image_add(btn);
+   elm_image_file_set(img, EDJE_PATH, "navi_play");
+   elm_object_content_set(btn, img);
+
+   elm_box_pack_end(box, btn);
+
+   return box;
+}
+
+static void
+gl_program_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   program_it *spit = data;
+   find_program_proc(spit->pit->git->name, spit->name);
+}
+
+static void
+sub_programs_update(navi_data *nd, programs_it *pit)
+{
+   navigator_sub_programs_clear(pit);
+
+   Enventor_Object *enventor = base_enventor_get();
+   Eina_List *program_list = enventor_object_programs_list_get(enventor);
+   if (!program_list) return;
+
+   //Append program list
+   char *name;
+   Eina_List *l;
+   program_it *spit;
+   int idx = 0;
+
+   EINA_LIST_FOREACH(program_list, l, name)
+     {
+        idx++;
+
+        spit = calloc(1, sizeof(program_it));
+        if (!spit)
+          {
+             EINA_LOG_ERR(_("Failed to allocate Memory!"));
+             continue;
+          }
+
+        spit->tag.type = Item_Type_Program;
+        spit->tag.idx = idx;
+        spit->name = strdup(name);
+        spit->pit = pit;
+        //Tizen_Only: This API should be changed to elm_genlist_item_sorted_insert
+        spit->it = elm_genlist_item_append(nd->genlist,
+                                           nd->program_itc,
+                                           spit,
+                                           pit->it,
+                                           ELM_GENLIST_ITEM_NONE,
+                                           gl_program_selected_cb,
+                                           spit);
+        //
+        pit->programs = eina_list_append(pit->programs, spit);
+     }
+
+   edje_edit_string_list_free(program_list);
+}
+
+/* Programs Related */
+
+static void
+programs_btn_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                        void *event_info EINA_UNUSED)
+{
+   enventor_object_programs_stop(base_enventor_get());
+
+   if (!config_stats_bar_get()) return;
+
+   stats_info_msg_update(_("Stop all running programs."));
+}
+
+static void
+programs_expand(programs_it *pit)
+{
+   if (elm_genlist_item_expanded_get(pit->it)) return;
+
+   elm_genlist_item_expanded_set(pit->it, EINA_TRUE);
+
+   sub_programs_update(pit->git->nd, pit);
+}
+
+static void
+programs_contract(programs_it *pit)
+{
+   if (!elm_genlist_item_expanded_get(pit->it)) return;
+
+   elm_genlist_item_expanded_set(pit->it, EINA_FALSE);
+
+   navigator_sub_programs_clear(pit);
+}
+
+static void
+gl_programs_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                        void *event_info EINA_UNUSED)
+{
+   programs_it *pit = data;
+
+   find_programs_proc(pit->git->name);
+}
+
+static void
+programs_update(navi_data *nd, group_it *git)
+{
+   Enventor_Object *enventor = base_enventor_get();
+   Eina_List *program_list = enventor_object_programs_list_get(enventor);
+
+   //oh, no programs.. 
+   if (!program_list)
+     {
+        navigator_programs_clear(git);
+        return;
+     }
+
+   programs_it *pit = &git->programs;
+
+   //Create a programs item first time.
+   if (!pit->it)
+     {
+        pit->tag.type = Item_Type_Programs;
+        pit->tag.idx = PROGRAM_IDX;
+        pit->git = git;
+        pit->it = elm_genlist_item_append(nd->genlist,
+                                          nd->programs_itc,
+                                          pit,
+                                          git->it,
+                                          ELM_GENLIST_ITEM_TREE,
+                                          gl_programs_selected_cb,
+                                          pit);
+        return;
+     }
+
+   if (!elm_genlist_item_expanded_get(pit->it)) return;
+
+   //programs item is already created, it may need to update progam lists.
+
+   //1. Prepare for validation.
+   Eina_List *l, *ll;
+   program_it *spit;
+   char *name;
+   int idx = 0;
+
+   EINA_LIST_FOREACH(pit->programs, l, spit)
+     {
+        spit->discarded = EINA_TRUE;
+        spit->tag.idx = IDX_MAX;
+     }
+
+   //2. New programs
+   EINA_LIST_FOREACH(program_list, l, name)
+     {
+        Eina_Bool new_program = EINA_TRUE;
+        idx++;
+
+        //Check if it is existed?
+        EINA_LIST_FOREACH(pit->programs, ll, spit)
+          {
+             if (!strcmp(name, spit->name) &&
+                 (strlen(name) == strlen(spit->name)))
+               {
+                  spit->discarded = EINA_FALSE;
+                  new_program = EINA_FALSE;
+                  //update index of the item
+                  spit->tag.idx = idx;
+                  break;
+               }
+          }
+        if (!new_program) continue;
+
+        //Ok, this program is newly added.
+        spit = calloc(1, sizeof(program_it));
+        if (!spit)
+          {
+             EINA_LOG_ERR(_("Failed to allocate Memory!"));
+             continue;
+          }
+
+        spit->tag.type = Item_Type_Program;
+        spit->tag.idx = idx;
+        spit->name = strdup(name);
+        spit->pit = pit;
+        //Tizen_Only: This API should be changed to elm_genlist_item_sorted_insert
+        spit->it = elm_genlist_item_append(nd->genlist,
+                                           nd->program_itc,
+                                           spit,
+                                           pit->it,
+                                           ELM_GENLIST_ITEM_NONE,
+                                           gl_program_selected_cb,
+                                           spit);
+        //
+        pit->programs = eina_list_append(pit->programs, spit);
+     }
+
+   //3. Discarded programs
+   EINA_LIST_FOREACH_SAFE(pit->programs, l, ll, spit)
+     {
+        if (!spit->discarded) continue;
+
+        //Remove them from the previous list.
+        pit->programs = eina_list_remove_list(pit->programs, l);
+        navigator_program_free(spit);
+     }
+
+   edje_edit_string_list_free(program_list);
+}
+
+static char *
+gl_programs_text_get_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                        const char *part EINA_UNUSED)
+{
+   return strdup("PROGRAMS");
+}
+
+static Evas_Object *
+gl_programs_content_get_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                           const char *part)
+{
+   //1. Icon
+   if (!strcmp("elm.swallow.icon", part))
+     {
+        Evas_Object *image = elm_image_add(obj);
+        elm_image_file_set(image, EDJE_PATH, "navi_program");
+
+        return image;
+     }
+   //Tizen Only
+   else if (!strcmp("elm.swallow.icon_selected", part))
+     {
+        Evas_Object *image = elm_image_add(obj);
+        elm_image_file_set(image, EDJE_PATH, "navi_program_selected");
+
+        return image;
+     }
+
+   //2. Stop All Button
+   //Box
+   Evas_Object *box = elm_box_add(obj);
+   elm_object_tooltip_text_set(box, "Stop all programs.");
+
+   //Button
+   Evas_Object *btn = elm_button_add(box);
+   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_object_scale_set(btn, 0.5);
+   evas_object_smart_callback_add(btn, "clicked", programs_btn_clicked_cb,
+                                  NULL);
+   evas_object_show(btn);
+
+   //Image
+   Evas_Object *img = elm_image_add(btn);
+   elm_image_file_set(img, EDJE_PATH, "navi_stop");
+   elm_object_content_set(btn, img);
+
+   elm_box_pack_end(box, btn);
+
+   return box;
+}
+
+
+/* Part Related */
+
+static char *
+gl_part_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                    const char *part EINA_UNUSED)
+{
+   part_it *pit = data;
+   return strdup(pit->name);
+}
+
+static Evas_Object *
+gl_part_content_get_cb(void *data, Evas_Object *obj, const char *part)
+{
+   //Tizen Only
+   //if (strcmp("elm.swallow.icon", part)) return NULL;
+   //part_it *pit = data;
+   //
+   //Evas_Object *image = elm_image_add(obj);
+   //const char *group;
+   //
+   //switch (pit->type)
+   //  {
+   //   case EDJE_PART_TYPE_RECTANGLE:
+   //      group = "navi_rect";
+   //      break;
+   //   case EDJE_PART_TYPE_TEXT:
+   //      group = "navi_text";
+   //      break;
+   //   case EDJE_PART_TYPE_IMAGE:
+   //      group = "navi_image";
+   //      break;
+   //   case EDJE_PART_TYPE_SWALLOW:
+   //      group = "navi_swallow";
+   //      break;
+   //   case EDJE_PART_TYPE_TEXTBLOCK:
+   //      group = "navi_textblock";
+   //      break;
+   //   case EDJE_PART_TYPE_SPACER:
+   //      group = "navi_spacer";
+   //      break;
+   //   default:
+   //      group = "navi_unknown";
+   //      break;
+   //  }
+   //
+   //elm_image_file_set(image, EDJE_PATH, group);
+   //
+   //return image;
+
+   part_it *pit = data;
+
+   const char *group;
+
+   if (!strcmp("elm.swallow.icon", part))
+     {
+        Evas_Object *image = elm_image_add(obj);
+        switch (pit->type)
+          {
+           case EDJE_PART_TYPE_RECTANGLE:
+              group = "navi_rect";
+              break;
+           case EDJE_PART_TYPE_TEXT:
+              group = "navi_text";
+              break;
+           case EDJE_PART_TYPE_IMAGE:
+              group = "navi_image";
+              break;
+           case EDJE_PART_TYPE_SWALLOW:
+              group = "navi_swallow";
+              break;
+           case EDJE_PART_TYPE_TEXTBLOCK:
+              group = "navi_textblock";
+              break;
+           case EDJE_PART_TYPE_SPACER:
+              group = "navi_spacer";
+              break;
+           default:
+              group = "navi_unknown";
+              break;
+          }
+
+        elm_image_file_set(image, EDJE_PATH, group);
+        return image;
+     }
+   else if (!strcmp("elm.swallow.icon_selected", part))
+     {
+        Evas_Object *image = elm_image_add(obj);
+        switch (pit->type)
+          {
+           case EDJE_PART_TYPE_RECTANGLE:
+              group = "navi_rect_selected";
+              break;
+           case EDJE_PART_TYPE_TEXT:
+              group = "navi_text_selected";
+              break;
+           case EDJE_PART_TYPE_IMAGE:
+              group = "navi_image_selected";
+              break;
+           case EDJE_PART_TYPE_SWALLOW:
+              group = "navi_swallow_selected";
+              break;
+           case EDJE_PART_TYPE_TEXTBLOCK:
+              group = "navi_textblock_selected";
+              break;
+           case EDJE_PART_TYPE_SPACER:
+              group = "navi_spacer_selected";
+              break;
+           default:
+              group = "navi_unknown_selected";
+              break;
+          }
+
+        elm_image_file_set(image, EDJE_PATH, group);
+        return image;
+     }
+
+   return NULL;
+}
+
+static void
+gl_part_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                    void *event_info EINA_UNUSED)
+{
+   part_it *pit = data;
+
+   //Find text cursor position
+   const char *part_type = part_type_get(pit);
+   find_part_proc(pit->git->name, pit->name, part_type);
+}
+
+static void
+parts_update(navi_data *nd, group_it *git)
+{
+   Enventor_Object *enventor = base_enventor_get();
+   Eina_List *part_list = enventor_object_parts_list_get(enventor);
+   Eina_List *l, *ll;
+   part_it *pit;
+   char *name;
+   int idx = 0;
+
+   //1. Prepare for validation.
+   EINA_LIST_FOREACH(git->parts, l, pit)
+     {
+        pit->discarded = EINA_TRUE;
+        pit->tag.idx = IDX_MAX;
+     }
+
+   //2. New parts
+   EINA_LIST_FOREACH(part_list, l, name)
+     {
+        Eina_Bool new_part = EINA_TRUE;
+        idx++;
+
+        //Check if it is existed?
+        EINA_LIST_FOREACH(git->parts, ll, pit)
+          {
+             if (!strcmp(name, pit->name) &&
+                 (strlen(name) == strlen(pit->name)))
+               {
+                  pit->discarded = EINA_FALSE;
+                  new_part = EINA_FALSE;
+                  //update index of the item
+                  pit->tag.idx = idx;
+                  break;
+               }
+
+          }
+        if (!new_part) continue;
+
+        //Ok, this part is newly added.
+        pit = calloc(1, sizeof(part_it));
+        if (!pit)
+          {
+             EINA_LOG_ERR(_("Failed to allocate Memory!"));
+             continue;
+          }
+
+        pit->tag.type = Item_Type_Part;
+        pit->tag.idx = idx;
+        pit->name = strdup(name);
+        pit->type = enventor_object_part_type_get(enventor, name);
+        pit->git = git;
+        //Tizen_Only: This API should be changed to elm_genlist_item_sorted_insert
+        pit->it = elm_genlist_item_append(nd->genlist,
+                                          nd->part_itc,
+                                          pit,
+                                          git->it,
+                                          ELM_GENLIST_ITEM_TREE,
+                                          gl_part_selected_cb,
+                                          pit);
+        //
+        git->parts = eina_list_append(git->parts, pit);
+     }
+
+   //3. Update parts
+   EINA_LIST_FOREACH_SAFE(git->parts, l, ll, pit)
+     {
+        //Remove them from the previous list.
+        if (pit->discarded)
+          {
+             git->parts = eina_list_remove_list(git->parts, l);
+             navigator_part_free(pit);
+             continue;
+          }
+
+        //Update parts states only if they are expanded.
+        if (!elm_genlist_item_expanded_get(pit->it)) continue;
+
+        states_update(nd, pit);
+     }
+
+   edje_edit_string_list_free(part_list);
+}
+
+static void
+part_expand(part_it *pit)
+{
+   if (elm_genlist_item_expanded_get(pit->it)) return;
+
+   elm_genlist_item_expanded_set(pit->it, EINA_TRUE);
+
+   states_update(pit->git->nd, pit);
+}
+
+static void
+part_contract(part_it *pit)
+{
+   if (!elm_genlist_item_expanded_get(pit->it)) return;
+
+   elm_genlist_item_expanded_set(pit->it, EINA_FALSE);
+
+   navigator_states_clear(pit);
+}
+
+/* Group Related */
+
+static void
+group_update(navi_data *nd, group_it *git)
+{
+   parts_update(nd, git);
+   programs_update(nd, git);
+}
+
+static void
+group_expand(group_it *git)
+{
+   if (elm_genlist_item_expanded_get(git->it)) return;
+
+   elm_genlist_item_expanded_set(git->it, EINA_TRUE);
+
+   group_update(git->nd, git);
+}
+
+static void
+group_contract(group_it *git)
+{
+   if (!elm_genlist_item_expanded_get(git->it)) return;
+
+   elm_genlist_item_expanded_set(git->it, EINA_FALSE);
+   navigator_parts_clear(git);
+   navigator_programs_clear(git);
+}
+
+static char *
+gl_group_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                    const char *part EINA_UNUSED)
+{
+   group_it *git = data;
+   return strdup(git->name);
+}
+
+static Evas_Object *
+gl_group_content_get_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                        const char *part)
+{
+   if (!strcmp("elm.swallow.icon", part))
+     {
+        Evas_Object *image = elm_image_add(obj);
+        elm_image_file_set(image, EDJE_PATH, "navi_group");
+        return image;
+     }
+   //Tizen Only
+   else if (!strcmp("elm.swallow.icon_selected", part))
+     {
+        Evas_Object *image = elm_image_add(obj);
+        elm_image_file_set(image, EDJE_PATH, "navi_group_selected");
+        return image;
+     }
+
+   return NULL;
+}
+
+static void
+gl_group_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                     void *event_info EINA_UNUSED)
+{
+   group_it *git = data;
+   find_group_proc(git->name);
+}
+
+static void
+gl_expand_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                     void *event_info)
+{
+   Elm_Object_Item *it = event_info;
+   list_it *_it = (list_it *)elm_object_item_data_get(it);
+
+   switch(_it->type)
+     {
+      case Item_Type_Group:
+         group_expand((group_it*)_it);
+         break;
+      case Item_Type_Part:
+         part_expand((part_it*)_it);
+         break;
+      case Item_Type_Programs:
+         programs_expand((programs_it*)_it);
+         break;
+      default:
+         break;
+     }
+}
+
+static void
+gl_contract_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                       void *event_info)
+{
+   Elm_Object_Item *it = event_info;
+   list_it *_it = (list_it *)elm_object_item_data_get(it);
+
+   switch(_it->type)
+     {
+      case Item_Type_Group:
+         group_contract((group_it*)_it);
+         break;
+      case Item_Type_Part:
+         part_contract((part_it*)_it);
+         break;
+      case Item_Type_Programs:
+         programs_contract((programs_it*)_it);
+         break;
+      default:
+         break;
+     }
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+void
+edc_navigator_deselect(void)
+{
+   navi_data *nd = g_nd;
+   EINA_SAFETY_ON_NULL_RETURN(nd);
+
+   if (!nd->selected) return;
+   navigator_item_deselect(nd);
+}
+
+void
+edc_navigator_group_update(const char *cur_group)
+{
+   navi_data *nd = g_nd;
+   EINA_SAFETY_ON_NULL_RETURN(nd);
+
+   //FIXME: This function is unnecessarily called... why?
+
+   //Cancel item selection if group was not indicated. 
+   if (!cur_group) navigator_item_deselect(nd);
+   Eina_List *group_list =
+      enventor_item_group_list_get(file_mgr_focused_item_get());
+
+   unsigned int cur_group_len = 0;
+   group_it *git;
+   Eina_List *l, *ll;
+   char *name;
+   int idx = 0;
+
+   //1. Prepare for validation.
+   EINA_LIST_FOREACH(nd->groups, l, git)
+     {
+        git->discarded = EINA_TRUE;
+        git->tag.idx = IDX_MAX;
+     }
+
+   //2. New groups
+   EINA_LIST_FOREACH(group_list, l, name)
+     {
+        idx++;
+
+        Eina_Bool new_group = EINA_TRUE;
+
+        //Check if it is existed?
+        EINA_LIST_FOREACH(nd->groups, ll, git)
+          {
+             if (!strcmp(name, git->name) &&
+                 (strlen(name) == strlen(git->name)))
+               {
+                  git->discarded = EINA_FALSE;
+                  new_group = EINA_FALSE;
+                  //update index of the item
+                  git->tag.idx = idx;
+                  break;
+               }
+          }
+        if (!new_group) continue;
+
+        //Ok, this group is newly added.
+        git = calloc(1, sizeof(group_it));
+        if (!git)
+          {
+             EINA_LOG_ERR(_("Failed to allocate Memory!"));
+             continue;
+          }
+
+        git->tag.type = Item_Type_Group;
+        git->tag.idx = idx;
+        git->name = strdup(name);
+        git->nd = nd;
+        git->it = elm_genlist_item_append(nd->genlist,
+                                          nd->group_itc,
+                                          git,
+                                          NULL,
+                                          ELM_GENLIST_ITEM_TREE,
+                                          gl_group_selected_cb,
+                                          git);
+        nd->groups = eina_list_append(nd->groups, git);
+     }
+
+   //3. Update groups
+   if (cur_group) cur_group_len = strlen(cur_group);
+
+   EINA_LIST_FOREACH_SAFE(nd->groups, l, ll, git)
+     {
+        //remove them from the previous list.
+        if (git->discarded)
+          {
+             nd->groups = eina_list_remove_list(nd->groups, l);
+             navigator_group_free(git);
+             continue;
+          }
+
+        //Update group parts only if they are expanded.
+        if (!elm_genlist_item_expanded_get(git->it)) continue;
+
+        //update only current group
+        if (cur_group && !strcmp(cur_group, git->name) &&
+            (cur_group_len == strlen(git->name)))
+            group_update(nd, git);
+     }
+
+   EINA_LIST_FREE(group_list, name) eina_stringshare_del(name);
+}
+
+Evas_Object *
+edc_navigator_init(Evas_Object *parent)
+{
+   navi_data *nd = calloc(1, sizeof(navi_data));
+   if (!nd)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return NULL;
+     }
+   g_nd = nd;
+
+   //Base layout
+   Evas_Object *base_layout = elm_layout_add(parent);
+   elm_layout_file_set(base_layout, EDJE_PATH, "tools_layout");
+   evas_object_size_hint_weight_set(base_layout, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(base_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(base_layout);
+
+   //Genlist
+   Evas_Object *genlist = elm_genlist_add(parent);
+   //Tizen Only
+   elm_object_scale_set(genlist, 1.15);
+   elm_object_focus_allow_set(genlist, EINA_FALSE);
+   evas_object_smart_callback_add(genlist, "expand,request",
+                                  gl_expand_request_cb, nd);
+   evas_object_smart_callback_add(genlist, "contract,request",
+                                  gl_contract_request_cb, nd);
+   evas_object_smart_callback_add(genlist, "selected",
+                                  gl_selected_cb, nd);
+   evas_object_smart_callback_add(genlist, "selected",
+                                  gl_unselected_cb, nd);
+   evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_object_part_content_set(base_layout, "elm.swallow.content", genlist);
+
+   //Group Item Class
+   Elm_Genlist_Item_Class *itc;
+
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_group_text_get_cb;
+   itc->func.content_get = gl_group_content_get_cb;
+
+   nd->group_itc = itc;
+
+   //Part Item Class
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_part_text_get_cb;
+   itc->func.content_get = gl_part_content_get_cb;
+
+   nd->part_itc = itc;
+
+   //State Item Class
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_state_text_get_cb;
+   itc->func.content_get = gl_state_content_get_cb;
+
+   nd->state_itc = itc;
+
+   //Programs Item Class
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_programs_text_get_cb;
+   itc->func.content_get = gl_programs_content_get_cb;
+
+   nd->programs_itc = itc;
+
+   //Program Item Class
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_program_text_get_cb;
+   itc->func.content_get = gl_program_content_get_cb;
+
+   nd->program_itc = itc;
+
+   nd->base_layout = base_layout;
+   nd->genlist = genlist;
+
+   return base_layout;
+}
+
+void
+edc_navigator_term(void)
+{
+   navi_data *nd = g_nd;
+   EINA_SAFETY_ON_NULL_RETURN(nd);
+
+   navigator_groups_clear(nd);
+
+   elm_genlist_item_class_free(nd->group_itc);
+   elm_genlist_item_class_free(nd->part_itc);
+   elm_genlist_item_class_free(nd->state_itc);
+   elm_genlist_item_class_free(nd->programs_itc);
+   elm_genlist_item_class_free(nd->program_itc);
+
+   evas_object_del(nd->base_layout);
+
+   free(nd);
+   g_nd = NULL;
+}
+
+void
+edc_navigator_tools_set(void)
+{
+   navi_data *nd = g_nd;
+   EINA_SAFETY_ON_NULL_RETURN(nd);
+
+   Evas_Object *rect =
+      evas_object_rectangle_add(evas_object_evas_get(nd->base_layout));
+   evas_object_color_set(rect, 0, 0, 0, 0);
+   elm_object_part_content_set(nd->base_layout, "elm.swallow.tools", rect);
+}
+
+void
+edc_navigator_tools_visible_set(Eina_Bool visible)
+{
+   navi_data *nd = g_nd;
+   EINA_SAFETY_ON_NULL_RETURN(nd);
+
+   if (visible)
+     elm_object_signal_emit(nd->base_layout, "elm,state,tools,show", "");
+   else
+     elm_object_signal_emit(nd->base_layout, "elm,state,tools,hide", "");
+}
diff --git a/src/bin/file_browser.c b/src/bin/file_browser.c
new file mode 100644 (file)
index 0000000..b81eddf
--- /dev/null
@@ -0,0 +1,887 @@
+#include "common.h"
+
+typedef enum
+{
+   FILE_BROWSER_FILE_TYPE_DIR = 0,
+   FILE_BROWSER_FILE_TYPE_EDC,
+   FILE_BROWSER_FILE_TYPE_IMAGE,
+   FILE_BROWSER_FILE_TYPE_SOUND,
+   FILE_BROWSER_FILE_TYPE_FONT,
+   FILE_BROWSER_FILE_TYPE_OTHERS
+} File_Browser_File_Type;
+
+typedef struct file_browser_file_s brows_file;
+struct file_browser_file_s
+{
+   Eina_List *sub_file_list; //NULL if file type is not directory.
+
+   char *path;
+   char *name;
+   File_Browser_File_Type type;
+
+   Elm_Object_Item *it;
+
+   Eina_Bool main: 1;   //Is it main edc file?
+};
+
+typedef enum
+{
+   FILE_BROWSER_MODE_DEFAULT = 0,
+   FILE_BROWSER_MODE_SEARCH
+} File_Browser_Mode;
+
+typedef struct file_browser_s
+{
+   brows_file *workspace;       //workspace directory
+   Eina_List *search_file_list; /* list of searched files. This is only used for
+                                   showing search results. */
+   Evas_Object *base_layout;
+   Evas_Object *search_entry;
+   Evas_Object *genlist;
+   Evas_Object *show_all_check;
+
+   Elm_Genlist_Item_Class *itc;
+   Elm_Genlist_Item_Class *search_itc;
+
+   File_Browser_Mode mode;
+
+   Elm_Object_Item *main_it;
+} brows_data;
+
+static brows_data *g_bd = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void brows_file_free(brows_file *file);
+static void brows_file_list_free(Eina_List *file_list);
+static Eina_List *sub_brows_file_list_create(brows_file *file);
+static void refresh_btn_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
+
+static void
+gl_clicked_double_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                     void *event_info)
+{
+   Elm_Object_Item *it = event_info;
+   brows_file *file = elm_object_item_data_get(it);
+   if (!file)
+     {
+        EINA_LOG_ERR("No item data??");
+        return;
+     }
+
+   if (!file->path)
+     {
+        EINA_LOG_ERR("No item file path??");
+        return;
+     }
+
+   /* Open a double clicked edc file. */
+
+   file_mgr_file_open(file->path);
+}
+
+//Set file->it as NULL when genlist item is deleted.
+static void
+gl_item_del_cb(void *data, Evas_Object *obj EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   brows_file *file = data;
+   if (!file) return;
+
+   file->it = NULL;
+
+   //Reset Main Item
+   if (file->main)
+     {
+        brows_data *bd = g_bd;
+        bd->main_it = NULL;
+     }
+}
+
+static Elm_Object_Item *
+file_genlist_item_append(brows_file *file, Elm_Object_Item *parent_it,
+                         Elm_Genlist_Item_Type it_type)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return NULL;
+
+   if (!file) return NULL;
+
+
+   Elm_Genlist_Item_Class *itc = bd->itc;
+   if (bd->mode == FILE_BROWSER_MODE_SEARCH)
+     itc = bd->search_itc;
+
+   if (file->it) elm_object_item_del(file->it);
+
+   file->it = elm_genlist_item_append(bd->genlist,
+                                      itc,         /* item class */
+                                      file,        /* item data */
+                                      parent_it,   /* parent */
+                                      it_type,     /* item type */
+                                      NULL,        /* select cb */
+                                      file);       /* select cb data */
+
+   //Set file->it as NULL when genlist item is deleted.
+   elm_object_item_del_cb_set(file->it, gl_item_del_cb);
+
+   elm_genlist_item_expanded_set(file->it, EINA_FALSE);
+
+   //Keep Main Item
+   if (file->main)
+     {
+        bd = g_bd;
+        bd->main_it = file->it;
+     }
+
+   return file->it;
+}
+
+static char *
+main_file_text_get(brows_file *file)
+{
+   char path[PATH_MAX];
+   snprintf(path, sizeof(path), "%s [main]", file->name);
+   return  strdup(path);
+}
+
+static char *
+gl_file_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                    const char *part EINA_UNUSED)
+{
+   brows_file *file = data;
+   if (!file->main) return strdup(file->name);
+   return main_file_text_get(file);
+}
+
+static Evas_Object *
+gl_file_content_get_cb(void *data, Evas_Object *obj, const char *part)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return NULL;
+
+   brows_file *file = data;
+
+   if (!strcmp(part, "elm.swallow.icon"))
+     {
+        Evas_Object *img = elm_image_add(obj);
+
+        if (file->type == FILE_BROWSER_FILE_TYPE_DIR)
+          elm_image_file_set(img, EDJE_PATH, "folder");
+        //Tizen Only
+        //else if (file->type == FILE_BROWSER_FILE_TYPE_EDC)
+        //  elm_image_file_set(img, EDJE_PATH, "brows_logo");
+        //else if (file->type == FILE_BROWSER_FILE_TYPE_IMAGE)
+        //  elm_image_file_set(img, EDJE_PATH, "brows_image");
+        //else if (file->type == FILE_BROWSER_FILE_TYPE_SOUND)
+        //  elm_image_file_set(img, EDJE_PATH, "brows_sound");
+        //else if (file->type == FILE_BROWSER_FILE_TYPE_FONT)
+        //  elm_image_file_set(img, EDJE_PATH, "brows_font");
+        else
+          elm_image_file_set(img, EDJE_PATH, "file");
+
+        return img;
+     }
+   //Tizen Only
+   else if (!strcmp(part, "elm.swallow.icon_selected"))
+     {
+        Evas_Object *img = elm_image_add(obj);
+
+        if (file->type == FILE_BROWSER_FILE_TYPE_DIR)
+          elm_image_file_set(img, EDJE_PATH, "folder_selected");
+        else
+          elm_image_file_set(img, EDJE_PATH, "file_selected");
+
+        return img;
+     }
+   else
+     {
+        //Refresh button for the most top directory
+        if (file == bd->workspace && !strcmp(part, "elm.swallow.end"))
+          {
+             //Tizen Only
+             //This wrapper box is used for non-scaled button tooltip.
+             //Evas_Object *box = elm_box_add(obj);
+             //elm_object_tooltip_text_set(box, "Refresh Workspace");
+
+             //Button
+             //Evas_Object *btn = elm_button_add(box);
+             //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_object_scale_set(btn, 0.6);
+             //evas_object_smart_callback_add(btn, "clicked",
+             //                               refresh_btn_clicked_cb, NULL);
+             //evas_object_show(btn);
+
+             //Icon
+             //Evas_Object *img = elm_image_add(btn);
+             //elm_image_file_set(img, EDJE_PATH, "refresh");
+             //elm_object_content_set(btn, img);
+
+             //elm_box_pack_end(box, btn);
+
+             //return box;
+
+             //Button
+             Evas_Object *btn = elm_button_add(obj);
+             elm_object_style_set(btn, "refresh");
+             evas_object_smart_callback_add(btn, "clicked",
+                                            refresh_btn_clicked_cb, NULL);
+             elm_object_tooltip_text_set(btn, "Refresh Workspace");
+             evas_object_show(btn);
+
+             //Icon
+             Evas_Object *img = elm_image_add(btn);
+             elm_image_file_set(img, EDJE_PATH, "refresh");
+             elm_object_content_set(btn, img);
+
+             return btn;
+             //
+          }
+     }
+
+   return NULL;
+}
+
+static void
+gl_expanded_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                       void *event_info)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return;
+   if (bd->mode == FILE_BROWSER_MODE_SEARCH) return;
+
+   Elm_Object_Item *it = event_info;
+   elm_genlist_item_expanded_set(it, EINA_TRUE);
+}
+
+static void
+gl_contract_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return;
+   if (bd->mode == FILE_BROWSER_MODE_SEARCH) return;
+
+   Elm_Object_Item *it = event_info;
+   elm_genlist_item_expanded_set(it, EINA_FALSE);
+}
+
+static void
+gl_expanded_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return;
+   if (bd->mode == FILE_BROWSER_MODE_SEARCH) return;
+
+   Elm_Object_Item *it = event_info;
+
+   brows_file *file = elm_object_item_data_get(it);
+   if (!file) return;
+
+   /* Basically, sub file list is not created. So if sub file list has not been
+      created before, then create sub file list. */
+   if (!file->sub_file_list)
+     file->sub_file_list = sub_brows_file_list_create(file);
+
+   if (file->sub_file_list)
+     {
+        Eina_List *l = NULL;
+        brows_file *sub_file = NULL;
+        EINA_LIST_FOREACH(file->sub_file_list, l, sub_file)
+          {
+             if (!elm_check_state_get(bd->show_all_check))
+               {
+                  //Skip if the file name is started with "."
+                  if ((sub_file->type == FILE_BROWSER_FILE_TYPE_OTHERS) ||
+                      (sub_file->name[0] == '.'))
+                     continue;
+               }
+
+             Elm_Genlist_Item_Type type = ELM_GENLIST_ITEM_NONE;
+             if (sub_file->type == FILE_BROWSER_FILE_TYPE_DIR)
+               type = ELM_GENLIST_ITEM_TREE;
+             file_genlist_item_append(sub_file, it, type);
+          }
+     }
+}
+
+static void
+gl_contracted_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return;
+   if (bd->mode == FILE_BROWSER_MODE_SEARCH) return;
+
+   Elm_Object_Item *it = event_info;
+   elm_genlist_item_subitems_clear(it);
+
+   brows_file *file = elm_object_item_data_get(it);
+   if (file && file->sub_file_list)
+     {
+        brows_file_list_free(file->sub_file_list);
+        file->sub_file_list = NULL;
+     }
+}
+
+static int
+file_strcmp_cb(const void *data1, const void *data2)
+{
+   const brows_file *file1 = data1;
+   const brows_file *file2 = data2;
+
+   if (file1->type < file2->type)
+     return -1;
+   else if (file1->type > file2->type)
+     return 1;
+   else
+     return strcmp(file1->name, file2->name);
+}
+
+static File_Browser_File_Type
+brows_file_type_get(const char *file_path)
+{
+   if (!file_path) return FILE_BROWSER_FILE_TYPE_OTHERS;
+
+   if (ecore_file_is_dir(file_path)) return FILE_BROWSER_FILE_TYPE_DIR;
+
+   const char *file_path_end = file_path + strlen(file_path);
+   char *file_ext = strrchr(file_path, '.');
+
+   if (!file_ext) return FILE_BROWSER_FILE_TYPE_OTHERS;
+   file_ext++;
+
+   if (file_ext >= file_path_end) return FILE_BROWSER_FILE_TYPE_OTHERS;
+
+   if (!strcmp(file_ext, "edc") || !strcmp(file_ext, "EDC"))
+     return FILE_BROWSER_FILE_TYPE_EDC;
+
+   if (!strcmp(file_ext, "png") || !strcmp(file_ext, "PNG") ||
+       !strcmp(file_ext, "jpg") || !strcmp(file_ext, "JPG") ||
+       !strcmp(file_ext, "jpeg") || !strcmp(file_ext, "JPEG") ||
+       !strcmp(file_ext, "bmp") || !strcmp(file_ext, "BMP") ||
+       !strcmp(file_ext, "gif") || !strcmp(file_ext, "GIF") ||
+       !strcmp(file_ext, "svg") || !strcmp(file_ext, "SVG"))
+     return FILE_BROWSER_FILE_TYPE_IMAGE;
+
+   if (!strcmp(file_ext, "wav") || !strcmp(file_ext, "WAV") ||
+       !strcmp(file_ext, "ogg") || !strcmp(file_ext, "OGG") ||
+       !strcmp(file_ext, "mp3") || !strcmp(file_ext, "MP3"))
+     return FILE_BROWSER_FILE_TYPE_SOUND;
+
+   if (!strcmp(file_ext, "ttf") || !strcmp(file_ext, "TTF") ||
+       !strcmp(file_ext, "fon") || !strcmp(file_ext, "FON"))
+     return FILE_BROWSER_FILE_TYPE_FONT;
+
+   return FILE_BROWSER_FILE_TYPE_OTHERS;
+}
+
+static brows_file *
+brows_file_create(const char *file_path, Eina_Bool create_sub_file_list)
+{
+   if (!file_path) return NULL;
+   if (!ecore_file_exists(file_path)) return NULL;
+
+   brows_file *file = calloc(1, sizeof(brows_file));
+   if (!file)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+
+   //realpath() works only if the given file exists.
+   char *file_abs_path = ecore_file_realpath(file_path);
+   file->path = file_abs_path;
+   file->name = strdup(ecore_file_file_get(file_abs_path));
+   file->type = brows_file_type_get(file_abs_path);
+
+   //Check whether this file is main file.
+   if (file->type == FILE_BROWSER_FILE_TYPE_EDC &&
+       config_input_path_get())
+     {
+        if (!strcmp(file->name, ecore_file_file_get(config_input_path_get())))
+          file->main = EINA_TRUE;
+     }
+
+   if (create_sub_file_list)
+     file->sub_file_list = sub_brows_file_list_create(file);
+   else
+     file->sub_file_list = NULL;
+
+   return file;
+}
+
+/* Find sub files and Create a list of brows_file. */
+static Eina_List *
+sub_brows_file_list_create(brows_file *file)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return NULL;
+
+   if (!file) return NULL;
+   if (file->type != FILE_BROWSER_FILE_TYPE_DIR) return NULL;
+
+   Eina_List *sub_file_list = NULL;
+
+   Eina_List *sub_file_name_list = ecore_file_ls(file->path);
+   char *sub_file_name = NULL;
+   char *dir_path = file->path;
+   EINA_LIST_FREE(sub_file_name_list, sub_file_name)
+     {
+        int sub_file_path_len = strlen(dir_path) + strlen(sub_file_name) + 2;
+        char *sub_file_path = calloc(1, sizeof(char) * (sub_file_path_len));
+        snprintf(sub_file_path, sub_file_path_len, "%s/%s", dir_path,
+                 sub_file_name);
+        free(sub_file_name);
+
+        //Create sub file without creating its sub file list.
+        brows_file *sub_file = brows_file_create(sub_file_path, EINA_FALSE);
+        free(sub_file_path);
+        if (!sub_file) continue;
+
+        sub_file_list =
+           eina_list_sorted_insert(sub_file_list,
+                                   (Eina_Compare_Cb)file_strcmp_cb,
+                                   sub_file);
+     }
+
+   return sub_file_list;
+}
+
+static void
+brows_file_free(brows_file *file)
+{
+   if (!file) return;
+
+   if (file->path) free(file->path);
+   if (file->name) free(file->name);
+
+   if (file->it)
+     elm_object_item_del(file->it);
+
+   if (file->sub_file_list)
+     brows_file_list_free(file->sub_file_list);
+
+   free(file);
+}
+
+static void
+brows_file_list_free(Eina_List *file_list)
+{
+   if (!file_list) return;
+
+   brows_file *file = NULL;
+   EINA_LIST_FREE(file_list, file)
+     {
+        brows_file_free(file);
+     }
+}
+
+static void
+file_browser_workspace_reset(void)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return;
+
+   elm_genlist_clear(bd->genlist);
+
+   brows_file_free(bd->workspace);
+   bd->workspace = NULL;
+
+   file_browser_workspace_set(config_workspace_path_get());
+}
+
+static void
+search_file_set_internal(const char *file_path)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return;
+   if (!bd->search_entry) return;
+
+   if (!file_path) return;
+
+   const char *search_word = elm_entry_entry_get(bd->search_entry);
+   if (!search_word || !strcmp(search_word, "")) return;
+
+   /* Create brows_file and append genlist item if current file name contains
+      search word. */
+   const char *file_name = ecore_file_file_get(file_path);
+   if (file_name && strstr(file_name, search_word))
+     {
+        //Check "Show All Files" option.
+        File_Browser_File_Type type = brows_file_type_get(file_path);
+        if (elm_check_state_get(bd->show_all_check) ||
+            ((type == FILE_BROWSER_FILE_TYPE_EDC) ||
+             (type == FILE_BROWSER_FILE_TYPE_IMAGE) ||
+             (type == FILE_BROWSER_FILE_TYPE_SOUND) ||
+             (type == FILE_BROWSER_FILE_TYPE_FONT)))
+          {
+             brows_file *file = brows_file_create(file_path, EINA_FALSE);
+             if (file)
+               {
+                  bd->search_file_list =
+                     eina_list_sorted_insert(bd->search_file_list,
+                                             (Eina_Compare_Cb)file_strcmp_cb,
+                                             file);
+               }
+          }
+     }
+
+   if (!ecore_file_is_dir(file_path)) return;
+
+   //Set sub files by calling function resursively.
+   Eina_List *sub_file_name_list = ecore_file_ls(file_path);
+   char *sub_file_name = NULL;
+   const char *dir_path = file_path;
+   EINA_LIST_FREE(sub_file_name_list, sub_file_name)
+     {
+        int sub_file_path_len = strlen(dir_path) + strlen(sub_file_name) + 2;
+        char *sub_file_path = calloc(1, sizeof(char) * (sub_file_path_len));
+        snprintf(sub_file_path, sub_file_path_len, "%s/%s", dir_path,
+                 sub_file_name);
+        free(sub_file_name);
+
+        search_file_set_internal(sub_file_path);
+        free(sub_file_path);
+     }
+}
+
+/* Create brows_file and append genlist item if the given file name contains
+   search word. This function is called recursively. */
+static void
+search_file_set(const char *file_path)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return;
+   if (!bd->search_entry) return;
+
+   if (!file_path) return;
+
+   const char *search_word = elm_entry_entry_get(bd->search_entry);
+   if (!search_word || !strcmp(search_word, "")) return;
+
+   search_file_set_internal(file_path);
+
+   Eina_List *l = NULL;
+   brows_file *file = NULL;
+   EINA_LIST_FOREACH(bd->search_file_list, l, file)
+     {
+        file_genlist_item_append(file, NULL, ELM_GENLIST_ITEM_NONE);
+     }
+}
+
+static void
+refresh_btn_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   file_browser_refresh();
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+/* Set workspace directory. */
+void
+file_browser_workspace_set(const char *workspace_path)
+{
+   brows_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   if (!workspace_path) return;
+   if (!ecore_file_exists(workspace_path)) return;
+   if (!ecore_file_is_dir(workspace_path)) return;
+
+   if (bd->workspace)
+     {
+        if (!strcmp(workspace_path, bd->workspace->path))
+          return;
+
+        brows_file_free(bd->workspace);
+        bd->workspace = NULL;
+     }
+
+   //Create file with creating its sub file list.
+   brows_file *workspace = brows_file_create(workspace_path, EINA_TRUE);
+   EINA_SAFETY_ON_NULL_RETURN(workspace);
+   bd->workspace = workspace;
+
+   elm_object_disabled_set(bd->base_layout, EINA_FALSE);
+
+   Elm_Genlist_Item_Type it_type = ELM_GENLIST_ITEM_NONE;
+   if (workspace->sub_file_list)
+     it_type = ELM_GENLIST_ITEM_TREE;
+   Elm_Object_Item *it = file_genlist_item_append(workspace, NULL, it_type);
+
+   if (workspace->sub_file_list)
+     gl_expanded_request_cb(NULL, NULL, it);
+}
+
+Evas_Object *
+file_browser_init(Evas_Object *parent)
+{
+   brows_data *bd = g_bd;
+   if (bd) return bd->base_layout;
+
+   bd = calloc(1, sizeof(brows_data));
+   if (!bd)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+   g_bd = bd;
+
+   //Base layout
+   Evas_Object *base_layout = elm_layout_add(parent);
+   elm_layout_file_set(base_layout, EDJE_PATH, "tools_layout");
+   evas_object_size_hint_align_set(base_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(base_layout, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_show(base_layout);
+
+   //Main Box
+   Evas_Object *main_box = elm_box_add(base_layout);
+   evas_object_size_hint_align_set(main_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(main_box, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   elm_object_part_content_set(base_layout, "elm.swallow.content", main_box);
+
+   //Tizen Only
+   //Evas_Object *sub_box;
+
+   //Sub box for search.
+   //sub_box = elm_box_add(main_box);
+   //elm_box_padding_set(sub_box, ELM_SCALE_SIZE(5), 0);
+   //elm_box_horizontal_set(sub_box, EINA_TRUE);
+   //evas_object_size_hint_align_set(sub_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   //evas_object_size_hint_weight_set(sub_box, EVAS_HINT_EXPAND, 0);
+   //evas_object_show(sub_box);
+   //elm_box_pack_end(main_box, sub_box);
+
+   //Search Icon
+   //Evas_Object *search_img = elm_image_add(sub_box);
+   //evas_object_size_hint_min_set(search_img, ELM_SCALE_SIZE(15),
+   //                              ELM_SCALE_SIZE(15));
+   //elm_image_file_set(search_img, EDJE_PATH, "search");
+   //evas_object_show(search_img);
+   //elm_box_pack_end(sub_box, search_img);
+
+   //Search Entry
+   //Evas_Object *search_entry = elm_entry_add(sub_box);
+   //elm_entry_single_line_set(search_entry, EINA_TRUE);
+   //elm_entry_scrollable_set(search_entry, EINA_TRUE);
+   //elm_object_part_text_set(search_entry, "guide", "Type file name to search");
+   //evas_object_smart_callback_add(search_entry, "changed",
+   //                               search_entry_changed_cb, NULL);
+   //evas_object_size_hint_align_set(search_entry, EVAS_HINT_FILL,
+   //                                EVAS_HINT_FILL);
+   //evas_object_size_hint_weight_set(search_entry, EVAS_HINT_EXPAND,
+   //                                 EVAS_HINT_EXPAND);
+   //evas_object_show(search_entry);
+   //elm_box_pack_end(sub_box, search_entry);
+
+
+   //Genlist
+   Evas_Object *genlist = elm_genlist_add(main_box);
+   elm_object_focus_allow_set(genlist, EINA_FALSE);
+   evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+
+   evas_object_smart_callback_add(genlist, "expand,request",
+                                  gl_expanded_request_cb, NULL);
+   evas_object_smart_callback_add(genlist, "contract,request",
+                                  gl_contract_request_cb, NULL);
+   evas_object_smart_callback_add(genlist, "expanded", gl_expanded_cb, NULL);
+   evas_object_smart_callback_add(genlist, "contracted", gl_contracted_cb,
+                                  NULL);
+   evas_object_smart_callback_add(genlist, "clicked,double",
+                                  gl_clicked_double_cb, NULL);
+   evas_object_show(genlist);
+   elm_box_pack_end(main_box, genlist);
+
+   //Tizen Only
+   //Show All Files Check
+   //Evas_Object *show_all_check = elm_check_add(main_box);
+   //evas_object_size_hint_align_set(show_all_check, 0, 1);
+   //evas_object_size_hint_weight_set(show_all_check, EVAS_HINT_EXPAND, 0);
+   //elm_object_text_set(show_all_check, "Show All Files");
+   //evas_object_smart_callback_add(show_all_check, "changed",
+   //                               show_all_check_changed_cb, NULL);
+   //evas_object_show(show_all_check);
+   //elm_box_pack_end(main_box, show_all_check);
+
+   //Default Mode Item Class
+   Elm_Genlist_Item_Class *itc;
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_file_text_get_cb;
+   itc->func.content_get = gl_file_content_get_cb;
+   bd->itc = itc;
+
+   //Tizen Only
+   //Search Mode Item Class
+   //Elm_Genlist_Item_Class *search_itc;
+   //search_itc = elm_genlist_item_class_new();
+   //search_itc->item_style = "double_label";
+   //search_itc->func.text_get = gl_search_text_get_cb;
+   //search_itc->func.content_get = gl_search_content_get_cb;
+   //bd->search_itc = search_itc;
+
+   bd->base_layout = base_layout;
+   //Tizen Only
+   //bd->search_entry = search_entry;
+   bd->genlist = genlist;
+   //bd->show_all_check = show_all_check;
+
+   elm_object_disabled_set(base_layout, EINA_TRUE);
+
+   return base_layout;
+}
+
+void
+file_browser_term(void)
+{
+   brows_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   if (bd->workspace) brows_file_free(bd->workspace);
+   if (bd->search_file_list) brows_file_list_free(bd->search_file_list);
+
+   elm_genlist_item_class_free(bd->itc);
+   elm_genlist_item_class_free(bd->search_itc);
+
+   evas_object_del(bd->base_layout);
+
+   free(bd);
+   g_bd = NULL;
+}
+
+void
+file_browser_tools_set(void)
+{
+   brows_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   Evas_Object *rect =
+      evas_object_rectangle_add(evas_object_evas_get(bd->base_layout));
+   evas_object_color_set(rect, 0, 0, 0, 0);
+   elm_object_part_content_set(bd->base_layout, "elm.swallow.tools", rect);
+}
+
+void
+file_browser_tools_visible_set(Eina_Bool visible)
+{
+   brows_data *bd = g_bd;
+   EINA_SAFETY_ON_NULL_RETURN(bd);
+
+   if (visible)
+     elm_object_signal_emit(bd->base_layout, "elm,state,tools,show", "");
+   else
+     elm_object_signal_emit(bd->base_layout, "elm,state,tools,hide", "");
+}
+
+void
+file_browser_refresh(void)
+{
+   brows_data *bd = g_bd;
+   if (!bd) return;
+
+   if (bd->mode == FILE_BROWSER_MODE_DEFAULT)
+     file_browser_workspace_reset();
+   else
+     {
+        if (bd->search_file_list)
+          {
+             brows_file_list_free(bd->search_file_list);
+             bd->search_file_list = NULL;
+          }
+        search_file_set(config_workspace_path_get());
+     }
+}
+
+void
+file_browser_main_file_unset(void)
+{
+   brows_data *bd = g_bd;
+   if (!bd || !bd->main_it) return;
+
+   brows_file *file = elm_object_item_data_get(bd->main_it);
+   if (!file)
+     {
+        EINA_LOG_ERR("No item data??");
+        return;
+     }
+
+   file->main = EINA_FALSE;
+   bd->main_it = NULL;
+
+   elm_genlist_realized_items_update(bd->genlist);
+}
+
+void
+file_browser_selected_file_main_set(void)
+{
+   const char *exception_msg = "Please select a main EDC file in file browser.";
+
+   brows_data *bd = g_bd;
+   if (!bd) return;
+
+   Elm_Object_Item *it = elm_genlist_selected_item_get(bd->genlist);
+   if(!it)
+     {
+        stats_info_msg_update(exception_msg);
+        return;
+     }
+
+   //Same to previous item
+   if (it == bd->main_it)
+     {
+        char buf[1024];
+        brows_file *file = elm_object_item_data_get(it);
+        if (!file) return;
+        snprintf(buf, sizeof(buf), "\"%s\" is already set to main", file->name);
+        stats_info_msg_update(buf);
+        return;
+     }
+
+   brows_file *file = elm_object_item_data_get(it);
+   if (!file)
+     {
+        EINA_LOG_ERR("No item data??");
+        return;
+     }
+
+   if (!file->path)
+     {
+        EINA_LOG_ERR("No item file path??");
+        return;
+
+     }
+
+   if (!eina_str_has_extension(file->path, "edc"))
+     {
+        stats_info_msg_update(exception_msg);
+        return;
+     }
+
+   //Replace main item
+   Elm_Object_Item *prev_main_it = bd->main_it;
+   if (prev_main_it)
+     {
+        brows_file *prev_file = elm_object_item_data_get(prev_main_it);
+        if (prev_file) prev_file->main = EINA_FALSE;
+        else EINA_LOG_ERR("No item data??");
+     }
+
+   file->main = EINA_TRUE;
+   bd->main_it = file->it;
+
+   config_input_path_set(file->path);
+   elm_genlist_realized_items_update(bd->genlist);
+
+   win32_edj_path_reset(NULL);
+}
diff --git a/src/bin/file_mgr.c b/src/bin/file_mgr.c
new file mode 100644 (file)
index 0000000..4f65386
--- /dev/null
@@ -0,0 +1,531 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <Eio.h>
+#include "common.h"
+
+#define FILE_QUEUE_CNT 20
+
+typedef struct file_mgr_s {
+     Eina_List *file_queue;
+     Evas_Object *warning_layout;
+     Enventor_Item *focused_it;
+     Eina_Bool edc_modified : 1;
+     Eina_Bool no_queue : 1;  //file queueing?
+} file_mgr_data;
+
+static file_mgr_data *g_fmd = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+warning_dismiss_done(void *data, Evas_Object *obj EINA_UNUSED,
+                     const char *emission EINA_UNUSED,
+                     const char *source EINA_UNUSED)
+{
+   file_mgr_data *fmd = data;
+   evas_object_del(fmd->warning_layout);
+   enventor_object_focus_set(base_enventor_get(), EINA_TRUE);
+   fmd->warning_layout = NULL;
+}
+
+static void
+warning_close(file_mgr_data *fmd)
+{
+   elm_object_signal_emit(fmd->warning_layout, "elm,state,dismiss", "");
+}
+
+static void
+warning_ignore_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+   file_mgr_data *fmd = data;
+
+   //FIXME: Specify which file has been changed?
+   Enventor_Item *it = enventor_object_focused_item_get(base_enventor_get());
+   enventor_item_modified_set(it, EINA_TRUE);
+
+   warning_close(fmd);
+}
+
+static void
+warning_save_as_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   file_mgr_data *fmd = data;
+
+   //FIXME: Sepcify which file has been changed?
+   Enventor_Item *it = enventor_object_focused_item_get(base_enventor_get());
+   enventor_item_modified_set(it, EINA_TRUE);
+
+   menu_edc_save();
+   warning_close(fmd);
+}
+
+static void
+warning_replace_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   file_mgr_data *fmd = data;
+
+   //FIXME: Specify which file has been changed?
+   file_mgr_main_file_set(config_input_path_get());
+
+   warning_close(fmd);
+}
+
+static void
+warning_open(file_mgr_data *fmd)
+{
+   if (fmd->warning_layout) return;
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(base_win_get());
+   elm_layout_file_set(layout, EDJE_PATH, "warning_layout");
+   elm_object_part_text_set(layout, "elm.text.desc",
+                            _("EDC has been changed on the file system."));
+   elm_object_part_text_set(layout, "elm.text.question",
+                            _("Do you want to replace the contents?"));
+   elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "",
+                                  warning_dismiss_done, fmd);
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(layout);
+   base_win_resize_object_add(layout);
+
+   Evas_Object *btn;
+
+   //Save As Button
+   btn = elm_button_add(layout);
+   elm_object_text_set(btn, _("Save As"));
+   evas_object_smart_callback_add(btn, "clicked", warning_save_as_btn_cb, fmd);
+   elm_object_part_content_set(layout, "elm.swallow.btn1", btn);
+   evas_object_show(btn);
+   elm_object_focus_set(btn, EINA_TRUE);
+
+   //Replace Button
+   btn = elm_button_add(layout);
+   elm_object_text_set(btn, _("Replace"));
+   evas_object_smart_callback_add(btn, "clicked", warning_replace_btn_cb, fmd);
+   elm_object_part_content_set(layout, "elm.swallow.btn2", btn);
+
+   //Igrore Button
+   btn = elm_button_add(layout);
+   elm_object_text_set(btn, _("Ignore"));
+   evas_object_smart_callback_add(btn, "clicked", warning_ignore_btn_cb, fmd);
+   elm_object_part_content_set(layout, "elm.swallow.btn3", btn);
+
+   fmd->warning_layout = layout;
+
+   fmd->edc_modified = EINA_FALSE;
+}
+
+static void
+enventor_edc_modified_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         void *event_info)
+{
+   file_mgr_data *fmd = data;
+   Enventor_EDC_Modified *modified = event_info;
+
+   //Reset console messages.
+   base_console_reset();
+
+   if (modified->self_changed)
+     {
+        fmd->edc_modified = EINA_FALSE;
+        return;
+     }
+
+   fmd->edc_modified = EINA_TRUE;
+
+   /* FIXME: Here ignore edc changes, if any menu is closed, 
+      then we need to open warning box. */
+   if (menu_activated_get()) return;
+
+   warning_open(fmd);
+}
+
+static void
+file_mgr_file_push(file_mgr_data *fmd, const char *file)
+{
+   if (!file) return;
+   if (fmd->no_queue) return;
+
+   //Prevent overflow. Remove first node.
+   if (eina_list_count(fmd->file_queue) >= FILE_QUEUE_CNT)
+     fmd->file_queue = eina_list_remove_list(fmd->file_queue, fmd->file_queue);
+
+   //Append new file.
+   Eina_Stringshare *tmp = eina_stringshare_add(file);
+   fmd->file_queue = eina_list_append(fmd->file_queue, tmp);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+file_mgr_reset(void)
+{
+   file_mgr_data *fmd = g_fmd;
+   EINA_SAFETY_ON_NULL_RETURN(fmd);
+
+   fmd->edc_modified = EINA_FALSE;
+}
+
+int
+file_mgr_edc_modified_get(void)
+{
+   file_mgr_data *fmd = g_fmd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fmd, 0);
+
+   return fmd->edc_modified;
+}
+
+void
+file_mgr_edc_save(void)
+{
+   char buf[PATH_MAX];
+
+   Enventor_Item *it = file_mgr_focused_item_get();
+   Eina_Bool save_success = enventor_item_file_save(it, NULL);
+   if (!config_stats_bar_get()) return;
+
+   if (save_success)
+     snprintf(buf, sizeof(buf), _("File saved. \"%s\""), config_input_path_get());
+   else
+     snprintf(buf, sizeof(buf), _("Already saved. \"%s\""),  config_input_path_get());
+
+   stats_info_msg_update(buf);
+}
+
+Eina_Bool
+file_mgr_warning_is_opened(void)
+{
+   file_mgr_data *fmd = g_fmd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fmd, EINA_FALSE);
+
+   return (fmd->warning_layout ? EINA_TRUE : EINA_FALSE);
+}
+
+void
+file_mgr_warning_open(void)
+{
+   file_mgr_data *fmd = g_fmd;
+   EINA_SAFETY_ON_NULL_RETURN(fmd);
+
+   warning_open(fmd);
+}
+
+void
+file_mgr_warning_close(void)
+{
+   file_mgr_data *fmd = g_fmd;
+   EINA_SAFETY_ON_NULL_RETURN(fmd);
+
+   if (fmd->warning_layout)
+     warning_close(fmd);
+}
+
+void
+file_mgr_init(void)
+{
+   file_mgr_data *fmd = calloc(1, sizeof(file_mgr_data));
+   if (!fmd)
+     {
+        mem_fail_msg();
+        return;
+     }
+   g_fmd = fmd;
+
+   evas_object_smart_callback_add(base_enventor_get(), "edc,modified",
+                                  enventor_edc_modified_cb, fmd);
+}
+
+void
+file_mgr_term(void)
+{
+   file_mgr_data *fmd = g_fmd;
+   if (!fmd) return;
+
+   //Remove file queue
+   Eina_Stringshare *file;
+   EINA_LIST_FREE(fmd->file_queue, file)
+     eina_stringshare_del(file);
+
+   free(fmd);
+}
+
+void
+file_mgr_file_del(Enventor_Item *it)
+{
+   if (!it) return;
+
+   file_mgr_data *fmd = g_fmd;
+
+   if (fmd->focused_it == it)
+     fmd->focused_it = NULL;
+
+   file_tab_it_remove(it);
+}
+
+Enventor_Item *
+file_mgr_sub_file_add(const char *path, Eina_Bool focus)
+{
+   Enventor_Item *it = enventor_object_sub_item_add(base_enventor_get(), path);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, NULL);
+
+   file_tab_it_add(it);
+   if (focus) file_mgr_file_focus(it);
+
+   return it;
+}
+
+Enventor_Item *
+file_mgr_main_file_set(const char *path)
+{
+   file_mgr_data *fmd = g_fmd;
+   if (!fmd) return NULL;
+
+   if (!path)
+     {
+        EINA_LOG_ERR("No path??");
+        return NULL;
+     }
+
+   char *realpath;
+
+   if (ecore_file_exists(path))
+     realpath = ecore_file_realpath(path);
+   else
+     {
+        //This main file is not created yet.
+        FILE *fp = fopen(path, "w");
+        if (fp) fclose(fp);
+        realpath = ecore_file_realpath(path);
+     }
+
+   //If this file is already openend with sub file, remove it.
+   Eina_List *sub_its =
+      (Eina_List *) enventor_object_sub_items_get(base_enventor_get());
+   Eina_List *l;
+   Enventor_Item *it;
+   Eina_Bool replace_focus = EINA_FALSE;
+
+   EINA_LIST_FOREACH(sub_its, l, it)
+     {
+        const char *path2 = enventor_item_file_get(it);
+        if (!path2) continue;
+        if (strcmp(realpath, path2)) continue;
+        file_mgr_file_del(it);
+        if (!fmd->focused_it)
+          replace_focus = EINA_TRUE;
+        break;
+     }
+
+   //Replace the current main file to a sub file.
+   Enventor_Item *main_it = file_mgr_main_item_get();
+   if (main_it)
+     {
+        const char *prev_path = enventor_item_file_get(main_it);
+        if (prev_path)
+          {
+             //Replace the current main file if it is not the new main file.
+             if (strcmp(realpath, prev_path))
+               {
+                  Enventor_Item *it2 = file_mgr_sub_file_add(prev_path,
+                                                             EINA_FALSE);
+                  if (fmd->focused_it == main_it)
+                    fmd->focused_it = it2;
+               }
+             else
+               replace_focus = EINA_TRUE;
+
+             file_mgr_file_del(main_it);
+          }
+     }
+
+   main_it = enventor_object_main_item_set(base_enventor_get(), realpath);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(main_it, NULL);
+
+   if (replace_focus)
+     fmd->focused_it = main_it;
+
+   file_tab_it_add(main_it);
+   file_mgr_file_focus(main_it);
+   base_console_reset();
+
+   free(realpath);
+
+   return main_it;
+}
+
+void
+file_mgr_file_focus(Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN(it);
+
+   file_mgr_data *fmd = g_fmd;
+
+   if (fmd->focused_it && (fmd->focused_it != it))
+     file_mgr_file_push(fmd, enventor_item_file_get(fmd->focused_it));
+
+   file_tab_it_select(it);
+   enventor_item_represent(it);
+   base_title_set(enventor_item_file_get(it));
+   base_edc_navigator_group_update();
+   fmd->focused_it = it;
+
+   //Reset file based contexts.
+   search_reset();
+   goto_close();
+   live_edit_cancel(EINA_FALSE);
+}
+
+Enventor_Item *
+file_mgr_focused_item_get(void)
+{
+   return enventor_object_focused_item_get(base_enventor_get());
+}
+
+Eina_Bool
+file_mgr_save_all(void)
+{
+   file_mgr_data *fmd = g_fmd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fmd, EINA_FALSE);
+
+   if (!fmd->edc_modified) return EINA_TRUE;
+
+   Enventor_Item *it;
+   Eina_Bool ret = EINA_TRUE;
+
+   //Main file.
+   it = file_mgr_main_item_get();
+   if (!enventor_item_file_save(it, NULL)) ret = EINA_FALSE;
+
+   //Sub files.
+   Eina_List *l;
+   Eina_List *sub_its =
+      (Eina_List *) enventor_object_sub_items_get(base_enventor_get());
+   EINA_LIST_FOREACH(sub_its, l, it)
+     {
+        if (!enventor_item_file_save(it, NULL)) ret = EINA_FALSE;
+     }
+
+   fmd->edc_modified = EINA_FALSE;
+
+   return ret;
+}
+
+Enventor_Item *
+file_mgr_main_item_get(void)
+{
+   return enventor_object_main_item_get(base_enventor_get());
+}
+
+Eina_Bool
+file_mgr_modified_get(void)
+{
+   file_mgr_data *fmd = g_fmd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fmd, EINA_FALSE);
+
+   Enventor_Item *it;
+
+   //Main file.
+   it = file_mgr_main_item_get();
+   if (enventor_item_modified_get(it)) return EINA_TRUE;
+
+   //Sub files.
+   Eina_List *l;
+   Eina_List *sub_its =
+      (Eina_List *) enventor_object_sub_items_get(base_enventor_get());
+   EINA_LIST_FOREACH(sub_its, l, it)
+     {
+        if (enventor_item_modified_get(it)) return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+Eina_Bool
+file_mgr_file_open(const char *file_path)
+{
+   if (!file_path) return EINA_FALSE;
+
+   //skip non edc nor header files.
+   if (!(eina_str_has_extension(file_path, "edc") ||
+         eina_str_has_extension(file_path, "h"))) return EINA_FALSE;
+
+   Enventor_Item *eit;
+   const char *it_file_path;
+
+   //Case 1. main file.
+   eit = file_mgr_main_item_get();
+   if (eit)
+     {
+        it_file_path = enventor_item_file_get(eit);
+        if (!it_file_path)
+          {
+             EINA_LOG_ERR("No main item file path??");
+             return EINA_FALSE;
+          }
+        //Ok, This selected file is already openend, let's activate the item.
+        if (!strcmp(file_path, it_file_path))
+          {
+             file_mgr_file_focus(eit);
+             return EINA_TRUE;
+          }
+     }
+
+   //Case 2. sub files.
+   Eina_List *sub_items =
+      (Eina_List *)enventor_object_sub_items_get(base_enventor_get());
+   Eina_List *l;
+   EINA_LIST_FOREACH(sub_items, l, eit)
+     {
+        it_file_path = enventor_item_file_get(eit);
+        if (!it_file_path) continue;
+
+        //Ok, This selected file is already openend, let's activate the item.
+        if (!strcmp(file_path, it_file_path))
+          {
+             file_mgr_file_focus(eit);
+             return EINA_TRUE;
+          }
+     }
+
+   //This selected file hasn't been opened yet, so let's open this file newly.
+   file_mgr_sub_file_add(file_path, EINA_TRUE);
+   return EINA_TRUE;
+}
+
+Eina_Bool
+file_mgr_file_backward(void)
+{
+   file_mgr_data *fmd = g_fmd;
+  if (!fmd) return EINA_FALSE;
+
+   Eina_List *last = eina_list_last(fmd->file_queue);
+   if (!last) return EINA_FALSE;
+
+   Eina_Stringshare *file = eina_list_data_get(last);
+   if (!file)
+     {
+        EINA_LOG_ERR("No file path??");
+        return EINA_FALSE;
+     }
+
+   fmd->file_queue = eina_list_remove_list(fmd->file_queue, last);
+
+   Eina_Bool ret;
+
+   fmd->no_queue = EINA_TRUE;
+   ret = file_mgr_file_open(file);
+   fmd->no_queue = EINA_FALSE;
+
+   eina_stringshare_del(file);
+
+   return ret;
+}
diff --git a/src/bin/file_tab.c b/src/bin/file_tab.c
new file mode 100644 (file)
index 0000000..f00f4ac
--- /dev/null
@@ -0,0 +1,389 @@
+#include "common.h"
+
+typedef struct file_tab_s
+{
+   Evas_Object *list;
+   Evas_Object *box;
+   Elm_Object_Item *selected_it; //list selected item
+} file_data;
+
+typedef struct file_tab_it_s
+{
+   Enventor_Item *enventor_it;
+   Elm_Object_Item *it;
+   Ecore_Animator *animator;
+} file_tab_it;
+
+file_data *g_fd = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+static void
+left_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                    void *event_info EINA_UNUSED)
+{
+   file_data *fd = data;
+
+   Elm_Object_Item *it = elm_list_selected_item_get(fd->list);
+   //just in case
+   if (!it) it = elm_list_last_item_get(fd->list);
+   if (!it) return;
+   it = elm_list_item_prev(it);
+   if (!it) return;
+
+   elm_list_item_selected_set(it, EINA_TRUE);
+   elm_list_item_bring_in(it);
+}
+
+static void
+right_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                     void *event_info EINA_UNUSED)
+{
+   file_data *fd = data;
+
+   Elm_Object_Item *it = elm_list_selected_item_get(fd->list);
+   //just in case
+   if (!it) it = elm_list_first_item_get(fd->list);
+   if (!it) return;
+   it = elm_list_item_next(it);
+   if (!it) return;
+
+   elm_list_item_selected_set(it, EINA_TRUE);
+   elm_list_item_bring_in(it);
+}
+
+static Eina_Bool
+list_item_anim_cb(void *data)
+{
+   file_tab_it *fti = data;
+
+   elm_list_item_bring_in(fti->it);
+   file_mgr_file_focus(fti->enventor_it);
+   fti->animator = NULL;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+list_item_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                      void *event_info)
+{
+   file_data *fd = g_fd;
+   if (!fd) return;
+
+   Elm_Object_Item *it = event_info;
+
+   if (fd->selected_it == it) return;
+
+   //When list item's close button is clicked, this selection is triggered
+   //prior to the close button clicked callback.
+   //It's useless to perform this selected callback anyway this file tab
+   //item is gonna removed soon. But, due to the list's behavior,
+   //it's unavoidable so we need this tricky animator.
+   file_tab_it *fti = data;
+   ecore_animator_del(fti->animator);
+   fti->animator = ecore_animator_add(list_item_anim_cb, fti);
+}
+
+static void
+file_tab_it_remove_internal(file_tab_it *fti)
+{
+   Evas_Object *list = elm_object_item_widget_get(fti->it);
+
+   //FIXME: If this item is main, then it needs to close project.
+
+   //If the focused item is removed, then enable next item.
+   if (elm_list_selected_item_get(list) == fti->it)
+     {
+        //Next?
+        Elm_Object_Item *it;
+        it = elm_list_item_next(fti->it);
+
+        //Prev?
+        if (!it) it = elm_list_item_prev(fti->it);
+
+        if (it)
+          {
+             file_tab_it *next_fti = elm_object_item_data_get(it);
+             file_mgr_file_focus(next_fti->enventor_it);
+          }
+     }
+
+   //Remove item.
+   enventor_item_del(fti->enventor_it);
+   elm_object_item_del(fti->it);
+   ecore_animator_del(fti->animator);
+   free(fti);
+
+   elm_list_go(list);
+}
+
+static void
+close_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                     void *event_info EINA_UNUSED)
+{
+   file_tab_it *fti = data;
+   file_mgr_file_del(fti->enventor_it);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+void
+file_tab_it_remove(Enventor_Item *enventor_it)
+{
+   file_data *fd = g_fd;
+   EINA_SAFETY_ON_NULL_RETURN(fd);
+
+   Eina_List *list = (Eina_List*) elm_list_items_get(fd->list);
+   Eina_List *l;
+   Elm_Object_Item *it;
+
+   EINA_LIST_FOREACH(list, l, it)
+     {
+        file_tab_it *fti = elm_object_item_data_get(it);
+        if (fti->enventor_it == enventor_it)
+          {
+             file_tab_it_remove_internal(fti);
+             break;
+          }
+     }
+}
+
+Eina_Bool
+file_tab_it_select(Enventor_Item *enventor_it)
+{
+   file_data *fd = g_fd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(fd, EINA_FALSE);
+
+   Eina_List *list = (Eina_List*) elm_list_items_get(fd->list);
+   Eina_List *l;
+   Elm_Object_Item *it;
+
+   EINA_LIST_FOREACH(list, l, it)
+     {
+        file_tab_it *fti = elm_object_item_data_get(it);
+        if (fti->enventor_it != enventor_it) continue;
+        fd->selected_it = it;
+        elm_list_item_selected_set(it, EINA_TRUE);
+        elm_list_item_bring_in(it);
+        return EINA_TRUE;
+     }
+
+   fd->selected_it = NULL;
+   return EINA_FALSE;
+}
+
+void
+file_tab_clear(void)
+{
+   file_data *fd = g_fd;
+   EINA_SAFETY_ON_NULL_RETURN(fd);
+
+   Eina_List *list = (Eina_List*) elm_list_items_get(fd->list);
+   Eina_List *l;
+   Elm_Object_Item *it;
+
+   EINA_LIST_FOREACH(list, l, it)
+     {
+        file_tab_it *fti = elm_object_item_data_get(it);
+        ecore_animator_del(fti->animator);
+        free(fti);
+     }
+   elm_list_clear(fd->list);
+}
+
+Eina_Bool
+file_tab_it_add(Enventor_Item *enventor_it)
+{
+   if (!enventor_it)
+     {
+        EINA_LOG_ERR("enventor_it = NULL?");
+        return EINA_FALSE;
+     }
+
+   file_data *fd = g_fd;
+   if (!fd) return EINA_FALSE;
+
+   file_tab_it *fti = NULL;
+   fti = calloc(1, sizeof(file_tab_it));
+   if (!fti)
+     {
+        mem_fail_msg();
+        return EINA_FALSE;
+     }
+
+   const char *filepath = enventor_item_file_get(enventor_it);
+   if (!filepath)
+     {
+        EINA_LOG_ERR("No file path??");
+        goto err;
+     }
+
+   //Filter out file path and just have a file name without extension.
+   char *filename = ecore_file_strip_ext(ecore_file_file_get(filepath));
+   if (!filename)
+     {
+        EINA_LOG_ERR("no filename??");
+        goto err;
+     }
+
+   fti->enventor_it = enventor_it;
+
+   //Close Button
+   Evas_Object *btn = elm_button_add(fd->list);
+   //Tizen Only
+   elm_object_style_set(btn, "help");
+   //elm_object_style_set(btn, ENVENTOR_NAME);
+   elm_object_focus_allow_set(btn, EINA_FALSE);
+
+   Evas_Object *img = elm_image_add(btn);
+   //Tizen Only
+   elm_image_file_set(img, EDJE_PATH, "close_tab");
+   //
+   elm_object_content_set(btn, img);
+
+   //Tizen Only
+   fti->it = elm_list_item_append(fd->list, filename, NULL, btn,
+                                  list_item_selected_cb, fti);
+   //fti->it = elm_list_item_append(fd->list, filename, btn, NULL,
+   //                               list_item_selected_cb, fti);
+
+   elm_object_item_tooltip_text_set(fti->it, filepath);
+
+   elm_list_go(fd->list);
+
+   elm_list_item_bring_in(fti->it);
+
+   evas_object_smart_callback_add(btn, "clicked", close_btn_clicked_cb, fti);
+
+   return EINA_TRUE;
+
+err:
+   free(fti);
+   return EINA_FALSE;
+}
+
+void
+file_tab_disabled_set(Eina_Bool disabled)
+{
+   file_data *fd = g_fd;
+   EINA_SAFETY_ON_NULL_RETURN(fd);
+   elm_object_disabled_set(fd->list, disabled);
+
+   if (disabled) return;
+
+   //Re-select item. This is a little tricky.
+   //When we disable a list, its selected item is dismissed.
+   //So, we manually select the item when list is enabled again.
+   if (!fd->selected_it) return;
+   elm_list_item_selected_set(fd->selected_it, EINA_FALSE);
+   elm_list_item_selected_set(fd->selected_it, EINA_TRUE);
+}
+
+Evas_Object *
+file_tab_init(Evas_Object *parent)
+{
+   file_data *fd = calloc(1, sizeof(file_data));
+   if (!fd)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+   g_fd = fd;
+
+   //Outer Box
+   Evas_Object *box = elm_box_add(parent);
+   //Tizen Only
+   //elm_box_padding_set(box, ELM_SCALE_SIZE(3), 0);
+   elm_box_horizontal_set(box, EINA_TRUE);
+
+   //Left Button
+   Evas_Object *left_btn = elm_button_add(box);
+   //Tizen Only
+   elm_object_style_set(left_btn, "tab_left");
+   //elm_object_style_set(left_btn, ENVENTOR_NAME);
+   elm_object_focus_allow_set(left_btn, EINA_FALSE);
+   evas_object_size_hint_weight_set(left_btn, 0, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(left_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_smart_callback_add(left_btn, "clicked", left_btn_clicked_cb, fd);
+   evas_object_show(left_btn);
+   elm_box_pack_end(box, left_btn);
+
+   //Tizen Only
+   //Left Button Icon
+   //Evas_Object *img1 = elm_image_add(left_btn);
+   //elm_image_file_set(img1, EDJE_PATH, "left_arrow");
+   //elm_object_content_set(left_btn, img1);
+
+   //Right Button
+   Evas_Object *right_btn = elm_button_add(box);
+   //Tizen Only
+   elm_object_style_set(right_btn, "tab_right");
+   //elm_object_style_set(right_btn, ENVENTOR_NAME);
+   elm_object_focus_allow_set(right_btn, EINA_FALSE);
+   evas_object_size_hint_weight_set(right_btn, 0, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(right_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_smart_callback_add(right_btn, "clicked",
+                                  right_btn_clicked_cb, fd);
+   evas_object_show(right_btn);
+   elm_box_pack_end(box, right_btn);
+
+   //Tizen Only
+   //Right Button Icon
+   //Evas_Object *img2 = elm_image_add(right_btn);
+   //elm_image_file_set(img2, EDJE_PATH, "right_arrow");
+   //elm_object_content_set(right_btn, img2);
+
+   //List
+   Evas_Object *list = elm_list_add(box);
+   elm_object_style_set(list, ENVENTOR_NAME);
+   elm_object_focus_allow_set(list, EINA_FALSE);
+   elm_list_horizontal_set(list, EINA_TRUE);
+   elm_scroller_policy_set(list, ELM_SCROLLER_POLICY_OFF,
+                           ELM_SCROLLER_POLICY_OFF);
+   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);
+   elm_box_pack_end(box, list);
+
+   fd->box = box;
+   fd->list = list;
+
+   //Tizen Only
+   //List BG
+   Evas_Object *bg = elm_bg_add(list);
+   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_bg_color_set(bg, 229, 229, 229);
+   elm_object_part_content_set(list, "elm.swallow.bg", bg);
+   //
+
+   return box;
+}
+
+void
+file_tab_term(void)
+{
+   file_data *fd = g_fd;
+   EINA_SAFETY_ON_NULL_RETURN(fd);
+
+   file_tab_it *fti;
+   Eina_List *l;
+   Elm_Object_Item *it;
+   Eina_List *children = (Eina_List *)elm_list_items_get(fd->list);
+   EINA_LIST_FOREACH(children, l, it)
+     {
+        fti = elm_object_item_data_get(it);
+        ecore_animator_del(fti->animator);
+        free(fti);
+     }
+
+   evas_object_del(fd->box);
+
+   free(fd);
+   g_fd = NULL;
+}
+
diff --git a/src/bin/goto.c b/src/bin/goto.c
new file mode 100644 (file)
index 0000000..42789bc
--- /dev/null
@@ -0,0 +1,244 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "common.h"
+
+typedef struct goto_s
+{
+   Evas_Object *win;
+   Evas_Object *layout;
+   Evas_Object *entry;
+   Evas_Object *btn;
+   Enventor_Item *it;
+} goto_data;
+
+static goto_data *g_gd = NULL;
+static Evas_Coord win_x = -1;
+static Evas_Coord win_y = -1;
+static Evas_Coord win_w = DEFAULT_GOTO_WIN_W;
+static Evas_Coord win_h = DEFAULT_GOTO_WIN_H;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+win_delete_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+   goto_close();
+}
+
+static void
+win_moved_cb(void *data EINA_UNUSED, Evas_Object *obj,
+             void *event_info EINA_UNUSED)
+{
+   /* Move the window with the previous remembered position when the window is
+      moved by window manager first time. */
+   if ((win_x != -1) || (win_y != -1)) evas_object_move(obj, win_x, win_y);
+   evas_object_smart_callback_del(obj, "moved", win_moved_cb);
+}
+
+static void
+goto_line(goto_data *gd)
+{
+  const char *txt = elm_entry_entry_get(gd->entry);
+  int line = 0;
+  if (txt) line = atoi(txt);
+  enventor_item_line_goto(gd->it, line);
+  goto_close();
+}
+
+static void
+entry_activated_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                   void* event_info EINA_UNUSED)
+{
+   goto_data *gd = data;
+   if (elm_object_disabled_get(gd->btn)) return;
+   goto_line(gd);
+}
+
+static void
+entry_changed_cb(void *data, Evas_Object *obj, void* event_info EINA_UNUSED)
+{
+   goto_data *gd = data;
+   const char *txt = elm_entry_entry_get(obj);
+
+   if (!txt) return;
+
+   if (txt[0] == 0) return;
+
+   int line = atoi(txt);
+
+   if ((line < 1) ||
+       (line > enventor_item_max_line_get(gd->it)))
+     {
+        elm_object_part_text_set(gd->layout, "elm.text.msg",
+                                 _("Invalid line number"));
+        elm_object_disabled_set(gd->btn, EINA_TRUE);
+     }
+   else
+     {
+        elm_object_part_text_set(gd->layout, "elm.text.msg", "");
+        elm_object_disabled_set(gd->btn, EINA_FALSE);
+     }
+}
+
+static void
+btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   goto_data *gd = data;
+   goto_line(gd);
+}
+
+static void
+keygrabber_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+                       Evas_Object *obj  EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   goto_close();
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+goto_open(void)
+{
+   static Elm_Entry_Filter_Accept_Set digits_filter_data;
+   goto_data *gd = g_gd;
+
+   if (gd)
+   {
+      elm_win_activate(gd->win);
+      return;
+   }
+
+   search_close();
+
+   Enventor_Item *it = file_mgr_focused_item_get();
+
+   gd = calloc(1, sizeof(goto_data));
+   if (!gd)
+     {
+        mem_fail_msg();
+        return;
+     }
+   g_gd = gd;
+
+   //Win
+   Evas_Object *win = elm_win_add(base_win_get(), _("EDC Editor Goto Line"),
+                                  ELM_WIN_DIALOG_BASIC);
+   elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+
+   elm_win_title_set(win, _("Go to Line"));
+   win_w = (Evas_Coord) ((double) win_w * elm_config_scale_get());
+   win_h = (Evas_Coord) ((double) win_h * elm_config_scale_get());
+   evas_object_resize(win, win_w, win_h);
+   evas_object_smart_callback_add(win, "delete,request", win_delete_request_cb,
+                                  gd);
+   evas_object_smart_callback_add(win, "moved", win_moved_cb, gd);
+
+   //Window icon
+   char buf_path[PATH_MAX];
+   Evas_Object *icon = evas_object_image_add(evas_object_evas_get(win));
+#ifdef _WIN32
+   snprintf(buf_path, sizeof(buf_path), "%s/images/enventor.ico",
+            elm_app_data_dir_get());
+#else
+   snprintf(buf_path, sizeof(buf_path), "%s/images/enventor_logo.png",
+            elm_app_data_dir_get());
+#endif
+   evas_object_image_file_set(icon, buf_path, NULL);
+   elm_win_icon_object_set(win, icon);
+
+   //Bg
+   Evas_Object *bg = elm_bg_add(win);
+   evas_object_show(bg);
+   elm_win_resize_object_add(win, bg);
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(win);
+   elm_layout_file_set(layout, EDJE_PATH, "goto_layout");
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(layout);
+   elm_win_resize_object_add(win, layout);
+
+   char  buf[256];
+   snprintf(buf, sizeof(buf), _("Enter line number [1..%d]:"),
+            enventor_item_max_line_get(it));
+   elm_object_part_text_set(layout, "elm.text.goto", buf);
+
+   //Entry (line)
+   Evas_Object *entry = elm_entry_add(layout);
+   //Tizen Only
+   elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
+   elm_object_style_set(entry, "single_line");
+   elm_entry_single_line_set(entry, EINA_TRUE);
+   elm_entry_scrollable_set(entry, EINA_TRUE);
+
+   digits_filter_data.accepted = "0123456789";
+   digits_filter_data.rejected = NULL;
+   elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set,
+                                  &digits_filter_data);
+   evas_object_smart_callback_add(entry, "activated", entry_activated_cb,
+                                  gd);
+   evas_object_smart_callback_add(entry, "changed,user", entry_changed_cb, gd);
+   evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0);
+   evas_object_show(entry);
+   elm_object_focus_set(entry, EINA_TRUE);
+   elm_object_part_content_set(layout, "elm.swallow.entry", entry);
+
+   //Button (ok)
+   Evas_Object *btn = elm_button_add(layout);
+   elm_object_text_set(btn, _("Ok"));
+   evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, gd);
+   elm_object_part_content_set(layout, "elm.swallow.btn",
+                               btn);
+   evas_object_show(win);
+
+   //Keygrabber
+   Evas_Object *keygrabber =
+      evas_object_rectangle_add(evas_object_evas_get(win));
+   evas_object_event_callback_add(keygrabber, EVAS_CALLBACK_KEY_DOWN,
+                                  keygrabber_key_down_cb, gd);
+   if (!evas_object_key_grab(keygrabber, "Escape", 0, 0, EINA_TRUE))
+     EINA_LOG_ERR(_("Failed to grab key - Escape"));
+
+   tools_goto_update();
+
+   gd->win = win;
+   gd->layout = layout;
+   gd->entry = entry;
+   gd->btn = btn;
+   gd->it = it;
+}
+
+Eina_Bool
+goto_is_opened(void)
+{
+   goto_data *gd = g_gd;
+   return (gd ? EINA_TRUE : EINA_FALSE);
+}
+
+Eina_Bool
+goto_close(void)
+{
+   goto_data *gd = g_gd;
+   if (!gd) return EINA_FALSE;
+
+   //Save last state
+   evas_object_geometry_get(gd->win, NULL, NULL, &win_w, &win_h);
+   elm_win_screen_position_get(gd->win, &win_x, &win_y);
+   evas_object_del(gd->win);
+   free(gd);
+   g_gd = NULL;
+
+   tools_goto_update();
+
+   return EINA_TRUE;
+}
diff --git a/src/bin/help.c b/src/bin/help.c
new file mode 100644 (file)
index 0000000..4bbf318
--- /dev/null
@@ -0,0 +1,251 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "common.h"
+
+static Evas_Coord win_x = -1;
+static Evas_Coord win_y = -1;
+static Evas_Coord win_w = DEFAULT_HELP_WIN_W;
+static Evas_Coord win_h = DEFAULT_HELP_WIN_H;
+static Evas_Object *g_win = NULL;
+static Evas_Object *g_layout = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+keygrabber_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+                       Evas_Object *obj  EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   help_close();
+}
+
+static void
+win_delete_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+   help_close();
+}
+
+static void
+win_moved_cb(void *data EINA_UNUSED, Evas_Object *obj,
+             void *event_info EINA_UNUSED)
+{
+   /* Move the window with the previous remembered position when the window is
+      moved by window manager first time. */
+   if ((win_x != -1) || (win_y != -1)) evas_object_move(obj, win_x, win_y);
+   evas_object_smart_callback_del(obj, "moved", win_moved_cb);
+}
+
+static void
+list_item_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Evas_Object *layout;
+   Evas_Object *label;
+   Evas_Object *entry;
+   char buf[PATH_MAX];
+   char *item = data;
+
+   layout = g_layout;
+   label = elm_object_part_content_get(layout, "swallow_label");
+   entry = elm_object_part_content_get(layout, "swallow_entry");
+   elm_scroller_region_show(entry, 0, 0, 0, 0);
+   elm_object_signal_emit(layout, "elm,state,content,show", "");
+
+   //Read File
+   if (!strcmp(item, "about"))
+   {
+      //Tizen Only
+      elm_object_text_set(label, "<font_size=13><b>About</b></font_size>");
+      //elm_object_text_set(label, "<font_size=11><b>About</b></font_size>");
+      snprintf(buf, sizeof(buf), "%s/help/INTRO", elm_app_data_dir_get());
+      elm_entry_autosave_set(entry, EINA_FALSE);
+      elm_entry_file_set(entry, buf, ELM_TEXT_FORMAT_MARKUP_UTF8);
+   }
+   else if (!strcmp(item, "history"))
+   {
+      //Tizen Only
+      elm_object_text_set(label, "<font_size=13><b>Version History</b></font_size>");
+      //elm_object_text_set(label, "<font_size=11><b>Version History</b></font_size>");
+      snprintf(buf, sizeof(buf), "%s/help/HISTORY", elm_app_data_dir_get());
+      elm_entry_autosave_set(entry, EINA_FALSE);
+      elm_entry_file_set(entry, buf, ELM_TEXT_FORMAT_MARKUP_UTF8);
+   }
+   else if (!strcmp(item, "shortcut"))
+   {
+      //Tizen Only
+      elm_object_text_set(label, "<font_size=13><b>Hot Keys</b></font_size>");
+      //elm_object_text_set(label, "<font_size=11><b>Hot Keys</b></font_size>");
+      snprintf(buf, sizeof(buf), "%s/help/SHORTCUT", elm_app_data_dir_get());
+      elm_entry_autosave_set(entry, EINA_FALSE);
+      elm_entry_file_set(entry, buf, ELM_TEXT_FORMAT_MARKUP_UTF8);
+   }
+   else if (!strcmp(item, "command"))
+   {
+      //Tizen Only
+      elm_object_text_set(label, "<font_size=13><b>Commandline Usage</b></font_size>");
+      //elm_object_text_set(label, "<font_size=11><b>Commandline Usage</b></font_size>");
+      snprintf(buf, sizeof(buf), "%s/help/COMMAND", elm_app_data_dir_get());
+      elm_entry_autosave_set(entry, EINA_FALSE);
+      elm_entry_file_set(entry, buf, ELM_TEXT_FORMAT_MARKUP_UTF8);
+   }
+   else if (!strcmp(item, "devel"))
+   {
+      //Tizen Only
+      elm_object_text_set(label, "<font_size=13><b>Developers</b></font_size>");
+      //elm_object_text_set(label, "<font_size=11><b>Developers</b></font_size>");
+      snprintf(buf, sizeof(buf), "%s/help/DEVEL", elm_app_data_dir_get());
+      elm_entry_autosave_set(entry, EINA_FALSE);
+      elm_entry_file_set(entry, buf, ELM_TEXT_FORMAT_MARKUP_UTF8);
+   }
+}
+
+static void
+button_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Evas_Object *layout = g_layout;
+   Evas_Object *list = elm_object_part_content_get(layout, "swallow_list");
+   elm_list_item_selected_set(elm_list_selected_item_get(list), EINA_FALSE);
+   elm_object_signal_emit(layout, "elm,state,content,hide", "");
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+help_open(void)
+{
+   Evas_Object *win = g_win;
+   if (win)
+   {
+      elm_win_activate(win);
+      return;
+   }
+
+   char buf[PATH_MAX];
+
+   //Win
+   win = elm_win_add(base_win_get(), _("EDC Editor Help"), ELM_WIN_BASIC);
+   elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+   snprintf(buf, sizeof(buf), "EDC Editor v%s", PACKAGE_VERSION);
+   elm_win_title_set(win, buf);
+   evas_object_smart_callback_add(win, "delete,request", win_delete_request_cb,
+                                  NULL);
+   evas_object_smart_callback_add(win, "moved", win_moved_cb, NULL);
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(win);
+   elm_layout_file_set(layout, EDJE_PATH, "help_layout");
+   evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, layout);
+   evas_object_show(layout);
+   g_layout = layout;
+
+   //List
+   Evas_Object *list = elm_list_add(win);
+   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_tree_focus_allow_set(list, EINA_FALSE);
+   elm_list_select_mode_set(list, ELM_OBJECT_SELECT_MODE_DEFAULT);
+   evas_object_show(list);
+
+   elm_object_part_content_set(layout, "swallow_list", list);
+
+   //Tizen Only
+   //elm_list_item_append(list, "About", NULL, NULL, list_item_selected_cb,
+   //                     "about");
+   //elm_list_item_append(list, "Version History", NULL, NULL, list_item_selected_cb,
+   //                     "history");
+   //elm_list_item_append(list, "Shortcut Keys", NULL, NULL, list_item_selected_cb,
+   //                     "shortcut");
+   //elm_list_item_append(list, "Commandline Usage", NULL, NULL, list_item_selected_cb,
+   //                     "command");
+   //elm_list_item_append(list, "Developers", NULL, NULL, list_item_selected_cb,
+   //                     "devel");
+   elm_list_item_append(list, "      1.About", NULL, NULL, list_item_selected_cb,
+                        "about");
+   elm_list_item_append(list, "      2.Version History", NULL, NULL, list_item_selected_cb,
+                        "history");
+   elm_list_item_append(list, "      3.Hot Keys", NULL, NULL, list_item_selected_cb,
+                        "shortcut");
+   //
+
+   //Label
+   Evas_Object *label =  elm_label_add(win);
+   evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(label);
+
+   elm_object_part_content_set(layout, "swallow_label", label);
+
+   //Entry
+   Evas_Object *entry = elm_entry_add(win);
+   elm_entry_scrollable_set(entry, EINA_TRUE);
+   elm_entry_editable_set(entry, EINA_FALSE);
+   elm_entry_line_wrap_set(entry, ELM_WRAP_WORD);
+   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);
+
+   elm_object_part_content_set(layout, "swallow_entry", entry);
+
+   //Back Button
+   Evas_Object *button = elm_button_add(win);
+   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_smart_callback_add(button, "clicked", button_clicked_cb, NULL);
+   elm_object_focus_allow_set(button, EINA_FALSE);
+   //Tizen Only
+   //elm_object_style_set(button, ENVENTOR_NAME);
+   elm_object_style_set(button, "help");
+   evas_object_show(button);
+
+   //Back Button Icon
+   Evas_Object *back_img = elm_image_add(button);
+   elm_image_file_set(back_img, EDJE_PATH, "close");
+   elm_object_content_set(button, back_img);
+
+   elm_object_part_content_set(layout, "swallow_button", button);
+
+   //Content hide
+   elm_object_signal_emit(layout, "elm,state,content,hide", "");
+
+   //Window
+   win_w = (Evas_Coord) ((double) win_w * elm_config_scale_get());
+   win_h = (Evas_Coord) ((double) win_h * elm_config_scale_get());
+   evas_object_resize(win, win_w, win_h);
+   evas_object_show(win);
+
+   //Keygrabber
+   Evas_Object *keygrabber =
+      evas_object_rectangle_add(evas_object_evas_get(win));
+   evas_object_event_callback_add(keygrabber, EVAS_CALLBACK_KEY_DOWN,
+                                  keygrabber_key_down_cb, NULL);
+   if (!evas_object_key_grab(keygrabber, "Escape", 0, 0, EINA_TRUE))
+     EINA_LOG_ERR(_("Failed to grab key - Escape"));
+
+   g_win = win;
+}
+
+void
+help_close(void)
+{
+   Evas_Object *win = g_win;
+   if (!win) return;
+
+   Evas_Object *layout = g_layout;
+   if (!layout) return;
+   evas_object_del(layout);
+   g_layout = NULL;
+
+   //Save last state
+   evas_object_geometry_get(win, NULL, NULL, &win_w, &win_h);
+   elm_win_screen_position_get(win, &win_x, &win_y);
+   evas_object_del(win);
+   g_win = NULL;
+}
diff --git a/src/bin/live_edit.c b/src/bin/live_edit.c
new file mode 100644 (file)
index 0000000..b4f9c7d
--- /dev/null
@@ -0,0 +1,2413 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <Elementary_Cursor.h>
+#include "common.h"
+
+#define CTRL_PT_LAYER 3
+#define INFO_TEXT_LAYER (CTRL_PT_LAYER+1)
+#define PART_NAME_MAX 1024
+#define ALIGN_LINE_LEFT 0x0001
+#define ALIGN_LINE_RIGHT 0x0010
+#define ALIGN_LINE_TOP 0x0100
+#define ALIGN_LINE_BOTTOM 0x1000
+
+typedef struct livedit_item_s
+{
+   const char *name;
+   Edje_Part_Type type;
+} liveedit_item;
+
+typedef enum
+{
+   Ctrl_Pt_Rel1 = 0,
+   Ctrl_Pt_Rel2,
+   Ctrl_Pt_Rel3,
+   Ctrl_Pt_Rel4,
+   Ctrl_Pt_Top,
+   Ctrl_Pt_Bottom,
+   Ctrl_Pt_Left,
+   Ctrl_Pt_Right,
+   Ctrl_Pt_Cnt
+} Ctrl_Pt;
+
+typedef enum
+{
+   Info_Text_Rel1 = 0,
+   Info_Text_Rel2,
+   Info_Text_Size,
+   Info_Text_Cnt
+} Info_Text;
+
+typedef enum
+{
+   Align_Line_Top,
+   Align_Line_Bottom,
+   Align_Line_Left,
+   Align_Line_Right,
+   Align_Line_Cnt
+} Align_Line;
+
+typedef struct live_editor_s
+{
+   Evas_Object *layout;
+   Evas_Object *live_view;
+   Evas_Object *ctrl_pt[Ctrl_Pt_Cnt];
+   Evas_Object *align_line[Align_Line_Cnt];
+   Evas_Object *info_text[Info_Text_Cnt];
+   Evas_Object *info_text_bg[Info_Text_Cnt];
+   Evas_Coord_Point move_delta;
+   double half_ctrl_size;
+   unsigned int type;
+
+   //Relative setting properties
+   struct {
+      float rel1_x, rel1_y;
+      float rel2_x, rel2_y;
+   } rel_info;
+
+   //Relative to information for live edit item
+   struct {
+      char *rel1_x_part, *rel1_y_part;
+      char *rel2_x_part, *rel2_y_part;
+      float rel1_x, rel1_y;
+      float rel2_x, rel2_y;
+      float align_x, align_y;
+      int min_w, min_h;
+      Evas_Object *ctxpopup;
+   } rel_to_info;
+
+   Evas_Object *keygrabber;
+   Eina_Array *auto_align_array;
+   Ctrl_Pt last_cp;
+
+   Evas_Object *fixed_w_check;
+   Evas_Object *fixed_h_check;
+
+   Eina_Bool on : 1;
+   Eina_Bool align_left : 1;
+   Eina_Bool align_right : 1;
+   Eina_Bool align_top : 1;
+   Eina_Bool align_bottom : 1;
+   Eina_Bool ctrl_pressed : 1;
+} live_data;
+
+typedef struct auto_align_data_s
+{
+   char part_name[PART_NAME_MAX];
+   Evas_Coord_Point pt1;
+   Evas_Coord_Point pt2;
+} auto_align_data;
+
+typedef struct rel_to_data_s
+{
+  char part_name[PART_NAME_MAX];
+  float rel_x, rel_y;
+  Evas_Coord_Point pt1, pt2;
+  live_data *ld;
+} rel_to_data;
+
+#define LIVEEDIT_ITEMS_NUM 6
+
+static live_data *g_ld = NULL;
+
+static const liveedit_item LIVEEDIT_ITEMS[] =
+{
+     {"Rect", EDJE_PART_TYPE_RECTANGLE},
+     {"Text", EDJE_PART_TYPE_TEXT},
+     {"Image", EDJE_PART_TYPE_IMAGE},
+     {"Swallow", EDJE_PART_TYPE_SWALLOW},
+     {"Textblock", EDJE_PART_TYPE_TEXTBLOCK},
+     {"Spacer", EDJE_PART_TYPE_SPACER} //Please leave spacer at last
+};
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void live_edit_update_internal(live_data *ld);
+
+static void
+update_line_attach_effect(live_data *ld, int align_line)
+{
+   //Left
+   if ((align_line & ALIGN_LINE_LEFT))
+     {
+        if (!ld->align_left)
+          {
+             ld->align_left = EINA_TRUE;
+             elm_object_signal_emit(ld->align_line[Align_Line_Left],
+                                    "elm,state,show,highlight", "");
+          }
+     }
+   else
+     {
+        if (ld->align_left)
+          {
+             ld->align_left = EINA_FALSE;
+             elm_object_signal_emit(ld->align_line[Align_Line_Left],
+                                    "elm,state,hide,highlight", "");
+          }
+     }
+   //Right
+   if ((align_line & ALIGN_LINE_RIGHT))
+     {
+        if (!ld->align_right)
+          {
+             ld->align_right = EINA_TRUE;
+             elm_object_signal_emit(ld->align_line[Align_Line_Right],
+                                    "elm,state,show,highlight", "");
+          }
+     }
+   else
+     {
+        if (ld->align_right)
+          {
+             ld->align_right = EINA_FALSE;
+             elm_object_signal_emit(ld->align_line[Align_Line_Right],
+                                    "elm,state,hide,highlight", "");
+          }
+     }
+   //Top
+   if ((align_line & ALIGN_LINE_TOP))
+     {
+        if (!ld->align_top)
+          {
+             ld->align_top = EINA_TRUE;
+             elm_object_signal_emit(ld->align_line[Align_Line_Top],
+                                    "elm,state,show,highlight", "");
+          }
+     }
+   else
+     {
+        if (ld->align_top)
+          {
+             ld->align_top = EINA_FALSE;
+             elm_object_signal_emit(ld->align_line[Align_Line_Top],
+                                    "elm,state,hide,highlight", "");
+          }
+     }
+   //Bottom
+   if ((align_line & ALIGN_LINE_BOTTOM))
+     {
+        if (!ld->align_bottom)
+          {
+             ld->align_bottom = EINA_TRUE;
+             elm_object_signal_emit(ld->align_line[Align_Line_Bottom],
+                                    "elm,state,show,highlight", "");
+          }
+     }
+   else
+     {
+        if (ld->align_bottom)
+          {
+             ld->align_bottom = EINA_FALSE;
+             elm_object_signal_emit(ld->align_line[Align_Line_Bottom],
+                                    "elm,state,hide,highlight", "");
+          }
+     }
+}
+
+static Evas_Object *
+view_scroller_get(live_data *ld)
+{
+   //This is a trick! we got the actual view object from the live edit.
+   if (!ld->live_view) return NULL;
+   return elm_object_part_content_get(ld->live_view,
+                                      "elm.swallow.content");
+}
+
+static Evas_Object *
+view_obj_get(live_data *ld)
+{
+   //This is a trick! we got the actual view object from the live edit.
+   Evas_Object *o = view_scroller_get(ld);
+   if (!o) return NULL;
+   Evas_Object *o2 = elm_object_content_get(o);
+   if (!o2) return NULL;
+   return elm_object_part_content_get(o2, "elm.swallow.content");
+}
+
+static void
+view_obj_member_add(live_data *ld, Evas_Object *obj)
+{
+   //This is a trick! we got the actual view object from the live edit.
+   Evas_Object *scroller = view_scroller_get(ld);
+   if (!scroller) return;
+
+   evas_object_smart_member_add(obj, scroller);
+
+   Evas_Object *scroller_edje = elm_layout_edje_get(scroller);
+   Evas_Object *clipper =
+      (Evas_Object *)edje_object_part_object_get(scroller_edje, "clipper");
+   evas_object_clip_set(obj, clipper);
+}
+
+static void
+view_scroll_cb(void *data, Evas_Object *obj EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   live_data *ld = data;
+   live_edit_update_internal(ld);
+}
+
+static void
+info_text_update(live_data *ld)
+{
+   //Update Text
+   char buf[256];
+
+   Evas_Coord lx, ly, lw, lh;
+   evas_object_geometry_get(ld->live_view, &lx, &ly, &lw, &lh);
+
+   Enventor_Object *enventor = base_enventor_get();
+
+   Evas_Coord vw, vh;
+   enventor_object_live_view_size_get(enventor, &vw, &vh);
+
+   //reverse coordinates if mirror mode is enabled.
+   double ox = ld->rel_info.rel1_x;
+   double ox2 = ld->rel_info.rel2_x;
+   double ow = (ld->rel_info.rel1_x * (double) vw);
+   double ow2 = (ld->rel_info.rel2_x * (double) vw);
+
+   if (enventor_object_mirror_mode_get(enventor))
+     {
+        ox = 1 - ox;
+        ox2 = 1 - ox2;
+        ow = vw - ow;
+        ow2 = vw - ow2;
+     }
+
+   //Rel1
+   snprintf(buf, sizeof(buf), "%.2f %.2f (%d, %d)",
+            ox, ld->rel_info.rel1_y,
+            (int) round(ow),
+            (int) round(ld->rel_info.rel1_y * (double) vh));
+   evas_object_text_text_set(ld->info_text[Info_Text_Rel1], buf);
+
+   //Rel2
+   snprintf(buf, sizeof(buf), "%.2f %.2f (%d, %d)",
+            ox2, ld->rel_info.rel2_y,
+            (int) round(ow2),
+            (int) round(ld->rel_info.rel2_y * (double) vh));
+   evas_object_text_text_set(ld->info_text[Info_Text_Rel2], buf);
+
+   //Size
+   vw = (Evas_Coord) round(((double) vw) *
+                           (ld->rel_info.rel2_x - ld->rel_info.rel1_x));
+   vh = (Evas_Coord) round(((double) vh) *
+                           (ld->rel_info.rel2_y - ld->rel_info.rel1_y));
+   snprintf(buf, sizeof(buf), "%d X %d", vw, vh);
+   evas_object_text_text_set(ld->info_text[Info_Text_Size], buf);
+
+   //Update Position
+   Evas_Coord x, y, w, h;
+   Evas_Coord rx, ry, rw, rh;
+
+   //Rel1
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel1], &rx, &ry, &rw, &rh);
+   evas_object_geometry_get(ld->info_text[Info_Text_Rel1], NULL, NULL, &w, &h);
+   x = (rx + rw);
+   y = ry - h;
+   if ((x + w) > (lx + lw)) x = (rx - w);
+   if (y < ly) y = (ry + rh);
+   evas_object_move(ld->info_text[Info_Text_Rel1], x, y);
+
+   //Rel1 BG
+   evas_object_move(ld->info_text_bg[Info_Text_Rel1], x - 2, y);
+   evas_object_resize(ld->info_text_bg[Info_Text_Rel1], w + 4, h);
+
+   //Rel2
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel2], &rx, &ry, &rw, &rh);
+   evas_object_geometry_get(ld->info_text[Info_Text_Rel2], NULL, NULL, &w, &h);
+   x = (rx - w);
+   y = (ry + rh);
+   if (x < lx) x = (rx + rw);
+   if ((y + h) > (ly + lh)) y = (ry - h);
+   evas_object_move(ld->info_text[Info_Text_Rel2], x, y);
+
+   //Rel2 BG
+   evas_object_move(ld->info_text_bg[Info_Text_Rel2], x - 2, y);
+   evas_object_resize(ld->info_text_bg[Info_Text_Rel2], w + 4, h);
+
+   //Size
+   Evas_Coord layout_x, layout_y, layout_w, layout_h;
+   evas_object_geometry_get(ld->layout, &layout_x, &layout_y, &layout_w,
+                            &layout_h);
+   evas_object_geometry_get(ld->info_text[Info_Text_Size], NULL, NULL, &w, &h);
+   x = (layout_x + (layout_w/2)) - (w/2);
+   y = (layout_y + (layout_h/2)) - (h/2);
+   if (x < lx) x = lx;
+   if (y < ly) y = ly;
+   if ((x + w) > (lx + lw)) x = ((lx + lw) - w);
+   if ((y + h) > (ly + lh)) y = ((ly + lh) - h);
+   evas_object_move(ld->info_text[Info_Text_Size], x, y);
+
+   //Size BG
+   evas_object_move(ld->info_text_bg[Info_Text_Size], x - 2, y);
+   evas_object_resize(ld->info_text_bg[Info_Text_Size], w + 4, h);
+}
+
+static void
+live_edit_symbol_set(live_data *ld)
+{
+   char buf[PATH_MAX];
+   snprintf(buf, sizeof(buf), "%s_bg", LIVEEDIT_ITEMS[ld->type].name);
+   Evas_Object *layout_symbol = elm_layout_add(ld->layout);
+   elm_layout_file_set(layout_symbol, EDJE_PATH, buf);
+   elm_object_scale_set(layout_symbol,
+                     (1/enventor_object_base_scale_get(base_enventor_get())) *
+                     enventor_object_live_view_scale_get(base_enventor_get()));
+   elm_object_part_content_set(ld->layout, "elm.swallow.symbol", layout_symbol);
+}
+
+static void
+calc_relative_info(live_data *ld)
+{
+   //For Current Input Live Edit Item size
+   Evas_Coord lx, ly, lw, lh;
+   evas_object_geometry_get(ld->layout, &lx, &ly, &lw, &lh);
+
+   //Check fixed properties
+   Eina_Bool fixed_w = elm_check_state_get(ld->fixed_w_check);
+   Eina_Bool fixed_h = elm_check_state_get(ld->fixed_h_check);
+
+   //For real min size of Live Edit Item
+   Evas_Coord vw, vh;
+   enventor_object_live_view_size_get(base_enventor_get(), &vw, &vh);
+
+   //Calculate real min size of Live Edit Item base on current relative
+   double base_scale = enventor_object_base_scale_get(base_enventor_get());
+   Evas_Coord min_w =
+      (Evas_Coord) round(((double) vw) *
+                         (ld->rel_info.rel2_x - ld->rel_info.rel1_x) *
+                         base_scale);
+   Evas_Coord min_h =
+      (Evas_Coord) round(((double) vh) *
+                         (ld->rel_info.rel2_y - ld->rel_info.rel1_y) *
+                         base_scale);
+
+   //Set fixed properties of width for current Live Edit Item
+   if (fixed_w)
+     {
+        if (ld->rel_to_info.rel1_x_part)
+          {
+             ld->rel_to_info.align_x = 0.0;
+             ld->rel_to_info.rel2_x = ld->rel_to_info.rel1_x;
+             free(ld->rel_to_info.rel2_x_part);
+             ld->rel_to_info.rel2_x_part = strndup(ld->rel_to_info.rel1_x_part,
+                                          strlen(ld->rel_to_info.rel1_x_part));
+          }
+        else if (ld->rel_to_info.rel2_x_part)
+          {
+             ld->rel_to_info.align_x = 1.0;
+             ld->rel_to_info.rel1_x = ld->rel_to_info.rel2_x;
+             free(ld->rel_to_info.rel1_x_part);
+             ld->rel_to_info.rel1_x_part = strndup(ld->rel_to_info.rel2_x_part,
+                                          strlen(ld->rel_to_info.rel2_x_part));
+          }
+        else
+          {
+             float center = (ld->rel_info.rel1_x + ld->rel_info.rel2_x) / 2;
+             ld->rel_to_info.rel1_x = center;
+             ld->rel_to_info.rel2_x = center;
+          }
+        ld->rel_to_info.min_w = min_w;
+     }
+   else
+     {
+        //If there is no relative setting, set base relative
+        if (!ld->rel_to_info.rel1_x_part)
+          ld->rel_to_info.rel1_x = ld->rel_info.rel1_x;
+        if (!ld->rel_to_info.rel2_x_part)
+          ld->rel_to_info.rel2_x = ld->rel_info.rel2_x;
+     }
+
+   //Set fixed properties of height for current Live Edit Item
+   if (fixed_h)
+     {
+        if (ld->rel_to_info.rel1_y_part)
+          {
+             ld->rel_to_info.align_y = 0.0;
+             ld->rel_to_info.rel2_y = ld->rel_to_info.rel1_y;
+             free(ld->rel_to_info.rel2_y_part);
+             ld->rel_to_info.rel2_y_part = strndup(ld->rel_to_info.rel1_y_part,
+                                          strlen(ld->rel_to_info.rel1_y_part));
+          }
+        else if (ld->rel_to_info.rel2_y_part)
+          {
+             ld->rel_to_info.align_y = 1.0;
+             ld->rel_to_info.rel1_y = ld->rel_to_info.rel2_y;
+             free(ld->rel_to_info.rel1_y_part);
+             ld->rel_to_info.rel1_y_part = strndup(ld->rel_to_info.rel2_y_part,
+                                          strlen(ld->rel_to_info.rel2_y_part));
+          }
+        else
+          {
+             float center = (ld->rel_info.rel1_y + ld->rel_info.rel2_y) / 2;
+             ld->rel_to_info.rel1_y = center;
+             ld->rel_to_info.rel2_y = center;
+          }
+        ld->rel_to_info.min_h = min_h;
+     }
+   else
+     {
+        //If there is no relative setting, set base relative
+        if (!ld->rel_to_info.rel1_y_part)
+          ld->rel_to_info.rel1_y = ld->rel_info.rel1_y;
+        if (!ld->rel_to_info.rel2_y_part)
+          ld->rel_to_info.rel2_y = ld->rel_info.rel2_y;
+     }
+}
+
+static void
+live_edit_insert(live_data *ld)
+{
+   int type = LIVEEDIT_ITEMS[ld->type].type;
+
+   calc_relative_info(ld);
+
+   Enventor_Item *it = file_mgr_focused_item_get();
+
+   enventor_item_template_part_insert(file_mgr_focused_item_get(),
+                                      type,
+                                      ENVENTOR_TEMPLATE_INSERT_LIVE_EDIT,
+                                      elm_check_state_get(ld->fixed_w_check),
+                                      elm_check_state_get(ld->fixed_h_check),
+                                      ld->rel_to_info.rel1_x_part,
+                                      ld->rel_to_info.rel1_y_part,
+                                      ld->rel_to_info.rel2_x_part,
+                                      ld->rel_to_info.rel2_y_part,
+                                      ld->rel_to_info.align_x,
+                                      ld->rel_to_info.align_y,
+                                      ld->rel_to_info.min_w,
+                                      ld->rel_to_info.min_h,
+                                      ld->rel_to_info.rel1_x,
+                                      ld->rel_to_info.rel1_y,
+                                      ld->rel_to_info.rel2_x,
+                                      ld->rel_to_info.rel2_y,
+                                      NULL, 0);
+
+#ifdef _WIN32
+   win32_edj_path_reset(config_input_path_get());
+   Eina_Bool succes_save = enventor_item_file_save(it, NULL);
+   if (!succes_save) EINA_LOG_ERR("Could not save the file.");
+   enventor_item_modified_set(file_mgr_focused_item_get(), !succes_save);
+#else
+   enventor_item_file_save(it, NULL);
+#endif
+
+   free(ld->rel_to_info.rel1_x_part);
+   free(ld->rel_to_info.rel1_y_part);
+   free(ld->rel_to_info.rel2_x_part);
+   free(ld->rel_to_info.rel2_y_part);
+}
+
+static void
+keygrabber_key_down_cb(void *data, Evas *e EINA_UNUSED,
+                       Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Key_Down *ev = event_info;
+
+   if (!strcmp(ev->key, "Control_L"))
+     ld->ctrl_pressed = EINA_TRUE;
+
+   if (!strcmp(ev->key, "Return")) live_edit_insert(ld);
+   else if (strcmp(ev->key, "Delete") &&
+            strcmp(ev->key, "BackSpace")) return;
+
+   live_edit_cancel(EINA_TRUE);
+}
+
+static void
+keygrabber_key_up_cb(void *data, Evas *e EINA_UNUSED,
+                       Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Key_Up *ev = event_info;
+
+   if (!strcmp(ev->key, "Control_L"))
+     ld->ctrl_pressed = EINA_FALSE;
+}
+
+Evas_Coord_Point
+calc_ctrl_pt_auto_align_pos(live_data *ld, int cursor_x, int cursor_y,
+                            int align_in, int *align_out)
+{
+   int res_x, res_y;
+   unsigned int nx, ny;
+   Evas_Coord_Point pt;
+
+   // if control key is pressed, auto align is not applied
+   if (ld->ctrl_pressed)
+     {
+        pt.x = cursor_x;
+        pt.y = cursor_y;
+        return pt;
+     }
+   res_x = res_y = -1;
+   nx = ny = LIVE_EDIT_MAX_DIST;
+   unsigned int dist = LIVE_EDIT_AUTO_ALIGN_DIST;
+
+   // This loop finds the closest position of part to control point
+   // And then return the position
+   unsigned int i;
+   auto_align_data *al_pos;
+   Eina_Array_Iterator iter;
+   EINA_ARRAY_ITER_NEXT(ld->auto_align_array, i, al_pos, iter)
+     {
+        unsigned int dx, dy;
+
+        dx = abs(al_pos->pt1.x - cursor_x);
+        dy = abs(al_pos->pt1.y - cursor_y);
+
+        if ((dx < dist) && (dx < nx) && (cursor_y >= al_pos->pt1.y) &&
+            (cursor_y <= al_pos->pt2.y))
+          {
+             nx = dx;
+             res_x = al_pos->pt1.x;
+          }
+        if ((dy < dist) && (dy < ny) && (cursor_x >= al_pos->pt1.x) &&
+            (cursor_x <= al_pos->pt2.x))
+          {
+             ny = dy;
+             res_y = al_pos->pt1.y;
+          }
+
+        dx = abs(al_pos->pt2.x - cursor_x);
+        dy = abs(al_pos->pt2.y - cursor_y);
+
+        if ((dx < dist) && (dx < nx) && (cursor_y >= al_pos->pt1.y) &&
+            (cursor_y <= al_pos->pt2.y))
+          {
+             nx = dx;
+             res_x = al_pos->pt2.x;
+          }
+        if ((dy < dist) && (dy < ny) && (cursor_x >= al_pos->pt1.x) &&
+            (cursor_x <= al_pos->pt2.x))
+          {
+             ny = dy;
+             res_y = al_pos->pt2.y;
+          }
+     }
+
+
+   if (res_x != -1)
+     {
+        pt.x = res_x;
+        if (align_out)
+          {
+             if (align_in & ALIGN_LINE_LEFT)
+               *align_out |= ALIGN_LINE_LEFT;
+             else if (align_in & ALIGN_LINE_RIGHT)
+               *align_out |= ALIGN_LINE_RIGHT;
+          }
+     }
+   else
+     {
+        pt.x = cursor_x;
+     }
+
+   if (res_y != -1)
+     {
+        pt.y = res_y;
+        if (align_out)
+          {
+             if (align_in & ALIGN_LINE_TOP)
+               *align_out |= ALIGN_LINE_TOP;
+             else if (align_in & ALIGN_LINE_BOTTOM)
+               *align_out |= ALIGN_LINE_BOTTOM;
+          }
+     }
+   else
+     {
+        pt.y = cursor_y;
+     }
+
+   return pt;
+}
+
+
+static void
+ctrl_pt_update(live_data *ld)
+{
+   //Init Control Point Positions
+   Evas_Coord dx, dy, dw, dh;
+   evas_object_geometry_get(ld->layout, &dx, &dy, &dw, &dh);
+
+   double x = dx;
+   double y = dy;
+   double w = dw;
+   double h = dh;
+
+   int half_ctrl_size = ld->half_ctrl_size;
+
+   //Rel1
+   evas_object_move(ld->ctrl_pt[Ctrl_Pt_Rel1],
+                    round((x - half_ctrl_size)), round((y - half_ctrl_size)));
+
+   //Rel2
+   evas_object_move(ld->ctrl_pt[Ctrl_Pt_Rel2],
+                    round((x + w) - half_ctrl_size),
+                    round((y + h) - half_ctrl_size));
+
+   //Rel3
+   evas_object_move(ld->ctrl_pt[Ctrl_Pt_Rel3],
+                    round((x + w) - half_ctrl_size),
+                    round(y - half_ctrl_size));
+
+   //Rel4
+   evas_object_move(ld->ctrl_pt[Ctrl_Pt_Rel4],
+                    round(x - half_ctrl_size),
+                    round((y + h) - half_ctrl_size));
+
+   //Top
+   evas_object_move(ld->ctrl_pt[Ctrl_Pt_Top],
+                    round((x + (w/2)) - half_ctrl_size),
+                    round(y - half_ctrl_size));
+
+   //Bottom
+   evas_object_move(ld->ctrl_pt[Ctrl_Pt_Bottom],
+                    round((x + (w/2)) - half_ctrl_size),
+                    round((y + h) - half_ctrl_size));
+
+   //Left
+   evas_object_move(ld->ctrl_pt[Ctrl_Pt_Left],
+                    round(x - half_ctrl_size),
+                    round((y + (h/2)) - half_ctrl_size));
+
+   //Right
+   evas_object_move(ld->ctrl_pt[Ctrl_Pt_Right],
+                    round((x + w) - half_ctrl_size),
+                    round((y + (h/2)) - half_ctrl_size));
+}
+
+static void
+cp_top_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                     Evas_Object *obj EINA_UNUSED,
+                     void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+
+
+   Evas_Coord x = ev->cur.canvas.x;
+   Evas_Coord y = ev->cur.canvas.y;
+
+   Evas_Object *view = view_obj_get(ld);
+   Evas_Coord vx, vy, vw, vh;
+   evas_object_geometry_get(view, &vx, &vy, &vw, &vh);
+
+   Evas_Coord rel2_y;
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel2], NULL, &rel2_y,
+                            NULL, NULL);
+
+
+   int align_line = 0;
+   Evas_Coord_Point pt = calc_ctrl_pt_auto_align_pos(ld, x, y,
+                                                     ALIGN_LINE_TOP,
+                                                     &align_line);
+   y = pt.y;
+
+   if (vy > y) y = vy;
+   if ((y - ld->half_ctrl_size) > rel2_y) y = (rel2_y + ld->half_ctrl_size);
+
+   ld->rel_info.rel1_y = ROUNDING(((double) (y - vy) / (double) vh), 2);
+
+   elm_object_signal_emit(ld->align_line[Align_Line_Top], "elm,state,show", "");
+
+   update_line_attach_effect(ld, align_line);
+
+   //cancel relative to
+   if (ld->rel_to_info.rel1_y_part)
+     {
+        free(ld->rel_to_info.rel1_y_part);
+        ld->rel_to_info.rel1_y_part = NULL;
+     }
+}
+
+static void
+cp_bottom_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                        Evas_Object *obj EINA_UNUSED,
+                        void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+
+
+   Evas_Coord x = ev->cur.canvas.x;
+   Evas_Coord y = ev->cur.canvas.y;
+
+   Evas_Object *view = view_obj_get(ld);
+   Evas_Coord vx, vy, vw, vh;
+   evas_object_geometry_get(view, &vx, &vy, &vw, &vh);
+
+   Evas_Coord rel1_y;
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel1], NULL, &rel1_y,
+                            NULL, NULL);
+
+   int align_line = 0;
+   Evas_Coord_Point pt = calc_ctrl_pt_auto_align_pos(ld, x, y,
+                                                     ALIGN_LINE_BOTTOM,
+                                                     &align_line);
+   y = pt.y;
+
+
+   if (y > (vy + vh)) y = (vy + vh);
+   if (rel1_y > (y + ld->half_ctrl_size)) y = (rel1_y + ld->half_ctrl_size);
+
+   ld->rel_info.rel2_y = ROUNDING(((double) (y - vy) / (double) vh), 2);
+
+   elm_object_signal_emit(ld->align_line[Align_Line_Bottom], "elm,state,show",
+                          "");
+
+   update_line_attach_effect(ld, align_line);
+
+   //cancel relative to
+   if (ld->rel_to_info.rel2_y_part)
+     {
+        free(ld->rel_to_info.rel2_y_part);
+        ld->rel_to_info.rel2_y_part = NULL;
+     }
+}
+
+static void
+align_line_update(live_data *ld)
+{
+   Evas_Coord lx, ly, lw, lh;
+   Evas_Object *view_obj = view_obj_get(ld);
+   evas_object_geometry_get(view_obj, &lx, &ly, &lw, &lh);
+   int x, y;
+
+   //Top
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Top], NULL, &y, NULL, NULL);
+   y = round(((double) y) + ld->half_ctrl_size);
+   evas_object_move(ld->align_line[Align_Line_Top], lx, y);
+   evas_object_resize(ld->align_line[Align_Line_Top], lw, ELM_SCALE_SIZE(1));
+
+   //Bottom
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Bottom], NULL, &y, NULL, NULL);
+   y = round(((double) y) + ld->half_ctrl_size);
+   evas_object_move(ld->align_line[Align_Line_Bottom], lx, y);
+   evas_object_resize(ld->align_line[Align_Line_Bottom], lw, ELM_SCALE_SIZE(1));
+
+   //Left
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Left], &x, NULL, NULL, NULL);
+   x = round(((double) x) + ld->half_ctrl_size);
+   evas_object_move(ld->align_line[Align_Line_Left], x, ly);
+   evas_object_resize(ld->align_line[Align_Line_Left], ELM_SCALE_SIZE(1), lh);
+
+   //Righit
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Right], &x, NULL, NULL, NULL);
+   x = round(((double) x) + ld->half_ctrl_size);
+   evas_object_move(ld->align_line[Align_Line_Right], x, ly);
+   evas_object_resize(ld->align_line[Align_Line_Right], ELM_SCALE_SIZE(1), lh);
+}
+
+static void
+keygrabber_direction_key_down_cb(void *data, Evas *e EINA_UNUSED,
+                       Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Key_Down *ev = event_info;
+
+   Evas_Coord x, y, w, h;
+   evas_object_geometry_get(ld->layout, &x, &y, &w, &h);
+
+   Evas_Coord vx, vy, vw, vh;
+   Evas_Object *view = view_obj_get(ld);
+   evas_object_geometry_get(view, &vx, &vy, &vw, &vh);
+
+   //Move the live item by 1 pixel to set detailed
+   //Move up
+   if (!strcmp(ev->key, "Up"))
+     y -= 1;
+   //Move down
+   else if (!strcmp(ev->key, "Down"))
+     y += 1;
+   //Move left
+   else if (!strcmp(ev->key, "Left"))
+     x -= 1;
+   //Move Right
+   else if (!strcmp(ev->key, "Right"))
+     x += 1;
+
+   //Check live view boundary
+   if (vx > x) x = vx;
+   if ((x + w) > (vx + vw)) x = (vx + vw) - w;
+   if (vy > y) y = vy;
+   if ((y + h) > (vy + vh)) y -= ((y + h) - (vy + vh));
+
+   evas_object_move(ld->layout, x, y);
+
+   //Calculate the relative value of live view item to 4 places of decimals
+   double orig_rel1_x = ld->rel_info.rel1_x;
+   double orig_rel1_y = ld->rel_info.rel1_y;
+   ld->rel_info.rel1_x = (double) (x - vx) / vw;
+   ld->rel_info.rel1_y = (double) (y - vy) / vh;
+   ld->rel_info.rel2_x += ld->rel_info.rel1_x - orig_rel1_x;
+   ld->rel_info.rel2_y += ld->rel_info.rel1_y - orig_rel1_y;
+
+   //Round off in the end to reduce round-off error.
+   ld->rel_info.rel1_x = ROUNDING(ld->rel_info.rel1_x, 4);
+   ld->rel_info.rel1_y = ROUNDING(ld->rel_info.rel1_y, 4);
+   ld->rel_info.rel2_x = ROUNDING(ld->rel_info.rel2_x, 4);
+   ld->rel_info.rel2_y = ROUNDING(ld->rel_info.rel2_y, 4);
+
+   ctrl_pt_update(ld);
+   info_text_update(ld);
+}
+
+static void
+cp_rel1_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                      Evas_Object *obj EINA_UNUSED,
+                      void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+
+   Evas_Coord x = ev->cur.canvas.x;
+   Evas_Coord y = ev->cur.canvas.y;
+
+   Evas_Object *view = view_obj_get(ld);
+   Evas_Coord vx, vy, vw, vh;
+   evas_object_geometry_get(view, &vx, &vy, &vw, &vh);
+
+   Evas_Coord rel2_x, rel2_y;
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel2], &rel2_x, &rel2_y,
+                            NULL, NULL);
+   int align_line = 0;
+   Evas_Coord_Point pt =
+      calc_ctrl_pt_auto_align_pos(ld, x, y, (ALIGN_LINE_TOP | ALIGN_LINE_LEFT),
+                                  &align_line);
+   x = pt.x;
+   y = pt.y;
+
+   if (vx > x) x = vx;
+   if (vy > y) y = vy;
+   if ((x - ld->half_ctrl_size) > rel2_x) x = (rel2_x + ld->half_ctrl_size);
+   if ((y - ld->half_ctrl_size) > rel2_y) y = (rel2_y + ld->half_ctrl_size);
+
+   ld->rel_info.rel1_x = ROUNDING(((double) (x - vx) / (double) vw), 2);
+   ld->rel_info.rel1_y = ROUNDING(((double) (y - vy) / (double) vh), 2);
+
+   elm_object_signal_emit(ld->align_line[Align_Line_Left], "elm,state,show",
+                          "");
+   elm_object_signal_emit(ld->align_line[Align_Line_Top], "elm,state,show", "");
+
+   update_line_attach_effect(ld, align_line);
+
+   //cancel relative to
+   if (ld->rel_to_info.rel1_x_part)
+     {
+        free(ld->rel_to_info.rel1_x_part);
+        ld->rel_to_info.rel1_x_part = NULL;
+     }
+
+   if (ld->rel_to_info.rel1_y_part)
+     {
+        free(ld->rel_to_info.rel1_y_part);
+        ld->rel_to_info.rel1_y_part = NULL;
+     }
+}
+
+static void
+cp_rel2_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                      Evas_Object *obj EINA_UNUSED,
+                      void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+
+   Evas_Coord x = ev->cur.canvas.x;
+   Evas_Coord y = ev->cur.canvas.y;
+
+   Evas_Object *view = view_obj_get(ld);
+   Evas_Coord vx, vy, vw, vh;
+   evas_object_geometry_get(view, &vx, &vy, &vw, &vh);
+
+   Evas_Coord rel1_x, rel1_y;
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel1], &rel1_x, &rel1_y,
+                            NULL, NULL);
+
+   int align_line = 0;
+   Evas_Coord_Point pt =
+      calc_ctrl_pt_auto_align_pos(ld, x, y,
+                                  (ALIGN_LINE_RIGHT | ALIGN_LINE_BOTTOM),
+                                  &align_line);
+   x = pt.x;
+   y = pt.y;
+
+   if (x > (vx + vw)) x = (vx + vw);
+   if (y > (vy + vh)) y = (vy + vh);
+   if (rel1_x > (x + ld->half_ctrl_size)) x = (rel1_x + ld->half_ctrl_size);
+   if (rel1_y > (y + ld->half_ctrl_size)) y = (rel1_y + ld->half_ctrl_size);
+
+   ld->rel_info.rel2_x = ROUNDING(((double) (x - vx) / (double) vw), 2);
+   ld->rel_info.rel2_y = ROUNDING(((double) (y - vy) / (double) vh), 2);
+
+   elm_object_signal_emit(ld->align_line[Align_Line_Right], "elm,state,show",
+                          "");
+   elm_object_signal_emit(ld->align_line[Align_Line_Bottom], "elm,state,show",
+                          "");
+
+   update_line_attach_effect(ld, align_line);
+
+   //cancel relative to
+   if (ld->rel_to_info.rel2_x_part)
+     {
+        free(ld->rel_to_info.rel2_x_part);
+        ld->rel_to_info.rel2_x_part = NULL;
+     }
+
+   if (ld->rel_to_info.rel2_y_part)
+     {
+        free(ld->rel_to_info.rel2_y_part);
+        ld->rel_to_info.rel2_y_part = NULL;
+     }
+}
+
+static void
+cp_rel3_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                      Evas_Object *obj EINA_UNUSED,
+                      void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+
+   Evas_Coord x = ev->cur.canvas.x;
+   Evas_Coord y = ev->cur.canvas.y;
+
+   Evas_Object *view = view_obj_get(ld);
+   Evas_Coord vx, vy, vw, vh;
+   evas_object_geometry_get(view, &vx, &vy, &vw, &vh);
+
+   Evas_Coord rel1_x;
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel1], &rel1_x, NULL,
+                            NULL, NULL);
+
+   int align_line = 0;
+   Evas_Coord_Point pt =
+      calc_ctrl_pt_auto_align_pos(ld, x, y,
+                                  (ALIGN_LINE_TOP | ALIGN_LINE_RIGHT),
+                                  &align_line);
+   x = pt.x;
+   y = pt.y;
+
+   if (x > (vx + vw)) x = (vx + vw);
+   if (rel1_x > (x + ld->half_ctrl_size)) x = (rel1_x - ld->half_ctrl_size);
+
+   Evas_Coord rel2_y;
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel2], NULL, &rel2_y,
+                            NULL, NULL);
+   if (vy > y) y = vy;
+   if ((y - ld->half_ctrl_size) > rel2_y) y = (rel2_y + ld->half_ctrl_size);
+
+   ld->rel_info.rel2_x = ROUNDING(((double) (x - vx) / (double) vw), 2);
+   ld->rel_info.rel1_y = ROUNDING(((double) (y - vy) / (double) vh), 2);
+
+   elm_object_signal_emit(ld->align_line[Align_Line_Right], "elm,state,show",
+                          "");
+   elm_object_signal_emit(ld->align_line[Align_Line_Top], "elm,state,show", "");
+
+   update_line_attach_effect(ld, align_line);
+
+   //cancel relative to
+   if (ld->rel_to_info.rel2_x_part)
+     {
+        free(ld->rel_to_info.rel2_x_part);
+        ld->rel_to_info.rel2_x_part = NULL;
+     }
+
+   if (ld->rel_to_info.rel1_y_part)
+     {
+        free(ld->rel_to_info.rel1_y_part);
+        ld->rel_to_info.rel1_y_part = NULL;
+     }
+}
+
+static void
+cp_rel4_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                      Evas_Object *obj EINA_UNUSED,
+                      void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+
+   Evas_Coord x = ev->cur.canvas.x;
+   Evas_Coord y = ev->cur.canvas.y;
+
+   Evas_Object *view = view_obj_get(ld);
+   Evas_Coord vx, vy, vw, vh;
+   evas_object_geometry_get(view, &vx, &vy, &vw, &vh);
+
+   Evas_Coord rel2_x;
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel2], &rel2_x, NULL,
+                            NULL, NULL);
+
+   int align_line = 0;
+   Evas_Coord_Point pt =
+      calc_ctrl_pt_auto_align_pos(ld, x, y,
+                                  (ALIGN_LINE_LEFT | ALIGN_LINE_BOTTOM),
+                                  &align_line);
+   x = pt.x;
+   y = pt.y;
+
+   if (vx > x) x = vx;
+   if ((x - ld->half_ctrl_size) > rel2_x) x = (rel2_x + ld->half_ctrl_size);
+
+   Evas_Coord rel1_y;
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel1], NULL, &rel1_y,
+                            NULL, NULL);
+   if (y > (vy + vh)) y = (vy + vh);
+   if (rel1_y > (y + ld->half_ctrl_size)) y = (rel1_y + ld->half_ctrl_size);
+
+   ld->rel_info.rel1_x = ROUNDING(((double) (x - vx) / (double) vw), 2);
+   ld->rel_info.rel2_y = ROUNDING(((double) (y - vy) / (double) vh), 2);
+
+   elm_object_signal_emit(ld->align_line[Align_Line_Left], "elm,state,show",
+                          "");
+   elm_object_signal_emit(ld->align_line[Align_Line_Bottom], "elm,state,show",
+                          "");
+
+   update_line_attach_effect(ld, align_line);
+
+   //cancel relative to
+   if (ld->rel_to_info.rel1_x_part)
+     {
+        free(ld->rel_to_info.rel1_x_part);
+        ld->rel_to_info.rel1_x_part = NULL;
+     }
+
+   if (ld->rel_to_info.rel2_y_part)
+     {
+        free(ld->rel_to_info.rel2_y_part);
+        ld->rel_to_info.rel2_y_part = NULL;
+     }
+}
+
+static void
+cp_left_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                      Evas_Object *obj EINA_UNUSED,
+                      void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+
+   Evas_Coord x = ev->cur.canvas.x;
+   Evas_Coord y = ev->cur.canvas.y;
+
+   Evas_Object *view = view_obj_get(ld);
+   Evas_Coord vx, vy, vw, vh;
+   evas_object_geometry_get(view, &vx, &vy, &vw, &vh);
+
+   Evas_Coord rel2_x;
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel2], &rel2_x, NULL,
+                            NULL, NULL);
+
+   int align_line = 0;
+   Evas_Coord_Point pt = calc_ctrl_pt_auto_align_pos(ld, x, y,
+                                                     ALIGN_LINE_LEFT,
+                                                     &align_line);
+   x = pt.x;
+
+   if (vx > x) x = vx;
+   if ((x - ld->half_ctrl_size) > rel2_x) x = (rel2_x + ld->half_ctrl_size);
+
+   ld->rel_info.rel1_x = ROUNDING(((double) (x - vx) / (double) vw), 2);
+
+   elm_object_signal_emit(ld->align_line[Align_Line_Left], "elm,state,show",
+                          "");
+   update_line_attach_effect(ld, align_line);
+
+   //cancel relative to
+   if (ld->rel_to_info.rel1_x_part)
+     {
+        free(ld->rel_to_info.rel1_x_part);
+        ld->rel_to_info.rel1_x_part = NULL;
+     }
+}
+
+static void
+cp_right_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                       Evas_Object *obj EINA_UNUSED,
+                       void *event_info)
+{
+   live_data *ld = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+
+   Evas_Coord x = ev->cur.canvas.x;
+   Evas_Coord y = ev->cur.canvas.y;
+
+   Evas_Object *view = view_obj_get(ld);
+   Evas_Coord vx, vy, vw, vh;
+   evas_object_geometry_get(view, &vx, &vy, &vw, &vh);
+
+   Evas_Coord rel1_x;
+   evas_object_geometry_get(ld->ctrl_pt[Ctrl_Pt_Rel1], &rel1_x, NULL,
+                            NULL, NULL);
+
+   int align_line = 0;
+   Evas_Coord_Point pt = calc_ctrl_pt_auto_align_pos(ld, x, y,
+                                                     ALIGN_LINE_RIGHT,
+                                                     &align_line);
+   x = pt.x;
+
+
+   if (x > (vx + vw)) x = (vx + vw);
+   if (rel1_x > (x + ld->half_ctrl_size)) x = (rel1_x + ld->half_ctrl_size);
+
+   ld->rel_info.rel2_x = ROUNDING(((double) (x - vx) / (double) vw), 2);
+
+   elm_object_signal_emit(ld->align_line[Align_Line_Right], "elm,state,show",
+                          "");
+
+   update_line_attach_effect(ld, align_line);
+
+   //cancel relative to
+   if (ld->rel_to_info.rel2_x_part)
+     {
+        free(ld->rel_to_info.rel2_x_part);
+        ld->rel_to_info.rel2_x_part = NULL;
+     }
+}
+
+static void
+cp_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Evas_Event_Mouse_Move *ev = event_info;
+   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+
+   //Dispatch to actual mouse move call
+   Ctrl_Pt cp = (Ctrl_Pt) evas_object_data_get(obj, "index");
+   if (cp == Ctrl_Pt_Cnt) return; //not to use Ctrl_Pt_Cnt as index.
+
+   //Show Control Point
+   live_data *ld = data;
+   elm_object_signal_emit(ld->ctrl_pt[cp], "elm,state,show", "");
+
+   switch (cp)
+     {
+        case Ctrl_Pt_Rel1:
+          cp_rel1_mouse_move_cb(data, e, obj, event_info);
+          break;
+        case Ctrl_Pt_Rel2:
+          cp_rel2_mouse_move_cb(data, e, obj, event_info);
+          break;
+        case Ctrl_Pt_Rel3:
+          cp_rel3_mouse_move_cb(data, e, obj, event_info);
+          break;
+        case Ctrl_Pt_Rel4:
+          cp_rel4_mouse_move_cb(data, e, obj, event_info);
+          break;
+        case Ctrl_Pt_Top:
+          cp_top_mouse_move_cb(data, e, obj, event_info);
+          break;
+        case Ctrl_Pt_Bottom:
+          cp_bottom_mouse_move_cb(data, e, obj, event_info);
+          break;
+        case Ctrl_Pt_Left:
+          cp_left_mouse_move_cb(data, e, obj, event_info);
+          break;
+        case Ctrl_Pt_Right:
+          cp_right_mouse_move_cb(data, e, obj, event_info);
+          break;
+        default:
+          break;
+     }
+
+   //Memorize last selected control point for setting relative_to
+   ld->last_cp = cp;
+   live_edit_update_internal(ld);
+}
+
+static void
+align_lines_hide(live_data *ld)
+{
+   int i;
+   for (i = 0; i < Align_Line_Cnt; i++)
+     elm_object_signal_emit(ld->align_line[i], "elm,state,hide", "");
+}
+
+static void
+rel_to_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+   Evas_Object *ctxpopup = data;
+   Evas_Object *layout = elm_object_content_get(ctxpopup);
+   if (!layout) return;
+
+   //Rel X
+   Evas_Object *list_x = elm_object_part_content_get(layout, "elm.swallow.x");
+   if (list_x)
+     {
+        Elm_Object_Item *it = elm_list_selected_item_get(list_x);
+        if (it)
+          {
+             rel_to_data *rel_data = elm_object_item_data_get(it);
+             if (rel_data)
+               {
+                  live_data *ld = rel_data->ld;
+                  //Case 1: Set relative properties of left side
+                  if ((ld->last_cp == Ctrl_Pt_Rel1) ||
+                      (ld->last_cp == Ctrl_Pt_Rel4) ||
+                      (ld->last_cp == Ctrl_Pt_Left))
+                    {
+                      free(ld->rel_to_info.rel1_x_part);
+                      ld->rel_to_info.rel1_x_part = strndup(rel_data->part_name,
+                                                    strlen(rel_data->part_name));
+                      ld->rel_to_info.rel1_x = rel_data->rel_x;
+                    }
+                  //Case 2: Set relative properties of right side
+                  else if ((ld->last_cp == Ctrl_Pt_Rel2) ||
+                           (ld->last_cp == Ctrl_Pt_Rel3) ||
+                           (ld->last_cp == Ctrl_Pt_Right))
+                    {
+                      free(ld->rel_to_info.rel2_x_part);
+                      ld->rel_to_info.rel2_x_part = strndup(rel_data->part_name,
+                                                    strlen(rel_data->part_name));
+                      ld->rel_to_info.rel2_x = rel_data->rel_x;
+                    }
+               }
+          }
+     }
+
+   //Rel Y
+   Evas_Object *list_y = elm_object_part_content_get(layout, "elm.swallow.y");
+   if (list_y)
+     {
+        Elm_Object_Item *it = elm_list_selected_item_get(list_y);
+        if (it)
+          {
+             rel_to_data *rel_data = elm_object_item_data_get(it);
+             if (rel_data)
+               {
+                  live_data *ld = rel_data->ld;
+                  //Case 1: Set relative properties of top side
+                  if ((ld->last_cp == Ctrl_Pt_Rel1) ||
+                      (ld->last_cp == Ctrl_Pt_Rel3) ||
+                      (ld->last_cp == Ctrl_Pt_Top))
+                    {
+                      free(ld->rel_to_info.rel1_y_part);
+                      ld->rel_to_info.rel1_y_part = strndup(rel_data->part_name,
+                                                    strlen(rel_data->part_name));
+                      ld->rel_to_info.rel1_y = rel_data->rel_y;
+                    }
+                  //Case 2: Set relative properties of bottom side
+                  else if ((ld->last_cp == Ctrl_Pt_Rel2) ||
+                           (ld->last_cp == Ctrl_Pt_Rel4) ||
+                           (ld->last_cp == Ctrl_Pt_Bottom))
+                    {
+                      free(ld->rel_to_info.rel2_y_part);
+                      ld->rel_to_info.rel2_y_part = strndup(rel_data->part_name,
+                                                    strlen(rel_data->part_name));
+                      ld->rel_to_info.rel2_y = rel_data->rel_y;
+                    }
+               }
+          }
+     }
+
+   elm_ctxpopup_dismiss(ctxpopup);
+}
+
+static void
+list_it_del_cb(void *data, Elm_Object_Item *it EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   rel_to_data *rel_data = data;
+   free(rel_data);
+}
+
+static void
+ctxpopup_dismissed_cb(void *data, Evas_Object *obj,
+                      void *event_info EINA_UNUSED)
+{
+   live_data *ld = data;
+   evas_object_del(obj);
+   ld->rel_to_info.ctxpopup = NULL;
+}
+
+static void
+make_rel_data(Evas_Object *list, live_data *ld,
+              float rel_x, float rel_y,
+              auto_align_data *al_pos)
+{
+   rel_to_data *rel_data = calloc(1, sizeof(rel_to_data));
+   strncpy(rel_data->part_name, al_pos->part_name, strlen(al_pos->part_name));
+   rel_data->rel_x = rel_x;
+   rel_data->rel_y = rel_y;
+   rel_data->pt1.x = al_pos->pt1.x;
+   rel_data->pt1.y = al_pos->pt1.y;
+   rel_data->pt2.x = al_pos->pt2.x;
+   rel_data->pt2.y = al_pos->pt2.y;
+   rel_data->ld = ld;
+
+   Elm_Object_Item *it = elm_list_item_append(list, al_pos->part_name, NULL,
+                                              NULL, NULL, rel_data);
+   elm_object_item_del_cb_set(it, list_it_del_cb);
+}
+
+static void
+show_relative_to_list(live_data *ld, int x, int y, Ctrl_Pt cp)
+{
+   if (ld->rel_to_info.ctxpopup) return;
+
+   unsigned int i;
+   Eina_Array_Iterator iter;
+   auto_align_data *al_pos;
+   Evas_Coord_Point cur_ctrl_pt = calc_ctrl_pt_auto_align_pos(ld, x, y,
+                                                              0, NULL);
+   //Ctxpopup
+   Evas_Object *ctxpopup = elm_ctxpopup_add(base_layout_get());
+   elm_object_style_set(ctxpopup, "enventor");
+   //FIXME: because the focus highlighting is floated after ctxpopup is
+   //dismissed, i disable the focus here
+   elm_object_tree_focus_allow_set(ctxpopup, EINA_FALSE);
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(ctxpopup);
+   elm_layout_file_set(layout, EDJE_PATH, "rel_to_layout");
+   elm_object_content_set(ctxpopup, layout);
+
+   //Ok Button
+   Evas_Object *ok_btn= elm_button_add(layout);
+   evas_object_smart_callback_add(ok_btn, "clicked", rel_to_btn_clicked_cb,
+                                  ctxpopup);
+   elm_object_text_set(ok_btn, "Ok");
+   elm_object_part_content_set(layout, "elm.swallow.ok_btn", ok_btn);
+
+   Elm_Object_Item *it;
+
+   //List for relative X
+   Evas_Object *list_x = elm_list_add(layout);
+   elm_list_mode_set(list_x, ELM_LIST_EXPAND);
+   evas_object_size_hint_max_set(list_x, ELM_SCALE_SIZE(115), ELM_SCALE_SIZE(200));
+   it = elm_list_item_append(list_x, "(none)", NULL, NULL, NULL, NULL);
+   elm_list_item_selected_set(it, EINA_TRUE);
+   elm_object_part_content_set(layout, "elm.swallow.x", list_x);
+
+   //List for relative Y
+   Evas_Object *list_y = elm_list_add(layout);
+   elm_list_mode_set(list_y, ELM_LIST_EXPAND);
+   evas_object_size_hint_max_set(list_y, ELM_SCALE_SIZE(115), ELM_SCALE_SIZE(200));
+   it = elm_list_item_append(list_y, "(none)", NULL, NULL, NULL, NULL);
+   elm_list_item_selected_set(it, EINA_TRUE);
+   elm_object_part_content_set(layout, "elm.swallow.y", list_y);
+
+   Eina_Bool is_rel_to_x = EINA_FALSE;
+   Eina_Bool is_rel_to_y = EINA_FALSE;
+
+   //Find relative_to part corresponding to the current control point
+   EINA_ARRAY_ITER_NEXT(ld->auto_align_array, i, al_pos, iter)
+   {
+      //Case 1: Find relative_to x
+      if (((cp != Ctrl_Pt_Top) && (cp != Ctrl_Pt_Bottom)) &&
+          (cur_ctrl_pt.y >= al_pos->pt1.y) && (cur_ctrl_pt.y <= al_pos->pt2.y))
+        {
+           //Control point is located left side of existing part
+           if (al_pos->pt1.x == cur_ctrl_pt.x)
+             {
+                is_rel_to_x = EINA_TRUE;
+                make_rel_data(list_x, ld, 0.0, 0.0, al_pos);
+             }
+           //Control point is located right side of existing part
+           else if (al_pos->pt2.x == cur_ctrl_pt.x)
+             {
+                is_rel_to_x = EINA_TRUE;
+                make_rel_data(list_x, ld, 1.0, 0.0, al_pos);
+             }
+        }
+      //Case 2: Find relative_to y
+      if (((cp != Ctrl_Pt_Left) && (cp != Ctrl_Pt_Right)) &&
+          (cur_ctrl_pt.x >= al_pos->pt1.x) && (cur_ctrl_pt.x <= al_pos->pt2.x))
+        {
+           //Control point is located top side of existing part
+           if (al_pos->pt1.y == cur_ctrl_pt.y)
+             {
+                is_rel_to_y = EINA_TRUE;
+                make_rel_data(list_y, ld, 0.0, 0.0, al_pos);
+             }
+           //Control point is located bottom side of existing part
+           else if (al_pos->pt2.y == cur_ctrl_pt.y)
+             {
+                is_rel_to_y = EINA_TRUE;
+                make_rel_data(list_y, ld, 0.0, 1.0, al_pos);
+             }
+        }
+   }
+
+   if (is_rel_to_x || is_rel_to_y)
+     {
+        elm_list_go(list_x);
+        elm_list_go(list_y);
+
+        //Control Layout
+        if (is_rel_to_x && !is_rel_to_y)
+          elm_object_signal_emit(layout, "elm,state,show,x", "");
+        if (!is_rel_to_x && is_rel_to_y)
+          elm_object_signal_emit(layout, "elm,state,show,y", "");
+
+        ld->rel_to_info.ctxpopup = ctxpopup;
+        evas_object_smart_callback_add(ctxpopup, "dismissed",
+                                       ctxpopup_dismissed_cb, ld);
+        evas_object_move(ctxpopup, x, y);
+        evas_object_show(ctxpopup);
+     }
+   else
+     {
+        evas_object_del(ctxpopup);
+     }
+}
+
+static void
+cp_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+               void *event_info EINA_UNUSED)
+{
+   Evas_Event_Mouse_Up *ev = event_info;
+   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+
+   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE,
+                                  cp_mouse_move_cb);
+   live_data *ld = data;
+   align_lines_hide(ld);
+
+   Evas_Coord x = ev->canvas.x;
+   Evas_Coord y = ev->canvas.y;
+
+   Ctrl_Pt cp = (Ctrl_Pt) evas_object_data_get(obj, "index");
+   show_relative_to_list(ld, x, y, cp);
+
+   //Show All Control Points
+   int i;
+   for (i = 0; i < Ctrl_Pt_Cnt; i++)
+     elm_object_signal_emit(ld->ctrl_pt[i], "elm,state,show", "");
+}
+
+static void
+cp_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+                 void *event_info EINA_UNUSED)
+{
+   Evas_Event_Mouse_Down *ev = event_info;
+   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE,
+                                  cp_mouse_move_cb, data);
+
+   //Hide All Control Points
+   live_data *ld = data;
+   int i;
+   for (i = 0; i < Ctrl_Pt_Cnt; i++)
+     elm_object_signal_emit(ld->ctrl_pt[i], "elm,state,hide", "");
+}
+
+static void
+ctrl_pt_init(live_data *ld)
+{
+   //Ctrl Point Size
+   Evas_Object *edje = elm_layout_edje_get(ld->layout);
+   double ctrl_size = atof(edje_object_data_get(edje, "ctrl_size"));
+   ctrl_size = ELM_SCALE_SIZE(ctrl_size);
+   ld->half_ctrl_size = ctrl_size * 0.5;
+
+   //Create Control Points
+   int i;
+   for (i = 0; i < Ctrl_Pt_Cnt; i++)
+     {
+        Evas_Object *layout = elm_layout_add(ld->layout);
+        view_obj_member_add(ld, layout);
+        elm_layout_file_set(layout, EDJE_PATH,  "ctrl_pt");
+        evas_object_resize(layout, ctrl_size, ctrl_size);
+        evas_object_show(layout);
+        evas_object_event_callback_add(layout,
+                                       EVAS_CALLBACK_MOUSE_DOWN,
+                                       cp_mouse_down_cb, ld);
+        evas_object_event_callback_add(layout,
+                                       EVAS_CALLBACK_MOUSE_UP,
+                                       cp_mouse_up_cb, ld);
+        evas_object_data_set(layout, "index", (void *)(uintptr_t)i);
+
+        ld->ctrl_pt[i] = layout;
+     }
+
+   //Set Mouse Cursors
+   elm_object_cursor_set(ld->ctrl_pt[Ctrl_Pt_Rel1],
+                         ELM_CURSOR_TOP_LEFT_CORNER);
+   elm_object_cursor_set(ld->ctrl_pt[Ctrl_Pt_Rel2],
+                         ELM_CURSOR_BOTTOM_RIGHT_CORNER);
+   elm_object_cursor_set(ld->ctrl_pt[Ctrl_Pt_Rel3],
+                         ELM_CURSOR_TOP_RIGHT_CORNER);
+   elm_object_cursor_set(ld->ctrl_pt[Ctrl_Pt_Rel4],
+                         ELM_CURSOR_BOTTOM_LEFT_CORNER);
+   elm_object_cursor_set(ld->ctrl_pt[Ctrl_Pt_Top], ELM_CURSOR_TOP_SIDE);
+   elm_object_cursor_set(ld->ctrl_pt[Ctrl_Pt_Bottom], ELM_CURSOR_BOTTOM_SIDE);
+   elm_object_cursor_set(ld->ctrl_pt[Ctrl_Pt_Left], ELM_CURSOR_LEFT_SIDE);
+   elm_object_cursor_set(ld->ctrl_pt[Ctrl_Pt_Right], ELM_CURSOR_RIGHT_SIDE);
+
+   ctrl_pt_update(ld);
+}
+
+static void
+free_auto_align_data(Eina_Array *arr)
+{
+   unsigned int i;
+   Eina_Array_Iterator iter;
+   auto_align_data *al_pos;
+
+   if (arr)
+     {
+        EINA_ARRAY_ITER_NEXT(arr, i, al_pos, iter)
+        {
+           free(al_pos);
+        }
+        eina_array_free(arr);
+        arr = NULL;
+     }
+}
+
+static void
+live_edit_auto_align_target_parts_init(live_data *ld, Eina_Bool is_update)
+{
+   Eina_List *l;
+
+   Evas_Object *view_obj = view_obj_get(ld);
+   Evas_Coord vx, vy;
+   evas_object_geometry_get(view_obj, &vx, &vy, NULL, NULL);
+
+   // set target parts for finding the boundary of exists parts
+   char *part_name;
+   Eina_List *parts = enventor_object_parts_list_get(base_enventor_get());
+
+   Evas_Coord x,y,w,h;
+   //Case 1: create new auto_align_data for new live edit item
+   if (!is_update)
+     {
+        free_auto_align_data(ld->auto_align_array);
+        ld->auto_align_array = eina_array_new(eina_list_count(parts));
+        EINA_LIST_FOREACH(parts, l, part_name)
+        {
+           edje_object_part_geometry_get(view_obj, part_name, &x, &y, &w, &h);
+           auto_align_data *al_pos = calloc(1, sizeof(auto_align_data));
+           snprintf(al_pos->part_name, PART_NAME_MAX, "%s", part_name);
+           al_pos->pt1.x = x + vx;
+           al_pos->pt1.y = y + vy;
+           al_pos->pt2.x = x + w + vx;
+           al_pos->pt2.y = y + h + vy;
+           eina_array_push(ld->auto_align_array, al_pos);
+        }
+     }
+   //Case 2: update the exsit auto_align_data when view is resized
+   else
+     {
+        int i = 0, item_cnt;
+        if (ld->auto_align_array)
+          {
+             item_cnt = eina_array_count_get(ld->auto_align_array);
+             EINA_LIST_FOREACH(parts, l, part_name)
+             {
+                edje_object_part_geometry_get(view_obj, part_name,
+                                              &x, &y, &w, &h);
+
+                if (i < item_cnt)
+                  {
+                     auto_align_data *al_pos =
+                        eina_array_data_get(ld->auto_align_array, i++);
+                     al_pos->pt1.x = x + vx;
+                     al_pos->pt1.y = y + vy;
+                     al_pos->pt2.x = x + w + vx;
+                     al_pos->pt2.y = y + h + vy;
+                  }
+              }
+         }
+     }
+}
+
+static void
+layout_update(live_data *ld)
+{
+   Evas_Coord x, y, w, h;
+   Evas_Object *view = view_obj_get(ld);
+   evas_object_geometry_get(view, &x, &y, &w, &h);
+
+   double x2 = round(w * ld->rel_info.rel1_x);
+   double y2 = round(h * ld->rel_info.rel1_y);
+   evas_object_move(ld->layout, (x + x2), (y + y2));
+   double w2 =
+     round(((double) w * (ld->rel_info.rel2_x - ld->rel_info.rel1_x)));
+   double h2 =
+     round(((double) h * (ld->rel_info.rel2_y - ld->rel_info.rel1_y)));
+   evas_object_resize(ld->layout, w2, h2);
+
+   live_edit_auto_align_target_parts_init(ld, EINA_TRUE);
+}
+
+static void
+live_edit_update_internal(live_data *ld)
+{
+   evas_smart_objects_calculate(evas_object_evas_get(ld->layout));
+   layout_update(ld);
+   ctrl_pt_update(ld);
+   align_line_update(ld);
+   info_text_update(ld);
+
+   //ctxpopup position won't be valid anymore.
+   if (ld->rel_to_info.ctxpopup)
+     elm_ctxpopup_dismiss(ld->rel_to_info.ctxpopup);
+}
+
+static void
+live_view_geom_cb(void *data, Evas *e EINA_UNUSED,
+                  Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   live_data *ld = data;
+   live_edit_update_internal(ld);
+}
+
+// This function cacluates the position of layout to the closest part edge
+static int
+calc_layout_auto_align_pos(Evas_Object *layout, live_data *ld, int x, int y,
+                           int layout_dir_x, int layout_dir_y, int *ret_x,
+                           int *ret_y)
+{
+   static int pre_layout_dir_x = 0;
+   static int pre_layout_dir_y = 0;
+
+   // if control key is pressed, auto align is not applied
+   if (ld->ctrl_pressed)
+     {
+        *ret_x = x;
+        *ret_y = y;
+        return 0;
+     }
+
+   Eina_Bool is_up, is_down, is_left, is_right;
+   is_up = is_down = is_left = is_right = EINA_FALSE;
+
+   Evas_Coord w, h;
+   evas_object_geometry_get(layout, NULL, NULL, &w, &h);
+
+   // layout_dir_x and layout_dir_y are the current direction of layout,
+   // pre_layout_dir_x and pre_layout_dir_y are previous direction of layout.
+   // These conditions are used to align the layout in moving direction
+   if (layout_dir_x == 0)
+     {
+       if (pre_layout_dir_x < 0)
+         {
+            is_left = EINA_TRUE;
+            pre_layout_dir_x = -1;
+         }
+       else
+         {
+            is_right = EINA_TRUE;
+            pre_layout_dir_x = 1;
+         }
+     }
+   else
+     {
+        pre_layout_dir_x = layout_dir_x;
+        if (layout_dir_x < 0) is_left = EINA_TRUE;
+        else if (layout_dir_x > 0) is_right = EINA_TRUE;
+     }
+
+   if (layout_dir_y == 0)
+     {
+        if (pre_layout_dir_y < 0)
+          {
+             is_up = EINA_TRUE;
+             pre_layout_dir_y = -1;
+          }
+        else
+          {
+             is_down = EINA_TRUE;
+             pre_layout_dir_y = 1;
+          }
+     }
+   else
+     {
+        pre_layout_dir_y = layout_dir_y;
+        if (layout_dir_y < 0) is_up = EINA_TRUE;
+        else if (layout_dir_y > 0) is_down = EINA_TRUE;
+     }
+
+   int res_x1, res_y1, res_x2, res_y2;
+   unsigned int nx, ny, nx2, ny2;
+   res_x1 = res_y1 = res_x2 = res_y2 = -1;
+   nx = ny = nx2 = ny2 = LIVE_EDIT_MAX_DIST;
+   unsigned int dist = LIVE_EDIT_AUTO_ALIGN_DIST;
+
+   // This loop finds the closest part to the layout
+   unsigned int i;
+   auto_align_data *al_pos;
+   Eina_Array_Iterator iter;
+   EINA_ARRAY_ITER_NEXT(ld->auto_align_array, i, al_pos, iter)
+   {
+      unsigned int dx1, dy1, dx2, dy2;
+      dx1 = dy1 = dx2 = dy2 = LIVE_EDIT_MAX_DIST;
+      if (((al_pos->pt1.y <= y) && (al_pos->pt2.y >= y)) ||
+          ((al_pos->pt1.y <= (y + h)) && (al_pos->pt2.y >= (y + h))) ||
+          ((al_pos->pt1.y >= y) && (al_pos->pt2.y <= (y + h))))
+        {
+           dx1 = abs(al_pos->pt1.x - x);
+           dx2 = abs(al_pos->pt1.x - (x + w));
+        }
+
+      if (((al_pos->pt1.x <= x) && (al_pos->pt2.x >= x)) ||
+          ((al_pos->pt1.x <= (x + w)) && (al_pos->pt2.x >= (x + w))) ||
+          ((al_pos->pt1.x >= x) && (al_pos->pt2.x <= (x + w))))
+        {
+           dy1 = abs(al_pos->pt1.y - y);
+           dy2 = abs(al_pos->pt1.y - (y + h));
+        }
+
+      if (is_left && (dx1 < dist) && (dx1 < nx))
+        {
+           nx = dx1;
+           res_x1 = al_pos->pt1.x;
+        }
+      if (is_right && (dx2 < dist) && (dx2 < nx2))
+        {
+           nx2 = dx2;
+           res_x2 = al_pos->pt1.x;
+        }
+      if (is_up && (dy1 < dist) && (dy1 < ny))
+        {
+           ny = dy1;
+           res_y1 = al_pos->pt1.y;
+        }
+      if (is_down && (dy2 < dist) && (dy2 < ny2))
+        {
+           ny2 = dy2;
+           res_y2 = al_pos->pt1.y;
+        }
+
+      if (((al_pos->pt1.y <= y) && (al_pos->pt2.y >= y)) ||
+          ((al_pos->pt1.y <= (y + h)) && (al_pos->pt2.y >= (y + h))) ||
+          ((al_pos->pt1.y >= y) && (al_pos->pt2.y <= (y + h))))
+        {
+           dx1 = abs(al_pos->pt2.x - x);
+           dx2 = abs(al_pos->pt2.x - (x + w));
+        }
+
+      if (((al_pos->pt1.x <= x) && (al_pos->pt2.x >= x)) ||
+          ((al_pos->pt1.x <= (x + w)) && (al_pos->pt2.x >= (x + w))) ||
+          ((al_pos->pt1.x >= x) && (al_pos->pt2.x <= (x + w))))
+        {
+           dy1 = abs(al_pos->pt2.y - y);
+           dy2 = abs(al_pos->pt2.y - (y + h));
+        }
+
+      if (is_left && (dx1 < dist) && (dx1 < nx))
+        {
+           nx = dx1;
+           res_x1 = al_pos->pt2.x;
+        }
+      if (is_right && (dx2 < dist) && (dx2 < nx2))
+        {
+           nx2 = dx2;
+           res_x2 = al_pos->pt2.x;
+        }
+      if (is_up && (dy1 < dist) && (dy1 < ny))
+        {
+           ny = dy1;
+           res_y1 = al_pos->pt2.y;
+        }
+      if (is_down && (dy2 < dist) && (dy2 < ny2))
+        {
+           ny2 = dy2;
+           res_y2 = al_pos->pt2.y;
+        }
+   }
+
+   int align_line = 0;
+
+   // If we find the closest position and return it
+   if (is_left && (res_x1 != -1))
+     {
+        *ret_x = res_x1;
+        align_line |= ALIGN_LINE_LEFT;
+     }
+   else if (is_right && (res_x2 != -1))
+     {
+        *ret_x = res_x2 - w;
+        align_line |= ALIGN_LINE_RIGHT;
+     }
+
+   if (is_up && (res_y1 != -1))
+     {
+        *ret_y = res_y1;
+        align_line |= ALIGN_LINE_TOP;
+     }
+   else if (is_down && (res_y2 != -1))
+     {
+        *ret_y = res_y2 - h;
+        align_line |= ALIGN_LINE_BOTTOM;
+     }
+
+   return align_line;
+}
+
+static void
+layout_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+                     void *event_info)
+{
+   Evas_Event_Mouse_Move *ev = event_info;
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+
+   live_data *ld = data;
+
+   Evas_Coord vx, vy, vw, vh;  //layout geometry
+   Evas_Object *view = view_obj_get(ld);
+   evas_object_geometry_get(view, &vx, &vy, &vw, &vh);
+
+   //only affect when cursor is inside of the part
+   Evas_Coord x, y, w, h;
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+   if (ev->cur.canvas.x > (x + w)) return;
+   if (x > ev->cur.canvas.x) return;
+   if (ev->cur.canvas.y > (y + h)) return;
+   if (y > ev->cur.canvas.y) return;
+
+   x = ev->cur.canvas.x - ld->move_delta.x;
+   y = ev->cur.canvas.y - ld->move_delta.y;
+
+   Evas_Coord dir_x, dir_y;
+   dir_x =  ev->cur.canvas.x - ev->prev.canvas.x;
+   dir_y = ev->cur.canvas.y - ev->prev.canvas.y;
+
+   int ret_x, ret_y;
+   ret_x = x;
+   ret_y = y;
+
+   // This function set the position of layout to the closest part edge
+   int align_line =
+      calc_layout_auto_align_pos(obj, ld, x, y, dir_x, dir_y, &ret_x, &ret_y);
+
+   x = ret_x;
+   y = ret_y;
+
+   //limit to live view boundary
+   if (vx > x) x = vx;
+   if ((x + w) > (vx + vw)) x = (vx + vw) - w;
+   if (vy > y) y = vy;
+   if ((y + h) > (vy + vh)) y -= ((y + h) - (vy + vh));
+
+   double orig_rel1_x = ld->rel_info.rel1_x;
+   double orig_rel1_y = ld->rel_info.rel1_y;
+   ld->rel_info.rel1_x = (double) (x - vx) / vw;
+   ld->rel_info.rel1_y = (double) (y - vy) / vh;
+   ld->rel_info.rel2_x += ld->rel_info.rel1_x - orig_rel1_x;
+   ld->rel_info.rel2_y += ld->rel_info.rel1_y - orig_rel1_y;
+
+   //Round off in the end to reduce round-off error.
+   ld->rel_info.rel1_x = ROUNDING(ld->rel_info.rel1_x, 2);
+   ld->rel_info.rel1_y = ROUNDING(ld->rel_info.rel1_y, 2);
+   ld->rel_info.rel2_x = ROUNDING(ld->rel_info.rel2_x, 2);
+   ld->rel_info.rel2_y = ROUNDING(ld->rel_info.rel2_y, 2);
+
+   evas_object_move(obj, x, y);
+
+   elm_object_signal_emit(ld->align_line[Align_Line_Top], "elm,state,show", "");
+   elm_object_signal_emit(ld->align_line[Align_Line_Bottom], "elm,state,show",
+                          "");
+   elm_object_signal_emit(ld->align_line[Align_Line_Left], "elm,state,show",
+                          "");
+   elm_object_signal_emit(ld->align_line[Align_Line_Right], "elm,state,show",
+                          "");
+
+   ctrl_pt_update(ld);
+   info_text_update(ld);
+   align_line_update(ld);
+   update_line_attach_effect(ld, align_line);
+}
+
+static void
+layout_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+                   void *event_info EINA_UNUSED)
+{
+   Evas_Event_Mouse_Up *ev = event_info;
+
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+
+   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE,
+                                  layout_mouse_move_cb);
+   live_data *ld = data;
+   align_lines_hide(ld);
+
+   //Show hidden control points
+   elm_object_signal_emit(ld->ctrl_pt[Ctrl_Pt_Top], "elm,state,show", "");
+   elm_object_signal_emit(ld->ctrl_pt[Ctrl_Pt_Bottom], "elm,state,show", "");
+   elm_object_signal_emit(ld->ctrl_pt[Ctrl_Pt_Left], "elm,state,show", "");
+   elm_object_signal_emit(ld->ctrl_pt[Ctrl_Pt_Right], "elm,state,show", "");
+}
+
+static void
+layout_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+                     void *event_info)
+{
+   Evas_Event_Mouse_Down *ev = event_info;
+   live_data *ld = data;
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+
+   //insert part on double click
+   if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
+     {
+        live_edit_insert(ld);
+        live_edit_cancel(EINA_FALSE);
+        return;
+     }
+
+   /* Store (cursor - obj position) distance.
+      And keep this distance while obj is moving. */
+   Evas_Coord x, y;
+   evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+   ld->move_delta.x = ev->canvas.x - x;
+   ld->move_delta.y = ev->canvas.y - y;
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE,
+                                  layout_mouse_move_cb, data);
+
+   //Hide unnecessary control points
+   elm_object_signal_emit(ld->ctrl_pt[Ctrl_Pt_Top], "elm,state,hide", "");
+   elm_object_signal_emit(ld->ctrl_pt[Ctrl_Pt_Bottom], "elm,state,hide", "");
+   elm_object_signal_emit(ld->ctrl_pt[Ctrl_Pt_Left], "elm,state,hide", "");
+   elm_object_signal_emit(ld->ctrl_pt[Ctrl_Pt_Right], "elm,state,hide", "");
+}
+
+static void
+align_line_init(live_data *ld)
+{
+   //Create Align Lines
+   int i;
+   for (i = 0; i < Align_Line_Cnt; i++)
+     {
+        //Align line should be located between live edit item and live view
+        Evas_Object *layout = elm_layout_add(ld->live_view);
+        view_obj_member_add(ld, layout);
+        elm_layout_file_set(layout, EDJE_PATH,  "ctrl_pt");
+        evas_object_show(layout);
+        elm_object_signal_emit(layout, "elm,state,hide,instance", "");
+        ld->align_line[i] = layout;
+     }
+}
+
+static void
+info_text_init(live_data *ld)
+{
+   //Create Info Texts
+   int i;
+   Evas *e = evas_object_evas_get(ld->layout);
+   double scale = elm_config_scale_get();
+   for (i = 0; i < Info_Text_Cnt; i++)
+     {
+        Evas_Object *rect = evas_object_rectangle_add(e);
+        view_obj_member_add(ld, rect);
+        evas_object_pass_events_set(rect, EINA_TRUE);
+        //Tizen Only   
+        evas_object_color_set(rect, 0, 0, 0, 51);
+        //evas_object_color_set(rect, 0, 0, 0, 125);
+        evas_object_show(rect);
+        ld->info_text_bg[i] = rect;
+
+        Evas_Object *text = evas_object_text_add(e);
+        view_obj_member_add(ld, text);
+        evas_object_pass_events_set(text, EINA_TRUE);
+        evas_object_text_font_set(text, LIVE_EDIT_FONT,
+                                  ( LIVE_EDIT_FONT_SIZE * scale));
+        evas_object_show(text);
+        ld->info_text[i] = text;
+     }
+
+   info_text_update(ld);
+}
+
+static void
+key_grab_add(Evas_Object *keygrabber, const char *key)
+{
+   if (!evas_object_key_grab(keygrabber, key, 0, 0, EINA_TRUE))
+     EINA_LOG_ERR(_("Failed to grab key - %s"), key);
+}
+
+static void
+rel_to_values_reset(live_data *ld)
+{
+   ld->rel_to_info.align_x = 0.5;
+   ld->rel_to_info.align_y = 0.5;
+   ld->rel_to_info.rel1_x_part = NULL;
+   ld->rel_to_info.rel1_y_part = NULL;
+   ld->rel_to_info.rel2_x_part = NULL;
+   ld->rel_to_info.rel2_y_part = NULL;
+   ld->rel_to_info.min_w = 0;
+   ld->rel_to_info.min_h = 0;
+}
+
+static Eina_Bool
+live_edit_layer_set(live_data *ld)
+{
+   //Keygrabber
+   ld->keygrabber =
+      evas_object_rectangle_add(evas_object_evas_get(ld->live_view));
+   evas_object_event_callback_add(ld->keygrabber, EVAS_CALLBACK_KEY_DOWN,
+                                  keygrabber_key_down_cb, ld);
+   evas_object_event_callback_add(ld->keygrabber, EVAS_CALLBACK_KEY_UP,
+                                  keygrabber_key_up_cb, ld);
+   evas_object_event_callback_add(ld->keygrabber, EVAS_CALLBACK_KEY_DOWN,
+                                  keygrabber_direction_key_down_cb, ld);
+   evas_object_event_callback_add(ld->live_view, EVAS_CALLBACK_RESIZE,
+                                  live_view_geom_cb, ld);
+   evas_object_event_callback_add(ld->live_view, EVAS_CALLBACK_MOVE,
+                                  live_view_geom_cb, ld);
+
+   // Add keygrab for Control_L, To receive key_up_callback we need to use mask
+   Evas_Modifier_Mask mask = evas_key_modifier_mask_get(
+                             evas_object_evas_get(ld->keygrabber), "Control");
+   if (!evas_object_key_grab(ld->keygrabber, "Control_L", mask, 0, EINA_FALSE))
+     EINA_LOG_ERR(_("Failed to grab key - %s"), "Control_L");
+   if (!evas_object_key_grab(ld->keygrabber, "Control_L", 0, 0, EINA_FALSE))
+     EINA_LOG_ERR(_("Failed to grab key - %s"), "Control_L");
+
+   key_grab_add(ld->keygrabber, "Return");
+   key_grab_add(ld->keygrabber, "Delete");
+   key_grab_add(ld->keygrabber, "BackSpace");
+   key_grab_add(ld->keygrabber, "Up");
+   key_grab_add(ld->keygrabber, "Down");
+   key_grab_add(ld->keygrabber, "Left");
+   key_grab_add(ld->keygrabber, "Right");
+
+   //Create Live View Layout
+   Evas_Object *layout = elm_layout_add(ld->live_view);
+   Evas_Object *view_obj = view_obj_get(ld);
+   if (!view_obj)
+     {
+        stats_info_msg_update("Live Edit is not available here. A base group is required!");
+        live_edit_cancel(EINA_FALSE);
+        return EINA_FALSE;
+     }
+
+   //Check canvas has been set or not.
+   Evas_Coord w, h;
+   evas_object_geometry_get(view_obj, NULL, NULL, &w, &h);
+   if ((w < 2) || (h < 2))
+     {
+        stats_info_msg_update("Live Edit is not available here. Please set up live view size first!");
+        live_edit_cancel(EINA_FALSE);
+        return EINA_FALSE;
+
+     }
+
+   view_obj_member_add(ld, layout);
+   elm_layout_file_set(layout, EDJE_PATH,  "live_edit_layout");
+   evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN,
+                                  layout_mouse_down_cb, ld);
+   evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_UP,
+                                  layout_mouse_up_cb, ld);
+   elm_layout_part_cursor_set(layout, "cursor_body", ELM_CURSOR_FLEUR);
+   evas_object_show(layout);
+
+   ld->layout = layout;
+
+   evas_object_smart_callback_add(view_scroller_get(ld), "scroll",
+                                  view_scroll_cb, ld);
+
+   //Initial Layout Geometry
+   ld->rel_info.rel1_x = LIVE_EDIT_REL1;
+   ld->rel_info.rel1_y = LIVE_EDIT_REL1;
+   ld->rel_info.rel2_x = LIVE_EDIT_REL2;
+   ld->rel_info.rel2_y = LIVE_EDIT_REL2;
+   rel_to_values_reset(ld);
+   live_edit_symbol_set(ld);
+   ctrl_pt_init(ld);
+   align_line_init(ld);
+   live_edit_update_internal(ld);
+   info_text_init(ld);
+   live_edit_auto_align_target_parts_init(ld, EINA_FALSE);
+   ld->last_cp = Ctrl_Pt_Cnt;
+
+   panes_live_edit_fixed_bar_visible_set(EINA_TRUE);
+
+   return EINA_TRUE;
+}
+
+static void
+live_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                    void *event_info EINA_UNUSED)
+{
+   live_edit_cancel(EINA_FALSE);
+   goto_close();
+   search_close();
+
+   live_data *ld = g_ld;
+
+   ld->type = (unsigned int)(uintptr_t)data;
+   enventor_object_disabled_set(base_enventor_get(), EINA_TRUE);
+   ld->live_view = enventor_object_live_view_get(base_enventor_get());
+   ld->on = EINA_TRUE;
+
+   if (!live_edit_layer_set(ld)) return;
+
+   stats_info_msg_update(_("Double click part to confirm."
+                           "(Esc = cancel, Direction Key ="
+                           " move item per pixel,"
+                           "Ctrl = disable auto-aligning)"));
+}
+
+static Evas_Object *
+live_btn_create(Evas_Object *parent, const char *name, void * data,
+                Edje_Part_Type type)
+{
+   Evas_Object *btn = elm_button_add(parent);
+   elm_object_style_set(btn, ENVENTOR_NAME);
+   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_object_focus_allow_set(btn, EINA_FALSE);
+
+   switch (type)
+     {
+      case EDJE_PART_TYPE_RECTANGLE:
+         elm_object_tooltip_text_set(btn,
+                                     _("Add a Rect part to the live view.<br>"
+                                       "A Rect part is used as a solid color<br>"
+                                       "component or clipping other components."));
+         break;
+      case EDJE_PART_TYPE_TEXT:
+         elm_object_tooltip_text_set(btn,
+                                     _("Add a Text part to the live view.<br>"
+                                       "A Text part is used for plain text."));
+         break;
+      case EDJE_PART_TYPE_IMAGE:
+         elm_object_tooltip_text_set(btn,
+                                     _("Add an Image part to the live view.<br>"
+                                       "An Image part contains a single image<br>"
+                                       "resource, usually an image file."));
+         break;
+      case EDJE_PART_TYPE_SWALLOW:
+         elm_object_tooltip_text_set(btn,
+                                     _("Add a Swallow part to the live view.<br>"
+                                       "A Swallow part is a placeholder for<br>"
+                                       "objects that you may want to<br>"
+                                       "include in the layout later."));
+         break;
+      case EDJE_PART_TYPE_TEXTBLOCK:
+         elm_object_tooltip_text_set(btn,
+                                     _("Add a Textblock part to the live view.<br>"
+                                       "A Textblock part is a rich-text part<br>"
+                                       "that can show big chunks of text."));
+         break;
+      case EDJE_PART_TYPE_SPACER:
+         elm_object_tooltip_text_set(btn,
+                                     _("Add a Spacer part to the live view.<br>"
+                                       "A Spacer part is an anchor to locate <br>"
+                                       "other parts. It is invisible and<br>"
+                                       "normally used for padding."));
+         break;
+      default:
+         break;
+     }
+
+   elm_object_tooltip_orient_set(btn, ELM_TOOLTIP_ORIENT_BOTTOM);
+
+   Evas_Object *img = elm_image_add(btn);
+   elm_image_file_set(img, EDJE_PATH, name);
+   elm_object_content_set(btn, img);
+
+   evas_object_smart_callback_add(btn, "clicked", live_btn_clicked_cb, data);
+   evas_object_show(btn);
+
+   return btn;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+live_edit_update(void)
+{
+   if (!live_edit_get()) return;
+
+   live_data *ld = g_ld;
+   EINA_SAFETY_ON_NULL_RETURN(ld);
+
+   //Scale up/down of the symbol object.
+   Evas_Object *layout_symbol =
+      elm_object_part_content_get(ld->layout, "elm.swallow.symbol");
+   if (layout_symbol)
+     elm_object_scale_set(layout_symbol,
+                          enventor_object_live_view_scale_get(base_enventor_get()));
+
+   live_edit_update_internal(ld);
+}
+
+Eina_Bool
+live_edit_get(void)
+{
+   live_data *ld = g_ld;
+   if (!ld) return EINA_FALSE;
+   return ld->on;
+}
+
+Eina_Bool
+live_edit_cancel(Eina_Bool phase_in)
+{
+   live_data *ld = g_ld;
+   if (!ld || !ld->on) return EINA_FALSE;
+
+   //Dismiss Relative To Ctxpopup firstly.
+   if (phase_in && ld->rel_to_info.ctxpopup)
+     {
+        evas_object_del(ld->rel_to_info.ctxpopup);
+        ld->rel_to_info.ctxpopup = NULL;
+        return EINA_TRUE;
+     }
+   else
+     {
+        evas_object_del(ld->rel_to_info.ctxpopup);
+        ld->rel_to_info.ctxpopup = NULL;
+     }
+
+   enventor_object_disabled_set(base_enventor_get(), EINA_FALSE);
+
+   evas_object_del(ld->keygrabber);
+   ld->keygrabber = NULL;
+
+   evas_object_event_callback_del(ld->live_view, EVAS_CALLBACK_RESIZE,
+                                  live_view_geom_cb);
+   evas_object_event_callback_del(ld->live_view, EVAS_CALLBACK_MOVE,
+                                  live_view_geom_cb);
+
+   evas_object_smart_callback_del(view_scroller_get(ld),
+                                  "scroll",
+                                  view_scroll_cb);
+   ld->live_view = NULL;
+
+   evas_object_del(ld->layout);
+   ld->layout = NULL;
+
+   //Delete Control Points
+   int i;
+   for (i = 0; i < Ctrl_Pt_Cnt; i++)
+     {
+        evas_object_del(ld->ctrl_pt[i]);
+        ld->ctrl_pt[i] = NULL;
+     }
+
+   //Delete Align Lines
+   for (i = 0; i < Align_Line_Cnt; i++)
+     {
+        evas_object_del(ld->align_line[i]);
+        ld->align_line[i] = NULL;
+     }
+
+   //Delete Info Texts
+   for (i = 0; i < Info_Text_Cnt; i++)
+     {
+        evas_object_del(ld->info_text[i]);
+        ld->info_text[i] = NULL;
+     }
+
+   //Delete Info Text BGs
+   for (i = 0; i < Info_Text_Cnt; i++)
+     {
+        evas_object_del(ld->info_text_bg[i]);
+        ld->info_text_bg[i] = NULL;
+     }
+
+   ld->on = EINA_FALSE;
+   ld->align_left = EINA_FALSE;
+   ld->align_right = EINA_FALSE;
+   ld->align_top = EINA_FALSE;
+   ld->align_bottom = EINA_FALSE;
+
+   elm_check_state_set(ld->fixed_w_check, EINA_FALSE);
+   elm_check_state_set(ld->fixed_h_check, EINA_FALSE);
+   panes_live_edit_fixed_bar_visible_set(EINA_FALSE);
+
+   return EINA_TRUE;
+}
+
+//Create and return a list of buttons.
+Eina_List *
+live_edit_tools_create(Evas_Object *parent)
+{
+   Eina_List *btn_list = NULL;
+   Evas_Object *btn;
+   int i;
+
+   for (i = 0; i < (LIVEEDIT_ITEMS_NUM - 1); i++)
+     {
+        btn = live_btn_create(parent, LIVEEDIT_ITEMS[i].name,
+                              (void *)(uintptr_t) i,
+                              LIVEEDIT_ITEMS[i].type);
+        btn_list = eina_list_append(btn_list, btn);
+     }
+
+   //Just for spacer. Because we'd like to avoid margin in the icon image,
+   //We use 2 images - button icon's and live edit object's.
+   btn = live_btn_create(parent, "Spacer_Icon",
+                         (void *)(uintptr_t) i, EDJE_PART_TYPE_SPACER);
+   btn_list = eina_list_append(btn_list, btn);
+
+   return btn_list;
+}
+
+Evas_Object *
+live_edit_init(Evas_Object *parent)
+{
+   live_data *ld = calloc(1, sizeof(live_data));
+   if (!ld)
+     {
+        EINA_LOG_ERR(_("Faild to allocate Memory!"));
+        return NULL;
+     }
+   g_ld = ld;
+
+   //Create fixed bar for setting fixed option
+   Evas_Object *fixed_box = elm_box_add(parent);
+   elm_box_padding_set(fixed_box, ELM_SCALE_SIZE(50), 0);
+   elm_box_horizontal_set(fixed_box, EINA_TRUE);
+   evas_object_show(fixed_box);
+
+   //Fixed Width Check
+   Evas_Object *fixed_w_check = elm_check_add(fixed_box);
+   elm_object_focus_allow_set(fixed_w_check, EINA_FALSE);
+   elm_object_text_set(fixed_w_check, "Fixed width");
+   elm_object_tooltip_text_set(fixed_w_check,
+                               "When you check Fixed width, width of a new<br>"
+                               "part won't be resizable but it will stick a<br>"
+                               "fixed size.");
+   evas_object_show(fixed_w_check);
+   elm_box_pack_end(fixed_box, fixed_w_check);
+
+   //Fixed Height Check
+   Evas_Object *fixed_h_check = elm_check_add(fixed_box);
+   elm_object_focus_allow_set(fixed_h_check, EINA_FALSE);
+   elm_object_text_set(fixed_h_check, "Fixed height");
+   elm_object_tooltip_text_set(fixed_h_check,
+                               "When you check Fixed height, height of a<br>"
+                               "new part won't be resizable but it will<br>"
+                               "stick a fixed size.");
+   evas_object_show(fixed_h_check);
+   elm_box_pack_end(fixed_box, fixed_h_check);
+
+   ld->fixed_w_check = fixed_w_check;
+   ld->fixed_h_check = fixed_h_check;
+
+   return fixed_box;
+}
+
+void
+live_edit_term(void)
+{
+   live_data *ld = g_ld;
+   if (!ld) return;
+
+   live_edit_cancel(EINA_FALSE);
+
+   free_auto_align_data(ld->auto_align_array);
+   free(ld);
+   g_ld = NULL;
+}
+
+
diff --git a/src/bin/main.c b/src/bin/main.c
new file mode 100644 (file)
index 0000000..ab8095b
--- /dev/null
@@ -0,0 +1,1338 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <Ecore_Getopt.h>
+#include <Eio.h>
+#include "common.h"
+
+#ifdef _WIN32
+#include <Windows.h>
+static HANDLE hMutex = NULL;
+#endif
+
+typedef struct app_s
+{
+   Evas_Object *keygrabber;
+   Eina_Bool on_saving : 1;
+   Eina_Bool lazy_save : 1;
+   //Tizen Only : Support edje_cc path set
+   Eina_Stringshare *edje_cc_path;
+   //
+   //Tizen Only : Support autocomp eet path set
+   Eina_Stringshare *autocomp_eet_path;
+   //
+   //Tizen Only : Support Tizen version
+   Eina_Stringshare *tizen_version;
+   //
+} app_data;
+
+static Eina_Bool own_lock = EINA_FALSE;  //lock file owner?
+
+int main(int argc, char **argv);
+
+static void
+tools_update(void)
+{
+   tools_lines_update(EINA_FALSE);
+   tools_highlight_update(EINA_FALSE);
+   tools_dummy_update(EINA_FALSE);
+   tools_wireframes_update(EINA_FALSE);
+   tools_mirror_mode_update(EINA_FALSE);
+   tools_file_tab_update(EINA_FALSE);
+   tools_file_browser_update(EINA_FALSE);
+   tools_edc_navigator_update(EINA_FALSE);
+}
+
+static void
+enventor_common_setup(Enventor_Object *enventor)
+{
+   const char *font_name;
+   const char *font_style;
+   config_font_get(&font_name, &font_style);
+   enventor_object_font_set(enventor, font_name, font_style);
+   enventor_object_font_scale_set(enventor, config_font_scale_get());
+   enventor_object_auto_indent_set(enventor, config_auto_indent_get());
+   enventor_object_auto_complete_set(enventor, config_auto_complete_get());
+   enventor_object_smart_undo_redo_set(enventor, config_smart_undo_redo_get());
+
+   Eina_List *list = eina_list_append(NULL, config_output_path_get());
+   enventor_object_path_set(enventor, ENVENTOR_PATH_TYPE_EDJ, list);
+   eina_list_free(list);
+
+   enventor_object_path_set(enventor, ENVENTOR_PATH_TYPE_IMAGE,
+                            config_img_path_list_get());
+   enventor_object_path_set(enventor, ENVENTOR_PATH_TYPE_SOUND,
+                            config_snd_path_list_get());
+   enventor_object_path_set(enventor, ENVENTOR_PATH_TYPE_FONT,
+                            config_fnt_path_list_get());
+   enventor_object_path_set(enventor, ENVENTOR_PATH_TYPE_DATA,
+                            config_dat_path_list_get());
+}
+
+static void
+syntax_color_update(Enventor_Object *enventor)
+{
+   const char *config_color;
+   const char *enventor_color;
+   Eina_Bool color_changed = EINA_FALSE;
+   Enventor_Syntax_Color_Type color_type;
+
+   color_type = ENVENTOR_SYNTAX_COLOR_STRING;
+   for (; color_type < ENVENTOR_SYNTAX_COLOR_LAST; color_type++)
+     {
+        config_color = config_syntax_color_get(color_type);
+        if (config_color)
+          {
+             enventor_color = enventor_object_syntax_color_get(enventor,
+                                                               color_type);
+             if (!enventor_color || strcmp(config_color, enventor_color))
+               {
+                  enventor_object_syntax_color_set(enventor, color_type,
+                                                   config_color);
+                  color_changed = EINA_TRUE;
+               }
+          }
+     }
+
+   if (!color_changed) return;
+
+   Enventor_Item *it;
+
+   it = file_mgr_main_item_get();
+   enventor_item_syntax_color_full_apply(it, EINA_TRUE);
+
+   Eina_List *l;
+   Eina_List *sub_its = (Eina_List *)enventor_object_sub_items_get(enventor);
+   EINA_LIST_FOREACH(sub_its, l, it)
+     enventor_item_syntax_color_full_apply(it, EINA_TRUE);
+
+}
+
+static void
+syntax_color_init(Enventor_Object *enventor)
+{
+   const char *config_color;
+   const char *enventor_color;
+   Enventor_Syntax_Color_Type color_type;
+
+   color_type = ENVENTOR_SYNTAX_COLOR_STRING;
+   for (; color_type < ENVENTOR_SYNTAX_COLOR_LAST; color_type++)
+     {
+        config_color = config_syntax_color_get(color_type);
+        if (!config_color)
+          {
+             enventor_color = enventor_object_syntax_color_get(enventor,
+                                                               color_type);
+             config_syntax_color_set(color_type, enventor_color);
+          }
+     }
+}
+
+static void
+main_edc_update(Eina_Bool refresh)
+{
+   //Update file browser only if main item is changed,
+   Enventor_Item *main_it = enventor_object_main_item_get(base_enventor_get());
+   const char *prev_path = NULL;
+   if (main_it) prev_path = enventor_item_file_get(main_it);
+   if (prev_path == config_input_path_get()) return;
+
+   file_mgr_main_file_set(config_input_path_get());
+
+   if (refresh) file_browser_refresh();
+}
+
+static void
+config_update_cb(void *data EINA_UNUSED)
+{
+   Enventor_Object *enventor = base_enventor_get();
+
+   enventor_common_setup(enventor);
+
+   syntax_color_update(enventor);
+
+   base_tools_toggle(EINA_FALSE);
+   base_statusbar_toggle(EINA_FALSE);
+   base_console_auto_hide();
+
+   main_edc_update(EINA_TRUE);
+}
+
+static Eina_Bool
+main_mouse_wheel_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *ev)
+{
+   Ecore_Event_Mouse_Wheel *event = ev;
+   Evas_Coord x, y, w, h;
+
+   if (!EVENT_KEY_MODIFIER_CHECK(CTRL, event->modifiers))
+      return ECORE_CALLBACK_PASS_ON;
+
+   //View Scale
+   Evas_Object *view = enventor_object_live_view_get(base_enventor_get());
+   evas_object_geometry_get(view, &x, &y, &w, &h);
+
+   if ((event->x >= x) && (event->x <= (x + w)) &&
+       (event->y >= y) && (event->y <= (y + h)))
+     {
+        double scale = enventor_object_live_view_scale_get(base_enventor_get());
+
+        if (event->z < 0) scale += 0.05;
+        else scale -= 0.05;
+
+        if (scale > MAX_VIEW_SCALE) scale = MAX_VIEW_SCALE;
+        else if (scale < MIN_VIEW_SCALE) scale = MIN_VIEW_SCALE;
+
+        enventor_object_live_view_scale_set(base_enventor_get(), scale);
+
+        //Just in live edit mode case.
+        live_edit_update();
+
+        //Tizen Only
+        //stats_view_scale_update(scale);
+        tools_view_scale_update(scale);
+
+        return ECORE_CALLBACK_PASS_ON;
+     }
+
+   //Font Size
+   Enventor_Item *it = file_mgr_focused_item_get();
+   evas_object_geometry_get(enventor_item_editor_get(it), &x, &y, &w, &h);
+
+   if ((event->x >= x) && (event->x <= (x + w)) &&
+       (event->y >= y) && (event->y <= (y + h)))
+     {
+        if (event->z < 0)
+          {
+             config_font_scale_set(config_font_scale_get() + 0.1f);
+             enventor_object_font_scale_set(base_enventor_get(),
+                                            config_font_scale_get());
+          }
+        else
+          {
+             config_font_scale_set(config_font_scale_get() - 0.1f);
+             enventor_object_font_scale_set(base_enventor_get(),
+                                            config_font_scale_get());
+          }
+
+        char buf[128];
+        snprintf(buf, sizeof(buf), _("Font Size: %1.1fx"),
+                 config_font_scale_get());
+        stats_info_msg_update(buf);
+
+        return ECORE_CALLBACK_PASS_ON;
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+tools_set(void)
+{
+   tools_init(base_layout_get());
+   base_tools_set(tools_live_view_get(),
+                  tools_text_editor_get());
+   tools_update();
+}
+
+static void
+live_edit_set(void)
+{
+   Evas_Object *fixed_bar = live_edit_init(base_layout_get());
+   base_live_edit_fixed_bar_set(fixed_bar);
+}
+
+//Tizen Only : Support edje_cc path set
+//Tizen Only : Support autocomp eet path set
+//Tizen Only : Support Tizen version
+/*
+static Eina_Bool
+args_dispatch(int argc, char **argv,
+              char *edc_path, char *edj_path, char *workspace_path,
+              Eina_List **img_path, Eina_List **snd_path,
+              Eina_List **fnt_path, Eina_List **dat_path,
+              Eina_Bool *default_edc, Eina_Bool *template,
+              int path_size)
+*/
+static Eina_Bool
+args_dispatch(int argc, char **argv,
+              char *edc_path, char *edj_path, char *workspace_path,
+              char *edje_cc_path, char *autocomp_eet_path, char *tizen_version,
+              Eina_List **img_path, Eina_List **snd_path,
+              Eina_List **fnt_path, Eina_List **dat_path,
+              Eina_Bool *default_edc, Eina_Bool *template,
+              int path_size)
+//
+{
+
+   Eina_List *id = NULL;
+   Eina_List *fd = NULL;
+   Eina_List *sd = NULL;
+   Eina_List *dd = NULL;
+   Eina_List *wd = NULL;
+
+   //Tizen Only : Support edje_cc path set
+   char *ed = NULL;
+   //
+   //Tizen Only : Support autocomp eet path set
+   char *ad = NULL;
+   //
+   //Tizen Only : Support Tizen version
+   char *tv = NULL;
+   //
+
+   Eina_Bool quit = EINA_FALSE;
+   Eina_Bool help = EINA_FALSE;
+
+   //No arguments. set defaults
+   if (argc == 1) goto defaults;
+
+   static const Ecore_Getopt optdesc = {
+     PACKAGE_NAME,
+     ENVENTOR_USAGE,
+     VERSION,
+     ENVENTOR_COPYRIGHT,
+     ENVENTOR_LICENSE,
+     ENVENTOR_INFO,
+     EINA_TRUE,
+       {
+          ECORE_GETOPT_STORE_TRUE('t', "to", "Open template menu"),
+          ECORE_GETOPT_APPEND_METAVAR('i', "id", "Images path",
+                                      "path", ECORE_GETOPT_TYPE_STR),
+          ECORE_GETOPT_APPEND_METAVAR('s', "sd", "Sounds path",
+                                       "path", ECORE_GETOPT_TYPE_STR),
+          ECORE_GETOPT_APPEND_METAVAR('f', "fd", "Fonts path",
+                                      "path", ECORE_GETOPT_TYPE_STR),
+          ECORE_GETOPT_APPEND_METAVAR('d', "dd", "Data path",
+                                      "path", ECORE_GETOPT_TYPE_STR),
+          ECORE_GETOPT_APPEND_METAVAR('w', "wd", "Workspace path",
+                                      "path", ECORE_GETOPT_TYPE_STR),
+          //Tizen Only : Support edje_cc path set
+          ECORE_GETOPT_STORE('e', "ed", "edje_cc path", ECORE_GETOPT_TYPE_STR),
+          //
+          //Tizen Only : Support autocomp eet path set
+          ECORE_GETOPT_STORE('a', "ad", "autocomp eet path",
+                             ECORE_GETOPT_TYPE_STR),
+          //
+          //Tizen Only : Support Tizen version
+          ECORE_GETOPT_STORE('z', "tv", "tizen version",
+                             ECORE_GETOPT_TYPE_STR),
+          //
+          ECORE_GETOPT_APPEND_METAVAR('w', "wd", "Workspace path",
+                                      "path", ECORE_GETOPT_TYPE_STR),
+          ECORE_GETOPT_VERSION('v', "version"),
+          ECORE_GETOPT_COPYRIGHT('c', "copyright"),
+          ECORE_GETOPT_LICENSE('l', "license"),
+          ECORE_GETOPT_HELP('h', "help"),
+          ECORE_GETOPT_SENTINEL
+       }
+   };
+
+   Ecore_Getopt_Value values[] = {
+      ECORE_GETOPT_VALUE_BOOL(*template),
+      ECORE_GETOPT_VALUE_LIST(id),
+      ECORE_GETOPT_VALUE_LIST(sd),
+      ECORE_GETOPT_VALUE_LIST(fd),
+      ECORE_GETOPT_VALUE_LIST(dd),
+      ECORE_GETOPT_VALUE_LIST(wd),
+      //Tizen Only : Support edje_cc path set
+      ECORE_GETOPT_VALUE_STR(ed),
+      //
+      //Tizen Only : Support autocomp eet path set
+      ECORE_GETOPT_VALUE_STR(ad),
+      //
+      //Tizen Only : Support Tizen version
+      ECORE_GETOPT_VALUE_STR(tv),
+      //
+      ECORE_GETOPT_VALUE_BOOL(quit),
+      ECORE_GETOPT_VALUE_BOOL(quit),
+      ECORE_GETOPT_VALUE_BOOL(quit),
+      ECORE_GETOPT_VALUE_BOOL(help),
+      ECORE_GETOPT_VALUE_NONE
+   };
+
+   //edc path
+   int i = 0;
+   for (; i < argc; i++)
+     {
+        if (strstr(argv[i], ".edc"))
+          {
+             snprintf(edc_path, path_size, "%s", argv[i]);
+             *default_edc = EINA_FALSE;
+          }
+        else if (strstr(argv[i], ".edj"))
+          {
+             snprintf(edj_path, path_size, "%s", argv[i]);
+
+             //Tizen Only : If output EDJ file exists, remove it to generate
+             //             the same file successfully on Windows.
+             if (ecore_file_exists(edj_path))
+               ecore_file_remove(edj_path);
+          }
+     }
+
+   if ((ecore_getopt_parse(&optdesc, values, argc, argv) < 0) || quit)
+     return EINA_FALSE;
+
+   if (help)
+     {
+        fprintf(stdout, ENVENTOR_HELP_EXAMPLES);
+        return EINA_FALSE;
+     }
+
+defaults:
+   if (*default_edc)
+     {
+        Eina_Tmpstr *tmp_path;
+        eina_file_mkstemp(DEFAULT_EDC_FORMAT, &tmp_path);
+        snprintf(edc_path, path_size, "%s", (const char *)tmp_path);
+        eina_tmpstr_del(tmp_path);
+     }
+   //Tizen Only: In Tizen SDK, EDC is already created by plugin wizard before
+   //            enventor opens it. So EDC can be overwritten with template.
+   //else
+   //  {
+   //     //Do not overwrite existing EDC file with template code.
+   //     if (*template && ecore_file_exists(edc_path))
+   //       {
+   //          fprintf(stdout, "\"%s\" already exists! Please input another file "
+   //                  "name with \"-t\" option.\n", edc_path);
+   //          return EINA_FALSE;
+   //       }
+   //  }
+
+     char *s = NULL;
+     EINA_LIST_FREE(id, s)
+       {
+          *img_path = eina_list_append(*img_path, eina_stringshare_add(s));
+          free(s);
+       }
+     EINA_LIST_FREE(sd, s)
+       {
+          *snd_path = eina_list_append(*snd_path, eina_stringshare_add(s));
+          free(s);
+       }
+     EINA_LIST_FREE(fd, s)
+       {
+          *fnt_path = eina_list_append(*fnt_path, eina_stringshare_add(s));
+          free(s);
+       }
+     EINA_LIST_FREE(dd, s)
+       {
+          *dat_path = eina_list_append(*dat_path, eina_stringshare_add(s));
+          free(s);
+       }
+     if (wd)
+       {
+          sprintf(workspace_path, "%s", (char *)eina_list_data_get(wd));
+          EINA_LIST_FREE(wd, s) free(s);
+       }
+     else
+       {
+          sprintf(workspace_path, ".");
+       }
+
+     //Tizen Only : Support edje_cc path set
+     if (ed) sprintf(edje_cc_path, "%s", ed);
+     //
+     //Tizen Only : Support autocomp eet path set
+     if (ad) sprintf(autocomp_eet_path, "%s", ad);
+     //
+     //Tizen Only : Support Tizen version
+     if (tv) sprintf(tizen_version, "%s", tv);
+     //
+
+     return EINA_TRUE;
+}
+
+static Eina_Bool
+//Tizen Only
+//config_data_set(int argc, char **argv, Eina_Bool *default_edc,
+//                Eina_Bool *template)
+config_data_set(app_data *ad, int argc, char **argv, Eina_Bool *default_edc,
+                Eina_Bool *template)
+//
+{
+   char edc_path[PATH_MAX] = { 0, };
+   char edj_path[PATH_MAX] = { 0, };
+   char workspace_path[PATH_MAX] = { 0, };
+   //Tizen Only : Support edje_cc path set
+   char edje_cc_path[PATH_MAX] = { 0, };
+   //
+   //Tizen Only : Support autocomp eet path set
+   char autocomp_eet_path[PATH_MAX] = { 0, };
+   //
+   //Tizen Only : Support Tizen version
+   char tizen_version[PATH_MAX] = { 0, };
+   //
+   Eina_List *img_path = NULL;
+   Eina_List *snd_path = NULL;
+   Eina_List *fnt_path = NULL;
+   Eina_List *dat_path = NULL;
+
+   //Tizen Only : Support edje_cc path set
+   //Tizen Only : Support autocomp eet path set
+   //Tizen Only : Support Tizen version
+   /*
+      if (!args_dispatch(argc, argv, edc_path, edj_path, workspace_path,
+                 &img_path, &snd_path, &fnt_path, &dat_path,
+                 default_edc, template, PATH_MAX))
+        return EINA_FALSE;
+    */
+   if (!args_dispatch(argc, argv, edc_path, edj_path, workspace_path,
+                      edje_cc_path, autocomp_eet_path, tizen_version, &img_path,
+                      &snd_path, &fnt_path, &dat_path, default_edc, template,
+                      PATH_MAX))
+     return EINA_FALSE;
+   if (edje_cc_path[0]) ad->edje_cc_path = eina_stringshare_add(edje_cc_path);
+   if (autocomp_eet_path[0])
+     ad->autocomp_eet_path = eina_stringshare_add(autocomp_eet_path);
+   if (tizen_version[0])
+     ad->tizen_version = eina_stringshare_add(tizen_version);
+   //
+   if (!config_init(edc_path, edj_path, workspace_path,
+                    img_path, snd_path, fnt_path, dat_path))
+     return EINA_FALSE;
+   config_update_cb_set(config_update_cb, NULL);
+
+   return EINA_TRUE;
+}
+
+static void
+elm_setup()
+{
+   elm_need_efreet();
+   elm_config_profile_set("standard");
+
+   /* Recover the scale since it will be reset by
+      elm_config_profile_set() */
+   char *scale = getenv("ELM_SCALE");
+   if (scale) elm_config_scale_set(atof(scale));
+
+   /* Recover the current engine since it will be reset by
+      elm_config_profile_set() */
+   char *engine = getenv("ELM_ACCEL");
+   if (engine && !strncmp(engine, "hw", strlen("hw")))
+     elm_config_accel_preference_set("hw");
+
+   elm_config_tooltip_delay_set(0.5);
+   elm_config_focus_highlight_clip_disabled_set(EINA_FALSE);
+   elm_config_scroll_bounce_enabled_set(EINA_FALSE);
+   elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+   elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR);
+   elm_app_compile_data_dir_set(PACKAGE_DATA_DIR);
+   elm_app_compile_lib_dir_set(PACKAGE_LIB_DIR);
+   elm_app_info_set(main, "enventor", "images/enventor_logo.png");
+
+   //Tizen Only
+   snprintf(EDJE_PATH, sizeof(EDJE_PATH), "%s/themes/elm/enventor.edj",
+            elm_app_data_dir_get());
+   elm_theme_set(NULL, EDJE_PATH);
+
+   snprintf(EDJE_PATH, sizeof(EDJE_PATH), "%s/themes/enventor.edj",
+            elm_app_data_dir_get());
+   elm_theme_extension_add(NULL, EDJE_PATH);
+}
+
+static void
+enventor_cursor_line_changed_cb(void *data EINA_UNUSED,
+                                Enventor_Object *obj EINA_UNUSED,
+                                void *event_info)
+{
+   Enventor_Cursor_Line *cur_line = (Enventor_Cursor_Line *)event_info;
+   stats_line_num_update(cur_line->cur_line, cur_line->max_line);
+}
+
+static void
+enventor_cursor_group_changed_cb(void *data EINA_UNUSED, Enventor_Object *obj,
+                                 void *event_info)
+{
+   const char *group_name = event_info;
+   stats_edc_group_update(group_name);
+   base_edc_navigator_group_update();
+
+   //View Size
+   int w, h;
+   enventor_object_live_view_size_get(obj, &w, &h);
+
+   //Set default view size if this view has no size.
+   if ((w == 0) && (h == 0))
+     {
+        config_view_size_get(&w, &h);
+        enventor_object_live_view_size_set(obj, w, h);
+     }
+   stats_view_size_update(w, h);
+
+   //View Scale
+   double scale = enventor_object_live_view_scale_get(obj);
+   //Tizen Only
+   //stats_view_scale_update(scale);
+   tools_view_scale_update(scale);
+}
+
+static void
+enventor_compile_error_cb(void *data EINA_UNUSED,
+                          Enventor_Object *obj EINA_UNUSED,
+                          void *event_info)
+{
+   const char *msg = event_info;
+   base_error_msg_set(msg);
+}
+
+static void
+enventor_live_view_resized_cb(void *data EINA_UNUSED,
+                              Enventor_Object *obj EINA_UNUSED,
+                              void *event_info)
+{
+   Enventor_Live_View_Size *size = event_info;
+   stats_view_size_update(size->w, size->h);
+}
+
+static void
+enventor_live_view_loaded_cb(void *data EINA_UNUSED, Enventor_Object *obj EINA_UNUSED,
+                             void *event_info EINA_UNUSED)
+{
+   base_edc_navigator_group_update();
+   win32_edj_update();
+}
+
+static void
+enventor_live_view_cursor_moved_cb(void *data EINA_UNUSED,
+                                   Enventor_Object *obj EINA_UNUSED,
+                                   void *event_info)
+{
+   Enventor_Live_View_Cursor *cursor = event_info;
+   stats_cursor_pos_update(cursor->x, cursor->y, cursor->relx, cursor->rely);
+   base_edc_navigator_deselect();
+}
+
+static void
+enventor_ctxpopup_activated_cb(void *data EINA_UNUSED,
+                               Enventor_Object *obj EINA_UNUSED,
+                               void *event_info)
+{
+   Enventor_Ctxpopup_Type type = (Enventor_Ctxpopup_Type) event_info;
+
+   if (type == ENVENTOR_CTXPOPUP_TYPE_SLIDER)
+     stats_info_msg_update("Mouse wheel: Change values elaborately.  "
+                           "Backspace: Reset values.");
+   else if (type == ENVENTOR_CTXPOPUP_TYPE_TOGGLE)
+     stats_info_msg_update("Backspace: Reset values.");
+}
+
+static void
+enventor_ctxpopup_changed_cb(void *data, Enventor_Object *obj EINA_UNUSED,
+                             void *event_info)
+{
+   app_data *ad = data;
+   Enventor_Item *it = event_info;
+
+   if (!enventor_item_modified_get(it)) return;
+
+   //Tizen Only : Save EDC on Windows
+#ifndef _WIN32
+   //FIXME: Probably, this lazy stuff is broken.
+   //These data should be up to items.
+   if (ad->on_saving)
+     {
+        ad->lazy_save = EINA_TRUE;
+        return;
+     }
+   ad->on_saving = EINA_TRUE;
+#endif
+   //
+
+   win32_edj_path_reset(config_input_path_get());
+   enventor_item_file_save(it, NULL);
+}
+
+static void
+enventor_live_view_updated_cb(void *data, Enventor_Object *obj EINA_UNUSED,
+                              void *event_info)
+{
+   app_data *ad = data;
+
+   Enventor_Item *it = event_info;
+
+   //FIXME: Probably, this lazy stuff is broken.
+   //These data should be up to items.
+   if (ad->lazy_save && enventor_item_modified_get(it))
+     {
+        win32_edj_path_reset(config_input_path_get());
+        enventor_item_file_save(it, NULL);
+        ad->lazy_save = EINA_FALSE;
+     }
+   else
+     {
+        ad->lazy_save = EINA_FALSE;
+        ad->on_saving = EINA_FALSE;
+     }
+   base_edc_navigator_group_update();
+   win32_edj_update();
+}
+
+static void
+enventor_ctxpopup_dismissed_cb(void *data EINA_UNUSED, Enventor_Object *obj,
+                               void *event_info EINA_UNUSED)
+{
+   if (menu_activated_get() > 0)
+     enventor_object_focus_set(obj, EINA_FALSE);
+}
+
+static void
+enventor_file_open_requested_cb(void *data EINA_UNUSED, Enventor_Object *obj EINA_UNUSED,
+                                void *event_info)
+{
+   const char *file_name = event_info;
+   file_mgr_file_open(file_name);
+}
+
+static void
+enventor_focused_cb(void *data EINA_UNUSED, Enventor_Object *obj EINA_UNUSED,
+                    void *event_info EINA_UNUSED)
+{
+   //FIXME: Get the all modified file list.
+   if (file_mgr_edc_modified_get()) file_mgr_warning_open();
+}
+
+static void
+enventor_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+                       Enventor_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   base_edc_navigator_deselect();
+}
+
+static Enventor_Object *
+enventor_setup(app_data *ad)
+{
+   Enventor_Object *enventor = enventor_object_add(base_layout_get());
+
+   //Tizen Only : Support edje_cc path set
+   enventor_object_edje_cc_path_set(enventor, ad->edje_cc_path);
+   //
+   //Tizen Only : Support autocomp eet path set
+   enventor_object_auto_complete_eet_path_set(enventor, ad->autocomp_eet_path);
+   //
+   //Tizen Only : Support Tizen version
+   enventor_object_tizen_version_set(enventor, ad->tizen_version);
+   //
+   evas_object_smart_callback_add(enventor, "max_line,changed",
+                                  enventor_cursor_line_changed_cb, ad);
+   evas_object_smart_callback_add(enventor, "cursor,line,changed",
+                                  enventor_cursor_line_changed_cb, ad);
+   evas_object_smart_callback_add(enventor, "cursor,group,changed",
+                                  enventor_cursor_group_changed_cb, ad);
+   evas_object_smart_callback_add(enventor, "compile,error",
+                                  enventor_compile_error_cb, ad);
+   evas_object_smart_callback_add(enventor, "live_view,loaded",
+                                  enventor_live_view_loaded_cb, ad);
+   evas_object_smart_callback_add(enventor, "live_view,cursor,moved",
+                                  enventor_live_view_cursor_moved_cb, ad);
+   evas_object_smart_callback_add(enventor, "live_view,resized",
+                                  enventor_live_view_resized_cb, ad);
+   evas_object_smart_callback_add(enventor, "live_view,updated",
+                                  enventor_live_view_updated_cb, ad);
+   evas_object_smart_callback_add(enventor, "ctxpopup,activated",
+                                  enventor_ctxpopup_activated_cb, ad);
+   evas_object_smart_callback_add(enventor, "ctxpopup,changed",
+                                  enventor_ctxpopup_changed_cb, ad);
+   evas_object_smart_callback_add(enventor, "ctxpopup,dismissed",
+                                  enventor_ctxpopup_dismissed_cb, ad);
+   evas_object_smart_callback_add(enventor, "focused",
+                                  enventor_focused_cb, ad);
+   evas_object_smart_callback_add(enventor, "file,open,requested",
+                                  enventor_file_open_requested_cb, ad);
+   evas_object_event_callback_add(enventor, EVAS_CALLBACK_MOUSE_DOWN,
+                                  enventor_mouse_down_cb, ad);
+
+   evas_object_size_hint_expand_set(enventor, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_fill_set(enventor, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+   enventor_common_setup(enventor);
+
+   base_enventor_set(enventor);
+
+   return enventor;
+}
+
+static Eina_Bool
+alt_func(Evas_Event_Key_Down *event)
+{
+   if (evas_key_modifier_is_set(event->modifiers, "Shift") ||
+       evas_key_modifier_is_set(event->modifiers, "Ctrl"))
+     return EINA_FALSE;
+
+   //Full Edit View
+   if (!strcmp(event->key, "Left"))
+     {
+        base_live_view_full_view();
+        return EINA_TRUE;
+     }
+   //Full Live View
+   if (!strcmp(event->key, "Right"))
+     {
+        base_enventor_full_view();
+        return EINA_TRUE;
+     }
+   //Full Console View
+   if (!strcmp(event->key, "Up"))
+     {
+        base_console_full_view();
+        return EINA_TRUE;
+     }
+   //Full Editors View
+   if (!strcmp(event->key, "Down"))
+     {
+        base_editors_full_view();
+        return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+ctrl_func(Evas_Event_Key_Down *event)
+{
+   if (evas_key_modifier_is_set(event->modifiers, "Shift") ||
+       evas_key_modifier_is_set(event->modifiers, "Alt"))
+     return EINA_FALSE;
+
+   //Save
+   if (!strcmp(event->key, "s") || !strcmp(event->key, "S"))
+     {
+#ifdef _WIN32
+        Enventor_Item *it = file_mgr_focused_item_get();
+        if (enventor_item_modified_get(it))
+          win32_edj_path_reset(config_input_path_get());
+#endif
+        file_mgr_edc_save();
+        return EINA_TRUE;
+     }
+  //Delete Line
+   if (!strcmp(event->key, "d") || !strcmp(event->key, "D"))
+     {
+        enventor_item_line_delete(file_mgr_focused_item_get());
+        return EINA_TRUE;
+     }
+   //Find/Replace
+   if (!strcmp(event->key, "f") || !strcmp(event->key, "F"))
+     {
+        live_edit_cancel(EINA_FALSE);
+        search_open();
+        return EINA_TRUE;
+     }
+   //Goto Line
+   if (!strcmp(event->key, "l") || !strcmp(event->key, "L"))
+     {
+        live_edit_cancel(EINA_FALSE);
+        goto_open();
+        return EINA_TRUE;
+     }
+   //Part Highlight
+   if (!strcmp(event->key, "h") || !strcmp(event->key, "H"))
+     {
+        tools_highlight_update(EINA_TRUE);
+        return EINA_TRUE;
+     }
+   //Dummy Object
+   if (!strcmp(event->key, "u") || !strcmp(event->key, "U"))
+     {
+        tools_dummy_update(EINA_TRUE);
+        return EINA_TRUE;
+     }
+   //Wireframes
+   if (!strcmp(event->key, "w") || !strcmp(event->key, "W"))
+     {
+        tools_wireframes_update(EINA_TRUE);
+        return EINA_TRUE;
+     }
+   //Mirror Mode
+   if (!strcmp(event->key, "m") || !strcmp(event->key, "M"))
+     {
+        tools_mirror_mode_update(EINA_TRUE);
+        return EINA_TRUE;
+     }
+   //Template Code
+   if (!strcmp(event->key, "t") || !strcmp(event->key, "T"))
+     {
+        tools_template_insert();
+        return EINA_TRUE;
+     }
+
+   if (!strcmp(event->key, "space"))
+     {
+        enventor_object_auto_complete_list_show(base_enventor_get());
+        return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+static void
+keygrabber_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;
+
+   //Main Menu
+   if (!strcmp(ev->key, "Escape"))
+     {
+        if (stats_ctxpopup_dismiss()) return;
+
+        if (live_edit_cancel(EINA_TRUE))
+          {
+             enventor_object_focus_set(base_enventor_get(), EINA_TRUE);
+             return;
+          }
+        if (file_mgr_warning_is_opened())
+          {
+             file_mgr_warning_close();
+             return;
+          }
+        if (enventor_object_ctxpopup_visible_get(base_enventor_get()))
+          {
+             enventor_object_ctxpopup_dismiss(base_enventor_get());
+             return;
+          }
+
+        menu_toggle();
+        return;
+     }
+
+   if (menu_activated_get() > 0) return;
+   if (file_mgr_warning_is_opened()) return;
+
+   enventor_object_ctxpopup_dismiss(base_enventor_get());
+   stats_ctxpopup_dismiss();
+
+   if (ctrl_func(ev)) return;
+   if (alt_func(ev)) return;
+
+   //About
+   if (!strcmp(ev->key, "F1"))
+     {
+        enventor_object_ctxpopup_dismiss(base_enventor_get());
+        live_edit_cancel(EINA_FALSE);
+        help_open();
+        return;
+     }
+   //Set Main EDC
+   if (!strcmp(ev->key, "F2"))
+     {
+        file_browser_selected_file_main_set();
+        main_edc_update(EINA_FALSE);
+        return;
+     }
+   //Revert Quick Jump
+   if (!strcmp(ev->key, "F4"))
+     {
+        if (!file_mgr_file_backward())
+          stats_info_msg_update("No files go back.");
+        return;
+     }
+   //Keyword Reference
+   if (!strcmp(ev->key, "F5"))
+     {
+        enventor_object_ctxpopup_dismiss(base_enventor_get());
+        enventor_object_keyword_reference_show(base_enventor_get());
+        return;
+     }
+   //Tools
+   if (!strcmp(ev->key, "F7"))
+     {
+        enventor_object_ctxpopup_dismiss(base_enventor_get());
+        base_tools_toggle(EINA_TRUE);
+        return;
+     }
+   //Status Bar
+   if (!strcmp(ev->key, "F8"))
+     {
+        enventor_object_ctxpopup_dismiss(base_enventor_get());
+        base_statusbar_toggle(EINA_TRUE);
+        return;
+     }
+   //File Browser
+   if (!strcmp(ev->key, "F9"))
+     {
+        enventor_object_ctxpopup_dismiss(base_enventor_get());
+        tools_file_browser_update(EINA_TRUE);
+        return;
+     }
+   //EDC Navigator
+   if (!strcmp(ev->key, "F10"))
+     {
+        enventor_object_ctxpopup_dismiss(base_enventor_get());
+        tools_edc_navigator_update(EINA_TRUE);
+        return;
+     }
+   //File Tab
+   if (!strcmp(ev->key, "F11"))
+     {
+        enventor_object_ctxpopup_dismiss(base_enventor_get());
+        tools_file_tab_update(EINA_TRUE);
+        return;
+     }
+   //Setting
+   if (!strcmp(ev->key, "F12"))
+     {
+        live_edit_cancel(EINA_FALSE);
+        enventor_object_ctxpopup_dismiss(base_enventor_get());
+        menu_setting();
+        return;
+     }
+}
+
+static void
+statusbar_set()
+{
+   Evas_Object *obj = stats_init(base_layout_get());
+   elm_object_part_content_set(base_layout_get(), "elm.swallow.statusbar", obj);
+   base_statusbar_toggle(EINA_FALSE);
+}
+
+static void
+keygrabber_init(app_data *ad)
+{
+   Evas *e = evas_object_evas_get(base_enventor_get());
+   ad->keygrabber = evas_object_rectangle_add(e);
+   evas_object_event_callback_add(ad->keygrabber, EVAS_CALLBACK_KEY_DOWN,
+                                  keygrabber_key_down_cb, NULL);
+#define GRAB_ADD(key, modifier) \
+   if (!evas_object_key_grab(ad->keygrabber, (key), (modifier), 0, EINA_TRUE)) \
+     EINA_LOG_ERR(_("Failed to grab key - %s"), (key))
+
+   GRAB_ADD("Escape", 0);
+   GRAB_ADD("F1", 0);
+   GRAB_ADD("F2", 0);
+   GRAB_ADD("F3", 0);
+   GRAB_ADD("F4", 0);
+   GRAB_ADD("F5", 0);
+   GRAB_ADD("F6", 0);
+   GRAB_ADD("F7", 0);
+   GRAB_ADD("F8", 0);
+   GRAB_ADD("F9", 0);
+   GRAB_ADD("F10", 0);
+   GRAB_ADD("F11", 0);
+   GRAB_ADD("F12", 0);
+
+   Evas_Modifier_Mask modifier;
+
+   //Ctrl Modifier Mask
+   modifier = evas_key_modifier_mask_get(e, "Control");
+   GRAB_ADD("s", modifier);
+   GRAB_ADD("S", modifier);
+   GRAB_ADD("d", modifier);
+   GRAB_ADD("D", modifier);
+   GRAB_ADD("f", modifier);
+   GRAB_ADD("F", modifier);
+   GRAB_ADD("l", modifier);
+   GRAB_ADD("L", modifier);
+   GRAB_ADD("h", modifier);
+   GRAB_ADD("H", modifier);
+   GRAB_ADD("w", modifier);
+   GRAB_ADD("W", modifier);
+   GRAB_ADD("m", modifier);
+   GRAB_ADD("M", modifier);
+   GRAB_ADD("t", modifier);
+   GRAB_ADD("T", modifier);
+   GRAB_ADD("u", modifier);
+   GRAB_ADD("U", modifier);
+   GRAB_ADD("p", modifier);
+   GRAB_ADD("P", modifier);
+   GRAB_ADD("e", modifier);
+   GRAB_ADD("E", modifier);
+   GRAB_ADD("space", modifier);
+
+   //Alt
+   modifier = evas_key_modifier_mask_get(e, "Alt");
+   GRAB_ADD("Left", modifier);
+   GRAB_ADD("Right", modifier);
+   GRAB_ADD("Up", modifier);
+   GRAB_ADD("Down", modifier);
+}
+
+static Eina_Bool
+enventor_lock_create(void)
+{
+#ifdef __APPLE__
+   return EINA_TRUE;
+#endif
+   //Tempoary Folder
+   const char *tmpdir = eina_environment_tmp_get();
+
+   //Exception 1
+   if (!tmpdir)
+     {
+        EINA_LOG_ERR("No temporary directory?!");
+        return EINA_TRUE;
+     }
+
+   //Exception 2
+   //Create temp directory if it doesn't exist.
+   if (!ecore_file_path_dir_exists(tmpdir))
+     {
+        Eina_Bool success = ecore_file_mkdir(tmpdir);
+        if (!success)
+          {
+             EINA_LOG_ERR(_("Cannot create temporary diretory \"%s\""), tmpdir);
+             return EINA_TRUE;
+          }
+     }
+
+   char buf[PATH_MAX];
+   snprintf(buf, sizeof(buf), "%s/"ENVENTOR_LOCK_FILE, tmpdir);
+
+   //Is there any other Enventor instance?
+   if (ecore_file_exists(buf))
+     {
+#ifdef _WIN32
+        hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, ENVENTOR_NAME);
+        if (hMutex)
+          {
+             fprintf(stdout, "Enventor program is already running!\n\n"
+                     "If you are really stuck in launching enventor due to "
+                     "this,\nTry removing a file \"%s\"\n", buf);
+             return EINA_FALSE;
+          }
+#else
+        fprintf(stdout, "Enventor program is already running!\n\n"
+                "If you are really stuck in launching enventor due to "
+                "this,\nTry removing a file \"%s\"\n", buf);
+        return EINA_FALSE;
+#endif
+     }
+
+   //Ok, this is an unique instance!
+#ifdef _WIN32
+   hMutex = CreateMutex(NULL, FALSE, ENVENTOR_NAME);
+
+   HANDLE handle = CreateFile(buf, GENERIC_READ, NULL, NULL, CREATE_NEW,
+                              FILE_FLAG_DELETE_ON_CLOSE, 0);
+   if (INVALID_HANDLE_VALUE == handle)
+     {
+        EINA_LOG_ERR("Failed to open file \"%s\"", buf);
+        return EINA_TRUE;
+     }
+#else
+   FILE *fp = fopen(buf, "w");
+   if (!fp)
+     {
+        EINA_LOG_ERR("Failed to open file \"%s\"", buf);
+        return EINA_TRUE;
+     }
+   fputs("x", fp);
+   fclose(fp);
+#endif
+
+   own_lock = EINA_TRUE;
+
+   return EINA_TRUE;
+}
+
+static void
+enventor_lock_remove()
+{
+   //You are not the owner of the lock.
+   if (!own_lock) return;
+
+#ifdef _WIN32
+   if (hMutex)
+     {
+        CloseHandle(hMutex);
+        hMutex = NULL;
+     }
+#else
+   //Tempoary Folder
+   const char *tmpdir = eina_environment_tmp_get();
+   if (!tmpdir)
+     {
+        EINA_LOG_ERR("No temporary directory?!");
+        return;
+     }
+
+   if (!ecore_file_path_dir_exists(tmpdir))
+     {
+        EINA_LOG_ERR("Cannot access to temporary directory?! = %s", tmpdir);
+        return;
+     }
+
+   char buf[PATH_MAX];
+   snprintf(buf, sizeof(buf), "%s/"ENVENTOR_LOCK_FILE, tmpdir);
+
+   //Just in case.
+   if (!ecore_file_exists(buf))
+     {
+        EINA_LOG_ERR("No enventor lock file?! = %s", buf);
+        return;
+     }
+
+   ecore_file_remove(buf);
+#endif
+}
+
+#ifndef _WIN32
+static void
+crash_handler(int x EINA_UNUSED, siginfo_t *info EINA_UNUSED,
+              void *data EINA_UNUSED)
+{
+   EINA_LOG_ERR("Eeeek! Eventor is terminated abnormally!");
+   enventor_lock_remove();
+}
+#endif
+
+static void
+sigaction_setup(void)
+{
+#ifndef _WIN32
+   //Just in case, if you are debugging using gdb,
+   //you can send signals like this. "handle SIGABRT pass"
+   //Use this for remove the enventor lock.
+
+   struct sigaction action;
+
+   memset(&action, 0x0, sizeof(action));
+   action.sa_handler = SIG_DFL;
+   action.sa_sigaction = crash_handler;
+   action.sa_flags = SA_NODEFER  | SA_RESETHAND | SA_SIGINFO;
+   sigemptyset(&action.sa_mask);
+
+   //Bus error (bad memory access)
+   sigaction(SIGBUS, &action, NULL);
+
+   //Floating pointer exception
+   sigaction(SIGFPE, &action, NULL);
+
+   //Illegal Instruction
+   sigaction(SIGILL, &action, NULL);
+
+   //Invalid memory reference
+   sigaction(SIGSEGV, &action, NULL);
+
+   //Kill
+   sigaction(SIGKILL, &action, NULL);
+
+   //Abort
+   sigaction(SIGABRT, &action, NULL);
+
+   //Stop
+   sigaction(SIGSTOP, &action, NULL);
+
+   //Interrupt from keyboard
+   //sigaction(SIGINT, &action, NULL);
+#else
+   (void) 0;
+#endif
+}
+
+static Eina_Bool
+init(app_data *ad, int argc, char **argv)
+{
+#ifdef ENABLE_NLS
+      setlocale(LC_ALL, "");
+      bindtextdomain(PACKAGE, LOCALE_DIR);
+      textdomain(PACKAGE);
+#endif /* set locale */
+
+   elm_setup();
+   enventor_init(argc, argv);
+
+   if (!enventor_lock_create()) return EINA_FALSE;
+
+   sigaction_setup();
+
+   Eina_Bool template = EINA_FALSE;
+   Eina_Bool default_edc = EINA_TRUE;
+   //Tizen Only
+   //if (!config_data_set(argc, argv, &default_edc, &template))
+   if (!config_data_set(ad, argc, argv, &default_edc, &template))
+     return EINA_FALSE;
+
+   //Tizen Only : Support Tizen version
+   //if (!template) newfile_default_set(default_edc);
+   if (!template) newfile_default_set(default_edc, ad->tizen_version);
+   base_gui_init();
+   statusbar_set();
+   Enventor_Object *enventor = enventor_setup(ad);
+   file_mgr_init();
+
+   //Tizen Only
+#ifdef _WIN32
+   win32_edj_path_reset(config_input_path_get());
+#endif
+   //
+   file_mgr_main_file_set(config_input_path_get());
+   base_live_view_set(enventor_object_live_view_get(enventor));
+
+   tools_set();
+   live_edit_set();
+
+   base_gui_show();
+
+   //Guarantee Enventor editor has focus.
+   enventor_object_focus_set(enventor, EINA_TRUE);
+
+   menu_init();
+
+   if (template) menu_edc_new(EINA_TRUE);
+
+   //Initialize syntax color.
+   syntax_color_init(enventor);
+   syntax_color_update(enventor);
+
+   keygrabber_init(ad);
+
+   ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, main_mouse_wheel_cb, ad);
+
+   return EINA_TRUE;
+}
+
+//Tizen Only : Support edje_cc path set
+/*
+static void
+term(void)
+*/
+static void
+term(app_data *ad)
+//
+{
+   menu_term();
+   live_edit_term();
+   stats_term();
+   tools_term();
+   base_gui_term();
+   file_mgr_term();
+   config_term();
+
+   //Tizen Only : Support additional set
+   eina_stringshare_del(ad->edje_cc_path);
+   eina_stringshare_del(ad->autocomp_eet_path);
+   eina_stringshare_del(ad->tizen_version);
+
+   enventor_lock_remove();
+   enventor_shutdown();
+}
+
+EAPI_MAIN
+int elm_main(int argc, char **argv)
+{
+   app_data ad;
+   memset(&ad, 0x00, sizeof(ad));
+
+   //Tizen Only
+   setenv("EINA_LOG_LEVEL", "1", 1);
+
+   if (!init(&ad, argc, argv))
+     {
+        term(&ad);
+        return 0;
+     }
+
+   elm_run();
+
+   term(&ad);
+
+   return 0;
+}
+ELM_MAIN()
diff --git a/src/bin/menu.c b/src/bin/menu.c
new file mode 100644 (file)
index 0000000..8ff07f1
--- /dev/null
@@ -0,0 +1,795 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "common.h"
+
+struct menu_s
+{
+   Evas_Object *menu_layout;
+   Evas_Object *newfile_layout;
+   Evas_Object *warning_layout;
+   Evas_Object *fileselector_layout;
+
+   const char *last_accessed_path;
+
+   int active_request;
+
+   Eina_Bool template_new : 1;
+};
+
+typedef struct menu_s menu_data;
+
+static menu_data *g_md = NULL;
+
+static void warning_no_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                              void *event_info EINA_UNUSED);
+static void new_save_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                            void *event_info EINA_UNUSED);
+static void edc_file_save(menu_data *md);
+static void new_yes_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                           void *event_info EINA_UNUSED);
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+fileselector_close(menu_data *md)
+{
+   elm_object_signal_emit(md->fileselector_layout, "elm,state,dismiss", "");
+}
+
+static void
+newfile_close(menu_data *md)
+{
+   elm_object_signal_emit(md->newfile_layout, "elm,state,dismiss", "");
+}
+
+static void
+warning_close(menu_data *md)
+{
+   elm_object_signal_emit(md->warning_layout, "elm,state,dismiss", "");
+}
+
+static void
+menu_close(menu_data *md)
+{
+   if (!md->menu_layout) return;
+   elm_object_signal_emit(md->menu_layout, "elm,state,dismiss", "");
+
+   //Tizen Only
+   //tools_menu_update(EINA_FALSE);
+}
+
+static void
+newfile_dismiss_done(void *data, Evas_Object *obj EINA_UNUSED,
+                     const char *emission EINA_UNUSED,
+                     const char *source EINA_UNUSED)
+{
+   menu_data *md = data;
+   evas_object_del(md->newfile_layout);
+   md->newfile_layout = NULL;
+   menu_deactivate_request();
+}
+
+static void
+fileselector_dismiss_done(void *data, Evas_Object *obj EINA_UNUSED,
+                          const char *emission EINA_UNUSED,
+                          const char *source EINA_UNUSED)
+{
+   menu_data *md = data;
+   evas_object_del(md->fileselector_layout);
+   md->fileselector_layout = NULL;
+   menu_deactivate_request();
+}
+
+static void
+menu_dismiss_done(void *data, Evas_Object *obj EINA_UNUSED,
+                  const char *emission EINA_UNUSED,
+                  const char *source EINA_UNUSED)
+{
+   menu_data *md = data;
+   evas_object_del(md->menu_layout);
+   md->menu_layout = NULL;
+   menu_deactivate_request();
+}
+
+static void
+warning_dismiss_done(void *data, Evas_Object *obj EINA_UNUSED,
+                     const char *emission EINA_UNUSED,
+                     const char *source EINA_UNUSED)
+{
+   menu_data *md = data;
+   evas_object_del(md->warning_layout);
+   md->warning_layout = NULL;
+   menu_deactivate_request();
+}
+
+static void
+newfile_ok_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                  void *event_info EINA_UNUSED)
+{
+   menu_data *md = data;
+   newfile_set(md->template_new);
+   newfile_close(md);
+   menu_close(md);
+}
+
+static void
+newfile_cancel_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+   menu_data *md = data;
+   newfile_close(md);
+}
+
+static void
+menu_back_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         void *envent_info EINA_UNUSED)
+{
+   menu_data *md = data;
+   menu_close(md);
+}
+
+void
+newfile_open(menu_data *md)
+{
+   if (md->newfile_layout) return;
+
+   Evas_Object *layout = elm_layout_add(base_win_get());
+   elm_layout_file_set(layout, EDJE_PATH, "newfile_layout");
+   elm_object_part_text_set(layout, "elm.text.title", _("New File: Choose a Template"));
+   elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "",
+                                  newfile_dismiss_done, md);
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(layout);
+   base_win_resize_object_add(layout);
+
+   elm_object_part_content_set(layout, "elm.swallow.content",
+                               newfile_create(layout, newfile_ok_btn_cb, md));
+   Evas_Object *btn;
+
+   //Ok Button
+   btn = elm_button_add(layout);
+   elm_object_text_set(btn, _("Ok"));
+   evas_object_smart_callback_add(btn, "clicked", newfile_ok_btn_cb, md);
+   elm_object_part_content_set(layout, "elm.swallow.ok_btn", btn);
+
+   //Cancel Button
+   btn = elm_button_add(layout);
+   elm_object_text_set(btn, _("Cancel"));
+   evas_object_smart_callback_add(btn, "clicked", newfile_cancel_btn_cb, md);
+   elm_object_part_content_set(layout, "elm.swallow.cancel_btn", btn);
+
+   md->newfile_layout = layout;
+   menu_activate_request();
+}
+
+static void
+warning_open(menu_data *md, Evas_Smart_Cb yes_cb, Evas_Smart_Cb save_cb)
+{
+   if (md->warning_layout) return;
+
+   stats_ctxpopup_dismiss();
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(base_win_get());
+   elm_layout_file_set(layout, EDJE_PATH, "warning_layout");
+   elm_object_part_text_set(layout, "elm.text.desc",
+                            _("You have unsaved changes."));
+   elm_object_part_text_set(layout, "elm.text.question",
+                            _("Do you want to save the changes?"));
+   elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "",
+                                  warning_dismiss_done, md);
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(layout);
+   base_win_resize_object_add(layout);
+
+   Evas_Object *btn;
+
+   //Save Button
+   btn = elm_button_add(layout);
+   elm_object_text_set(btn, _("Save"));
+   evas_object_smart_callback_add(btn, "clicked", save_cb, md);
+   evas_object_show(btn);
+   elm_object_focus_set(btn, EINA_TRUE);
+   elm_object_part_content_set(layout, "elm.swallow.btn1", btn);
+
+   //Discard Button
+   btn = elm_button_add(layout);
+   elm_object_text_set(btn, _("Discard"));
+   evas_object_smart_callback_add(btn, "clicked", yes_cb, md);
+   elm_object_part_content_set(layout, "elm.swallow.btn2", btn);
+
+   //Cancel Button
+   btn = elm_button_add(layout);
+   elm_object_text_set(btn, _("Cancel"));
+   evas_object_smart_callback_add(btn, "clicked", warning_no_btn_cb, md);
+   elm_object_part_content_set(layout, "elm.swallow.btn3", btn);
+
+   md->warning_layout = layout;
+   menu_activate_request();
+}
+
+static void
+help_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   help_open();
+}
+
+static void
+setting_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   setting_open();
+}
+
+static void
+new_yes_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   menu_data *md = data;
+   newfile_open(md);
+   warning_close(md);
+   menu_close(md);
+}
+
+static void
+exit_yes_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
+{
+   elm_exit();
+}
+
+static void
+exit_save_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                 void *event_info EINA_UNUSED)
+{
+   file_mgr_save_all();
+   elm_exit();
+}
+
+static void
+exit_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   menu_exit();
+}
+
+static Evas_Object *
+btn_create(Evas_Object *parent, const char *label, Evas_Smart_Cb cb, void *data)
+{
+   Evas_Object *btn;
+
+   btn  = elm_button_add(parent);
+   elm_object_style_set(btn, "anchor");
+   elm_object_scale_set(btn, 1.25);
+   evas_object_smart_callback_add(btn, "clicked", cb, data);
+   elm_object_text_set(btn, label);
+   evas_object_show(btn);
+
+   return btn;
+}
+
+static void
+warning_no_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                  void *event_info EINA_UNUSED)
+{
+   menu_data *md = data;
+   warning_close(md);
+}
+
+static void
+new_save_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
+{
+   menu_data *md = data;
+   file_mgr_save_all();
+   newfile_open(md);
+   warning_close(md);
+   menu_close(md);
+}
+
+static void
+new_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+           void *event_info EINA_UNUSED)
+{
+   menu_edc_new(EINA_FALSE);
+}
+
+static void
+save_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   menu_data *md = data;
+   edc_file_save(md);
+}
+
+static void
+fileselector_save_done_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   menu_data *md = data;
+   const char *selected = event_info;
+   Eina_Bool is_edc = EINA_FALSE;
+   Eina_Bool is_edj = EINA_FALSE;
+
+   eina_stringshare_refplace(&(md->last_accessed_path),
+                            elm_fileselector_path_get(obj));
+
+   if (!selected)
+     {
+        fileselector_close(md);
+        return;
+     }
+   else if (ecore_file_is_dir(selected))
+     {
+        elm_object_part_text_set(md->fileselector_layout,
+                                 "elm.text.msg", _("Choose a file to save"));
+        elm_object_signal_emit(md->fileselector_layout,
+                               "elm,action,msg,show", "");
+        return;
+     }
+
+   //Filter to read only edc or edj extensions file.
+   is_edc = eina_str_has_extension(selected, "edc");
+   is_edj = eina_str_has_extension(selected, "edj");
+   if (!is_edc && !is_edj)
+     {
+        selected = eina_stringshare_printf("%s.edc", selected);
+        is_edc = EINA_TRUE;
+     }
+
+   Enventor_Object *enventor = base_enventor_get();
+   Enventor_Item *it = file_mgr_focused_item_get();
+
+   if (is_edc)
+     {
+        Eina_Bool main_file;
+        if (file_mgr_main_item_get() == it) main_file = EINA_TRUE;
+        else main_file = EINA_TRUE;
+
+        //Update config path if main file.
+        if (main_file)
+          {
+             config_input_path_set(selected);
+             Eina_List *list = eina_list_append(NULL, config_output_path_get());
+             enventor_object_path_set(enventor, ENVENTOR_PATH_TYPE_EDJ,
+                                      list);
+             eina_list_free(list);
+          }
+
+        if (!enventor_item_file_save(it, selected))
+          {
+             char buf[PATH_MAX];
+             snprintf(buf, sizeof(buf), _("Failed to save: %s."), selected);
+             elm_object_part_text_set(md->fileselector_layout,
+                                      "elm.text.msg", buf);
+             elm_object_signal_emit(md->fileselector_layout,
+                                    "elm,action,msg,show", "");
+             eina_stringshare_del(selected);
+             return;
+          }
+
+        if (main_file) file_mgr_main_file_set(selected);
+     }
+   else if (is_edj)
+     {
+        Eina_List *edj_pathes = NULL;
+        edj_pathes = eina_list_append(edj_pathes, selected);
+        enventor_object_path_set(enventor, ENVENTOR_PATH_TYPE_EDJ,
+                                 edj_pathes);
+        enventor_item_modified_set(it, EINA_TRUE);
+        enventor_item_file_save(it, NULL);
+        eina_list_free(edj_pathes);
+     }
+
+   file_mgr_reset();
+   fileselector_close(md);
+   menu_close(md);
+}
+
+static void
+fileselector_save_selected_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   fileselector_save_done_cb(data, obj, event_info);
+}
+
+static void
+fileselector_load_done_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   menu_data *md = data;
+   const char *selected = event_info;
+
+   eina_stringshare_refplace(&(md->last_accessed_path),
+                             elm_fileselector_path_get(obj));
+
+   if (!selected)
+     {
+        fileselector_close(md);
+        return;
+     }
+
+   //Filter to read only edc extension file.
+   char *ext = strrchr(selected, '.');
+   if (!ext || strcmp(ext, ".edc"))
+     {
+        elm_object_part_text_set(md->fileselector_layout,
+                                 "elm.text.msg",
+                                 _("Support only .edc file."));
+        elm_object_signal_emit(md->fileselector_layout,
+                               "elm,action,msg,show", "");
+        return;
+     }
+
+   //Directory?
+   if (ecore_file_is_dir(selected))
+     {
+        elm_object_part_text_set(md->fileselector_layout,
+                                 "elm.text.msg", _("Choose a file to load."));
+        elm_object_signal_emit(md->fileselector_layout,
+                               "elm,action,msg,show", "");
+        return;
+     }
+
+   //Show a message if it failed to load the file.
+   if (!ecore_file_can_read(selected))
+     {
+        char buf[PATH_MAX];
+        const char *filename = ecore_file_file_get(selected);
+        snprintf(buf, sizeof(buf), _("Failed to load: %s."), filename);
+        elm_object_part_text_set(md->fileselector_layout,
+                                 "elm.text.msg", buf);
+        elm_object_signal_emit(md->fileselector_layout,
+                               "elm,action,msg,show", "");
+        return;
+     }
+
+   //Tizen Only
+   Eina_List *list = eina_list_append(NULL, config_output_path_get());
+   enventor_object_path_set(base_enventor_get(), ENVENTOR_PATH_TYPE_EDJ, list);
+   eina_list_free(list);
+
+   config_input_path_set(selected);
+   file_mgr_main_file_set(selected);
+   fileselector_close(md);
+   menu_close(md);
+   file_mgr_reset();
+}
+
+static void
+fileselector_load_selected_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   fileselector_load_done_cb(data, obj, event_info);
+}
+
+static void
+edc_file_save(menu_data *md)
+{
+   //Layout
+   Evas_Object *layout = elm_layout_add(base_win_get());
+   elm_layout_file_set(layout, EDJE_PATH, "fileselector_layout");
+   elm_object_part_text_set(layout, "elm.text.title",
+                            _("Save File: Choose a EDC"));
+   elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "",
+                                  fileselector_dismiss_done, md);
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(layout);
+   base_win_resize_object_add(layout);
+
+   Evas_Object *fs = elm_fileselector_add(layout);
+   elm_object_part_text_set(fs, "ok", _("Save"));
+   elm_object_part_text_set(fs, "cancel", _("Close"));
+   elm_fileselector_path_set(fs, md->last_accessed_path ? md->last_accessed_path : getenv("HOME"));
+   elm_fileselector_expandable_set(fs, EINA_FALSE);
+   elm_fileselector_is_save_set(fs, EINA_TRUE);
+   evas_object_smart_callback_add(fs, "done", fileselector_save_done_cb, md);
+   evas_object_smart_callback_add(fs, "selected", fileselector_save_selected_cb,
+                                  md);
+   evas_object_show(fs);
+
+   elm_object_part_content_set(layout, "elm.swallow.fileselector", fs);
+
+   menu_activate_request();
+
+   elm_object_focus_set(fs, EINA_TRUE);
+
+   md->fileselector_layout = layout;
+}
+
+static void
+edc_file_load(menu_data *md)
+{
+   //Layout
+   Evas_Object *layout = elm_layout_add(base_win_get());
+   elm_layout_file_set(layout, EDJE_PATH, "fileselector_layout");
+   elm_object_part_text_set(layout, "elm.text.title",
+                            _("Load File: Choose a EDC"));
+   elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "",
+                                  fileselector_dismiss_done, md);
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(layout);
+   base_win_resize_object_add(layout);
+
+   Evas_Object *fs = elm_fileselector_add(layout);
+   elm_fileselector_path_set(fs, md->last_accessed_path ? md->last_accessed_path : getenv("HOME"));
+   elm_object_part_text_set(fs, "ok", _("Load"));
+   elm_object_part_text_set(fs, "cancel", _("Close"));
+   elm_fileselector_expandable_set(fs, EINA_FALSE);
+   elm_fileselector_is_save_set(fs, EINA_TRUE);
+   evas_object_smart_callback_add(fs, "done", fileselector_load_done_cb, md);
+   evas_object_smart_callback_add(fs, "selected", fileselector_load_selected_cb,
+                                  md);
+   evas_object_show(fs);
+
+   elm_object_part_content_set(layout, "elm.swallow.fileselector", fs);
+
+   menu_activate_request();
+
+   elm_object_focus_set(fs, EINA_TRUE);
+
+   md->fileselector_layout = layout;
+}
+
+static void
+load_yes_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
+{
+   menu_data *md = data;
+   edc_file_load(md);
+   warning_close(md);
+}
+
+static void
+load_save_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                 void *event_info EINA_UNUSED)
+{
+   menu_data *md = data;
+   file_mgr_save_all();
+   edc_file_load(md);
+   warning_close(md);
+}
+
+static void
+load_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   menu_edc_load();
+}
+
+static void
+menu_open(menu_data *md EINA_UNUSED)
+{
+   //Layout
+   Evas_Object *layout = elm_layout_add(base_win_get());
+   elm_layout_file_set(layout, EDJE_PATH, "menu_layout");
+   elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "",
+                                  menu_dismiss_done, md);
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(layout);
+   base_win_resize_object_add(layout);
+
+   //Back Button
+   Evas_Object *back_button = elm_button_add(layout);
+   elm_object_style_set(back_button, ENVENTOR_NAME);
+   elm_object_scale_set(back_button, 1.15);
+   elm_object_focus_allow_set(back_button, EINA_FALSE);
+   evas_object_show(back_button);
+   evas_object_smart_callback_add(back_button, "clicked",
+                                  menu_back_btn_clicked_cb, md);
+
+   //Back Button Icon
+   Evas_Object *back_img = elm_image_add(back_button);
+   elm_image_file_set(back_img, EDJE_PATH, "close");
+   elm_object_content_set(back_button, back_img);
+
+   elm_object_part_content_set(layout, "elm.swallow.back_button", back_button);
+
+   //Button
+   Evas_Object *btn;
+
+   //Button(New)
+   btn = btn_create(layout, _("New"), new_btn_cb, md);
+   elm_object_focus_set(btn, EINA_TRUE);
+   elm_object_part_content_set(layout, "elm.swallow.new_btn", btn);
+
+   //Button(Save)
+   btn = btn_create(layout, _("Save"), save_btn_cb, md);
+   elm_object_part_content_set(layout, "elm.swallow.save_btn", btn);
+
+   //Button(Load)
+   btn = btn_create(layout, _("Load"), load_btn_cb, md);
+   elm_object_part_content_set(layout, "elm.swallow.load_btn", btn);
+
+   //Button(Setting)
+   btn = btn_create(layout, _("Settings"), setting_btn_cb, md);
+   elm_object_part_content_set(layout, "elm.swallow.setting_btn", btn);
+
+   //Button(Help)
+   btn = btn_create(layout, _("Help"), help_btn_cb, md);
+   elm_object_part_content_set(layout, "elm.swallow.help_btn", btn);
+
+   //Button(Exit)
+   btn = btn_create(layout, _("Exit"), exit_btn_cb, md);
+   elm_object_part_content_set(layout, "elm.swallow.exit_btn", btn);
+
+   //Tizen Only
+   //tools_menu_update(EINA_TRUE);
+
+   md->menu_layout = layout;
+   md->active_request++;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+menu_init(void)
+{
+   menu_data *md = calloc(1, sizeof(menu_data));
+   if (!md)
+     {
+        mem_fail_msg();
+        return;
+     }
+   g_md = md;
+}
+
+void
+menu_term(void)
+{
+   menu_data *md = g_md;
+   free(md);
+}
+
+void
+menu_setting(void)
+{
+   setting_open();
+}
+
+void
+menu_edc_new(Eina_Bool template_new)
+{
+   menu_data *md = g_md;
+   md->template_new = template_new;
+   if (file_mgr_edc_modified_get())
+     warning_open(md, new_yes_btn_cb, new_save_btn_cb);
+   else
+     newfile_open(md);
+}
+
+void
+menu_edc_save(void)
+{
+   menu_data *md = g_md;
+   EINA_SAFETY_ON_NULL_RETURN(md);
+   edc_file_save(md);
+}
+
+void
+menu_edc_load(void)
+{
+   menu_data *md = g_md;
+   EINA_SAFETY_ON_NULL_RETURN(md);
+
+   if (file_mgr_modified_get())
+     warning_open(md, load_yes_btn_cb, load_save_btn_cb);
+   else
+     edc_file_load(md);
+}
+
+void
+menu_toggle(void)
+{
+   menu_data *md = g_md;
+   EINA_SAFETY_ON_NULL_RETURN(md);
+
+   if (setting_is_opened())
+     {
+        setting_close();
+        return;
+     }
+   if (md->warning_layout)
+     {
+        warning_close(md);
+        return;
+     }
+   if (md->newfile_layout)
+     {
+        newfile_close(md);
+        return;
+     }
+   if (md->fileselector_layout)
+     {
+        fileselector_close(md);
+        return;
+     }
+
+   //Tizen Only: main menu is disabled
+   /*
+   //Main Menu
+   if (md->active_request) menu_close(md);
+   else
+     {
+        menu_open(md);
+     }
+   */
+}
+
+int
+menu_activated_get(void)
+{
+   menu_data *md = g_md;
+   if (!md) return 0;
+   return md->active_request;
+}
+
+static void
+enventor_ctxpopup_dismissed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                               void *event_info EINA_UNUSED)
+{
+   menu_data *md = data;
+   EINA_SAFETY_ON_NULL_RETURN(md);
+
+   warning_open(md, exit_yes_btn_cb, exit_save_btn_cb);
+}
+
+void
+menu_exit(void)
+{
+   //Quit Enventor Application.
+
+   menu_data *md = g_md;
+   EINA_SAFETY_ON_NULL_RETURN(md);
+
+   if (file_mgr_edc_modified_get())
+     {
+        Enventor_Object *enventor = base_enventor_get();
+
+        search_close();
+        if (enventor_object_ctxpopup_visible_get(enventor))
+          {
+             /* bacause the main.c handles the ctxpopup dismissed callback,
+                here we needs to override the function */
+             evas_object_smart_callback_priority_add(enventor,
+                                                 "ctxpopup,dismissed", 100,
+                                                 enventor_ctxpopup_dismissed_cb,
+                                                 md);
+             enventor_object_ctxpopup_dismiss(enventor);
+          }
+        else
+          warning_open(md, exit_yes_btn_cb, exit_save_btn_cb);
+     }
+   else
+     elm_exit();
+}
+
+void
+menu_deactivate_request(void)
+{
+   menu_data *md = g_md;
+   EINA_SAFETY_ON_NULL_RETURN(md);
+
+   md->active_request--;
+
+   if (md->active_request == 0)
+     {
+        enventor_object_focus_set(base_enventor_get(), EINA_TRUE);
+     }
+   if (!md->menu_layout) return;
+   elm_object_disabled_set(md->menu_layout, EINA_FALSE);
+   elm_object_focus_set(md->menu_layout, EINA_TRUE);
+}
+
+void
+menu_activate_request(void)
+{
+   menu_data *md = g_md;
+   EINA_SAFETY_ON_NULL_RETURN(md);
+
+   if (md->menu_layout) elm_object_disabled_set(md->menu_layout, EINA_TRUE);
+   md->active_request++;
+}
diff --git a/src/bin/newfile.c b/src/bin/newfile.c
new file mode 100644 (file)
index 0000000..bd252f7
--- /dev/null
@@ -0,0 +1,313 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "common.h"
+
+typedef struct new_data_s {
+   Evas_Object *list;
+   Eina_List *templates;
+} new_data;
+
+static new_data *g_nd = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+list_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   new_data *nd = data;
+   free(nd);
+   g_nd = NULL;
+}
+
+static int
+template_sort_cb(const void *data1, const void *data2)
+{
+   const char *name1 = data1;
+   const char *name2 = data2;
+
+   if (name1[0] > name2[0]) return 1;
+   else return -1;
+}
+
+static void
+file_dir_list_cb(const char *name, const char *path EINA_UNUSED, void *data)
+{
+   new_data *nd = data;
+
+   char *ext = strrchr(name, '.');
+   if (!ext || strcmp(ext, ".edc")) return;
+
+   char *file_name = ecore_file_strip_ext(name);
+   nd->templates = eina_list_sorted_insert(nd->templates,
+                                           template_sort_cb,
+                                           eina_stringshare_add(file_name));
+   free(file_name);
+}
+
+static void
+list_item_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                      void *event_info)
+{
+   Evas_Object *layout = data;
+   Elm_Object_Item *it = event_info;
+   char *name = (char *)elm_object_item_text_get(it);
+
+   /* empty is real empty. cannot load the edj. so replace the empty to minimum
+      to show the preview layout. */
+   if (!strcmp("empty", name)) name = "minimum";
+
+   char buf[PATH_MAX];
+   //Tizen Only : Support Tizen version
+   //snprintf(buf, sizeof(buf), "%s/templates/%s.edj", elm_app_data_dir_get(),
+   //         name);
+   const char *tizen_version =
+      enventor_object_tizen_version_get(base_enventor_get());
+
+   char template_dir[PATH_MAX];
+   if (tizen_version)
+     {
+        snprintf(template_dir, sizeof(template_dir),
+                 "%s/templates/%s-templates",
+                 elm_app_data_dir_get(), tizen_version);
+
+        if (!ecore_file_exists(template_dir))
+          {
+             snprintf(template_dir, sizeof(template_dir), "%s/templates",
+                      elm_app_data_dir_get());
+          }
+     }
+   else
+     {
+        snprintf(template_dir, sizeof(template_dir), "%s/templates",
+                 elm_app_data_dir_get());
+     }
+
+   snprintf(buf, sizeof(buf), "%s/%s.edj", template_dir, name);
+   //
+
+   elm_layout_file_set(layout, buf, "main");
+}
+
+static void
+templates_get(new_data *nd)
+{
+   char buf[PATH_MAX];
+   //Tizen Only : Support Tizen version
+   //snprintf(buf, sizeof(buf), "%s/templates", elm_app_data_dir_get());
+   const char *tizen_version =
+      enventor_object_tizen_version_get(base_enventor_get());
+
+   if (tizen_version)
+     {
+        snprintf(buf, sizeof(buf), "%s/templates/%s-templates",
+                 elm_app_data_dir_get(), tizen_version);
+
+        if (!ecore_file_exists(buf))
+          snprintf(buf, sizeof(buf), "%s/templates", elm_app_data_dir_get());
+     }
+   else
+     snprintf(buf, sizeof(buf), "%s/templates", elm_app_data_dir_get());
+   //
+
+   if (!ecore_file_is_dir(buf))
+     {
+        EINA_LOG_ERR(_("Cannot find templates folder! \"%s\""), buf);
+        return;
+     }
+
+   eina_file_dir_list(buf, EINA_FALSE, file_dir_list_cb, nd);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+newfile_set(Eina_Bool template_new)
+{
+   new_data *nd = g_nd;
+   EINA_SAFETY_ON_NULL_RETURN(nd);
+
+   Elm_Object_Item *it = elm_list_selected_item_get(nd->list);
+   EINA_SAFETY_ON_NULL_RETURN(it);
+
+   Eina_Bool success = EINA_TRUE;
+   char buf[PATH_MAX];
+   char path[PATH_MAX];
+
+   //Tizen Only : Support Tizen version
+   //snprintf(buf, sizeof(buf), "%s/templates/%s.edc",
+   //         elm_app_data_dir_get(), elm_object_item_text_get(it));
+   const char *tizen_version =
+      enventor_object_tizen_version_get(base_enventor_get());
+
+   char template_dir[PATH_MAX];
+   if (tizen_version)
+     {
+        snprintf(template_dir, sizeof(template_dir),
+                 "%s/templates/%s-templates",
+                 elm_app_data_dir_get(), tizen_version);
+
+        if (!ecore_file_exists(template_dir))
+          {
+             snprintf(template_dir, sizeof(template_dir), "%s/templates",
+                      elm_app_data_dir_get());
+          }
+     }
+   else
+     {
+        snprintf(template_dir, sizeof(template_dir), "%s/templates",
+                 elm_app_data_dir_get());
+     }
+
+   snprintf(buf, sizeof(buf), "%s/%s.edc", template_dir,
+            elm_object_item_text_get(it));
+   //
+   if (template_new && config_input_path_get())
+     snprintf(path, sizeof(path), "%s", config_input_path_get());
+   else
+     {
+        Eina_Tmpstr *tmp_path;
+        eina_file_mkstemp(DEFAULT_EDC_FORMAT, &tmp_path);
+        sprintf(path, "%s", (const char *)tmp_path);
+        eina_tmpstr_del(tmp_path);
+        config_input_path_set(path);
+
+        Eina_List *list = eina_list_append(NULL, config_output_path_get());
+        enventor_object_path_set(base_enventor_get(), ENVENTOR_PATH_TYPE_EDJ,
+                                 list);
+        eina_list_free(list);
+     }
+   success = eina_file_copy(buf, path,
+                            EINA_FILE_COPY_DATA, NULL, NULL);
+   if (!success)
+     {
+        EINA_LOG_ERR(_("Cannot find file! \"%s\""), buf);
+        return;
+     }
+
+   win32_edj_path_reset(path);
+
+   file_mgr_main_file_set(path);
+   file_mgr_reset();
+   file_browser_main_file_unset();
+}
+
+//Tizen Only : Support Tizen version
+//void
+//newfile_default_set(Eina_Bool default_edc)
+void
+newfile_default_set(Eina_Bool default_edc, const char *tizen_version)
+//
+{
+   if (!default_edc) return;
+
+   Eina_Bool success = EINA_TRUE;
+   char buf[PATH_MAX];
+
+   //Tizen Only : Support Tizen version
+   //snprintf(buf, sizeof(buf), "%s/templates/Basic.edc",
+   //         elm_app_data_dir_get());
+   if (tizen_version)
+     {
+        snprintf(buf, sizeof(buf), "%s/templates/%s-templates/Basic.edc",
+                 elm_app_data_dir_get(), tizen_version);
+
+        if (!ecore_file_exists(buf))
+          {
+             snprintf(buf, sizeof(buf), "%s/templates/Basic.edc",
+                      elm_app_data_dir_get());
+          }
+     }
+   else
+     {
+        snprintf(buf, sizeof(buf), "%s/templates/Basic.edc",
+                 elm_app_data_dir_get());
+     }
+   //
+   success = eina_file_copy(buf,config_input_path_get(),
+                            EINA_FILE_COPY_DATA, NULL, NULL);
+   if (!success)
+     {
+        EINA_LOG_ERR(_("Cannot find file! \"%s\""), buf);
+        return;
+     }
+}
+
+Evas_Object *
+newfile_create(Evas_Object *parent, Evas_Smart_Cb selected_cb, void *data)
+{
+   new_data *nd = g_nd;
+   if (!nd)
+     {
+        nd = calloc(1, sizeof(new_data));
+        if (!nd)
+          {
+             mem_fail_msg();
+             return NULL;
+          }
+        g_nd = nd;
+     }
+
+   //Grid
+   Evas_Object *grid = elm_grid_add(parent);
+   //Tizen Only
+   elm_grid_size_set(grid, 600, 340);
+
+   //Preview Layout
+   Evas_Object *layout = elm_layout_add(grid);
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(layout);
+
+   //Tizen Only
+   //elm_grid_pack(grid, layout, 2, 2, 46, 98);
+   elm_grid_pack(grid, layout, 20, 20, 300, 300);
+
+   templates_get(nd);
+
+   //List
+   Evas_Object *list = elm_list_add(grid);
+   elm_object_focus_set(list, EINA_TRUE);
+   //Tizen Only
+   elm_object_focus_highlight_style_set(list, "blank");
+   //
+   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_smart_callback_add(list, "activated", selected_cb, data);
+
+   Eina_List *l;
+   Eina_Stringshare *name;
+   Elm_Object_Item *it;
+   Eina_Bool first_item = EINA_TRUE;
+
+   EINA_LIST_FOREACH(nd->templates, l, name)
+     {
+        it = elm_list_item_append(list, name, NULL, NULL, list_item_selected_cb,
+                                  layout);
+        if (first_item)
+          {
+             elm_list_item_selected_set(it, EINA_TRUE);
+             first_item = EINA_FALSE;
+          }
+     }
+   evas_object_event_callback_add(list, EVAS_CALLBACK_DEL, list_del_cb, nd);
+   evas_object_show(list);
+   elm_object_focus_set(list, EINA_TRUE);
+
+   //Tizen Only : Set 2px bigger in height not to show outline of scroller.
+   //elm_grid_pack(grid, list, 50, 0, 50, 100);
+   elm_grid_pack(grid, list, 340, -1, 260, 342);
+
+   EINA_LIST_FREE(nd->templates, name)
+     eina_stringshare_del(name);
+
+   nd->list = list;
+
+   return grid;
+}
diff --git a/src/bin/panes.c b/src/bin/panes.c
new file mode 100644 (file)
index 0000000..0d632ce
--- /dev/null
@@ -0,0 +1,481 @@
+#include "common.h"
+
+typedef enum
+{
+   PANES_LIVE_VIEW_EXPAND,
+   PANES_TEXT_EDITOR_EXPAND,
+   PANES_EDITORS_EXPAND,
+   PANES_CONSOLE_EXPAND,
+   PANES_SPLIT_VIEW
+} Panes_State;
+
+typedef struct _pane_data
+{
+   Evas_Object *obj;
+   Panes_State state;
+   double origin;
+   double delta;
+   double last_size[2]; //when down the panes bar
+   Elm_Transit *transit;
+} pane_data;
+
+typedef struct _panes_data
+{
+   pane_data horiz;  //horizontal pane data (live view, text editor)
+   pane_data vert;    //vertical pane data (editors, console)
+   Evas_Object *text_tool_layout;
+   Evas_Object *live_tool_layout;
+} panes_data;
+
+static panes_data *g_pd = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+transit_op_v(void *data, Elm_Transit *transit EINA_UNUSED, double progress)
+{
+   panes_data *pd = data;
+   elm_panes_content_right_size_set(pd->vert.obj,
+                                    pd->vert.origin +
+                                    (pd->vert.delta * progress));
+}
+
+static void
+transit_op_h(void *data, Elm_Transit *transit EINA_UNUSED, double progress)
+{
+   panes_data *pd = data;
+   elm_panes_content_right_size_set(pd->horiz.obj,
+                                    pd->horiz.origin +
+                                    (pd->horiz.delta * progress));
+}
+
+static void
+v_press_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+    panes_data *pd = data;
+    pd->vert.last_size[0] = elm_panes_content_right_size_get(obj);
+}
+
+static void
+v_unpress_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+    panes_data *pd = data;
+    double size = elm_panes_content_right_size_get(obj);
+    if (pd->vert.last_size[0] != size) pd->vert.last_size[1] = size;
+    config_console_size_set(size);
+
+   double origin = elm_panes_content_right_size_get(pd->vert.obj);
+   if (origin == 0.0)
+     {
+        pd->vert.state = PANES_EDITORS_EXPAND;
+        tools_console_update(EINA_FALSE);
+     }
+   else
+     {
+        pd->vert.state = PANES_SPLIT_VIEW;
+        tools_console_update(EINA_TRUE);
+     }
+}
+
+static void
+h_press_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+    panes_data *pd = data;
+    pd->horiz.last_size[0] = elm_panes_content_right_size_get(obj);
+}
+
+static void
+h_unpress_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+    panes_data *pd = data;
+    double size = elm_panes_content_right_size_get(obj);
+    if (pd->horiz.last_size[0] != size) pd->horiz.last_size[1] = size;
+    config_editor_size_set(size);
+}
+
+static void
+horiz_transit_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
+{
+   panes_data *pd = data;
+   pd->horiz.transit = NULL;
+}
+
+static void
+vert_transit_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
+{
+   panes_data *pd = data;
+   pd->vert.transit = NULL;
+}
+
+static void
+panes_h_full_view_cancel(panes_data *pd)
+{
+   pd->horiz.origin = elm_panes_content_right_size_get(pd->horiz.obj);
+   pd->horiz.delta = pd->horiz.last_size[1] - pd->horiz.origin;
+
+   elm_transit_del(pd->horiz.transit);
+
+   Elm_Transit *transit = elm_transit_add();
+   elm_transit_effect_add(transit, transit_op_h, pd, NULL);
+   elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
+   elm_transit_duration_set(transit, TRANSIT_TIME);
+   elm_transit_del_cb_set(transit, horiz_transit_del_cb, pd);
+   elm_transit_go(transit);
+
+   pd->horiz.transit = transit;
+   pd->horiz.state = PANES_SPLIT_VIEW;
+}
+
+static void
+panes_v_full_view_cancel(panes_data *pd)
+{
+   pd->vert.origin = elm_panes_content_right_size_get(pd->vert.obj);
+   pd->vert.delta = pd->vert.last_size[1] - pd->vert.origin;
+
+   //init console size to default
+   if (pd->vert.delta == 0.0)
+     {
+        pd->vert.delta = DEFAULT_CONSOLE_SIZE;
+        config_console_size_set(DEFAULT_CONSOLE_SIZE);
+     }
+
+   elm_transit_del(pd->vert.transit);
+
+   Elm_Transit *transit = elm_transit_add();
+   elm_transit_del_cb_set(transit, vert_transit_del_cb, pd);
+   elm_transit_effect_add(transit, transit_op_v, pd, NULL);
+   elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
+   elm_transit_duration_set(transit, TRANSIT_TIME);
+   elm_transit_go(transit);
+
+   pd->vert.transit = transit;
+   pd->vert.state = PANES_SPLIT_VIEW;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+panes_text_editor_full_view(void)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   //Revert state if the current state is full view right already.
+   if (pd->horiz.state == PANES_TEXT_EDITOR_EXPAND)
+     {
+        panes_h_full_view_cancel(pd);
+        return;
+     }
+
+   double origin = elm_panes_content_right_size_get(pd->horiz.obj);
+   if (origin == 0.0) return;
+
+   pd->horiz.origin = origin;
+   pd->horiz.delta = 0.0 - pd->horiz.origin;
+
+   elm_transit_del(pd->horiz.transit);
+
+   Elm_Transit *transit = elm_transit_add();
+   elm_transit_effect_add(transit, transit_op_h, pd, NULL);
+   elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
+   elm_transit_duration_set(transit, TRANSIT_TIME);
+   elm_transit_del_cb_set(transit, horiz_transit_del_cb, pd);
+   elm_transit_go(transit);
+
+   pd->horiz.transit = transit;
+   pd->horiz.state = PANES_TEXT_EDITOR_EXPAND;
+}
+
+void
+panes_live_view_full_view(void)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   //Revert state if the current state is full view left already.
+   if (pd->horiz.state == PANES_LIVE_VIEW_EXPAND)
+     {
+        panes_h_full_view_cancel(pd);
+        return;
+     }
+
+   double origin = elm_panes_content_right_size_get(pd->horiz.obj);
+   if (origin == 1.0) return;
+
+   pd->horiz.origin = origin;
+   pd->horiz.delta = 1.0 - pd->horiz.origin;
+
+   elm_transit_del(pd->horiz.transit);
+
+   Elm_Transit *transit = elm_transit_add();
+   elm_transit_effect_add(transit, transit_op_h, pd, NULL);
+   elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
+   elm_transit_duration_set(transit, TRANSIT_TIME);
+   elm_transit_del_cb_set(transit, horiz_transit_del_cb, pd);
+   elm_transit_go(transit);
+
+   pd->horiz.transit = transit;
+   pd->horiz.state = PANES_LIVE_VIEW_EXPAND;
+}
+
+Eina_Bool
+panes_editors_full_view_get(void)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(pd, EINA_FALSE);
+
+   if (pd->vert.state == PANES_EDITORS_EXPAND) return EINA_TRUE;
+   else return EINA_FALSE;
+}
+
+void
+panes_editors_full_view(Eina_Bool full_view)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   if (full_view)
+     {
+        if (pd->vert.state == PANES_EDITORS_EXPAND) return;
+        pd->vert.origin = elm_panes_content_right_size_get(pd->vert.obj);
+        pd->vert.delta = 0.0 - pd->vert.origin;
+
+        elm_transit_del(pd->vert.transit);
+        Elm_Transit *transit = elm_transit_add();
+        elm_transit_effect_add(transit, transit_op_v, pd, NULL);
+        elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
+        elm_transit_duration_set(transit, TRANSIT_TIME);
+        elm_transit_del_cb_set(transit, vert_transit_del_cb, pd);
+        elm_transit_go(transit);
+
+        pd->vert.transit = transit;
+        pd->vert.state = PANES_EDITORS_EXPAND;
+     }
+   else
+     {
+        //Revert state if the current state is full view bottom already.
+        if (pd->vert.state == PANES_SPLIT_VIEW) return;
+        panes_v_full_view_cancel(pd);
+     }
+}
+
+void
+panes_console_full_view(void)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   //Revert state if the current state is full view top already.
+   if (pd->vert.state == PANES_CONSOLE_EXPAND)
+     {
+        panes_v_full_view_cancel(pd);
+        return;
+     }
+
+   double origin = elm_panes_content_right_size_get(pd->vert.obj);
+   if (origin == 1.0) return;
+
+   pd->vert.origin = origin;
+   pd->vert.delta = 1.0 - pd->vert.origin;
+
+   elm_transit_del(pd->vert.transit);
+
+   Elm_Transit *transit = elm_transit_add();
+   elm_transit_effect_add(transit, transit_op_v, pd, NULL);
+   elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
+   elm_transit_duration_set(transit, TRANSIT_TIME);
+   elm_transit_del_cb_set(transit, vert_transit_del_cb, pd);
+   elm_transit_go(transit);
+
+   pd->vert.transit = transit;
+   pd->vert.state = PANES_CONSOLE_EXPAND;
+}
+
+void
+panes_text_editor_set(Evas_Object *text_editor)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   elm_object_content_set(pd->text_tool_layout, text_editor);
+}
+
+void
+panes_live_view_set(Evas_Object *live_view)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   elm_object_content_set(pd->live_tool_layout, live_view);
+}
+
+void
+panes_console_set(Evas_Object *console)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   elm_object_part_content_set(pd->vert.obj, "bottom", console);
+}
+
+void
+panes_term(void)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   evas_object_del(pd->vert.obj);
+   elm_transit_del(pd->vert.transit);
+   elm_transit_del(pd->horiz.transit);
+   free(pd);
+}
+
+Evas_Object *
+panes_init(Evas_Object *parent)
+{
+   panes_data *pd = malloc(sizeof(panes_data));
+   if (!pd)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+   g_pd = pd;
+
+   //Panes Vertical
+   Evas_Object *panes_v = elm_panes_add(parent);
+   elm_object_style_set(panes_v, "flush");
+   elm_panes_horizontal_set(panes_v, EINA_FALSE);
+   evas_object_size_hint_weight_set(panes_v, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_smart_callback_add(panes_v, "press", v_press_cb, pd);
+   evas_object_smart_callback_add(panes_v, "unpress", v_unpress_cb, pd);
+
+   pd->vert.obj = panes_v;
+   pd->vert.state = PANES_SPLIT_VIEW;
+   pd->vert.last_size[0] = config_console_size_get();
+   pd->vert.last_size[1] = config_console_size_get();
+   pd->vert.transit = NULL;
+
+   //Panes Horizontal
+   Evas_Object *panes_h = elm_panes_add(parent);
+   elm_object_style_set(panes_h, ENVENTOR_NAME);
+   elm_panes_horizontal_set(panes_v, EINA_TRUE);
+   evas_object_size_hint_weight_set(panes_h, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_smart_callback_add(panes_h, "press", h_press_cb, pd);
+   evas_object_smart_callback_add(panes_h, "unpress", h_unpress_cb, pd);
+
+   elm_object_part_content_set(panes_v, "top", panes_h);
+
+   pd->horiz.obj = panes_h;
+   pd->horiz.state = PANES_SPLIT_VIEW;
+   pd->horiz.last_size[0] = config_editor_size_get();
+   pd->horiz.last_size[1] = config_editor_size_get();
+   pd->horiz.transit = NULL;
+
+   elm_panes_content_right_size_set(panes_h, config_editor_size_get());
+   elm_panes_content_right_size_set(panes_v, config_console_size_get());
+
+   //Text Tools
+   Evas_Object *text_tool_layout = elm_layout_add(pd->horiz.obj);
+   elm_layout_file_set(text_tool_layout, EDJE_PATH, "tools_layout");
+   evas_object_size_hint_weight_set(text_tool_layout, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(text_tool_layout, EVAS_HINT_FILL,
+                                   EVAS_HINT_FILL);
+   elm_object_part_content_set(pd->horiz.obj, "right", text_tool_layout);
+
+   pd->text_tool_layout = text_tool_layout;
+
+   //Live Edit Tools
+   Evas_Object *live_tool_layout = elm_layout_add(pd->horiz.obj);
+   elm_layout_file_set(live_tool_layout, EDJE_PATH, "tools_layout");
+   evas_object_size_hint_weight_set(live_tool_layout, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(live_tool_layout, EVAS_HINT_FILL,
+                                   EVAS_HINT_FILL);
+   elm_object_part_content_set(pd->horiz.obj, "left", live_tool_layout);
+
+   pd->live_tool_layout = live_tool_layout;
+
+   return panes_v;
+}
+
+void
+panes_live_view_tools_set(Evas_Object *tools)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   Evas_Object *live_view = elm_object_part_content_get(pd->horiz.obj, "left");
+   elm_object_part_content_set(live_view, "elm.swallow.tools", tools);
+}
+
+void
+panes_live_edit_fixed_bar_set(Evas_Object *fixed_bar)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   Evas_Object *live_view = elm_object_part_content_get(pd->horiz.obj, "left");
+   elm_object_part_content_set(live_view, "elm.swallow.fixed_bar", fixed_bar);
+}
+
+void
+panes_text_editor_tools_set(Evas_Object *tools)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   Evas_Object *text_editor = elm_object_part_content_get(pd->horiz.obj,
+                                                          "right");
+   elm_object_part_content_set(text_editor, "elm.swallow.tools", tools);
+}
+
+void
+panes_live_view_tools_visible_set(Eina_Bool visible)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   Evas_Object *live_view = elm_object_part_content_get(pd->horiz.obj, "left");
+
+   if (visible)
+     elm_object_signal_emit(live_view, "elm,state,tools,show", "");
+   else
+     elm_object_signal_emit(live_view, "elm,state,tools,hide", "");
+}
+
+void
+panes_live_edit_fixed_bar_visible_set(Eina_Bool visible)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   Evas_Object *live_view = elm_object_part_content_get(pd->horiz.obj, "left");
+
+   if (visible)
+     elm_object_signal_emit(live_view, "elm,state,fixed_bar,show", "");
+   else
+     elm_object_signal_emit(live_view, "elm,state,fixed_bar,hide", "");
+}
+
+
+void
+panes_text_editor_tools_visible_set(Eina_Bool visible)
+{
+   panes_data *pd = g_pd;
+   EINA_SAFETY_ON_NULL_RETURN(pd);
+
+   Evas_Object *text_editor = elm_object_part_content_get(pd->horiz.obj,
+                                                          "right");
+
+   if (visible)
+     elm_object_signal_emit(text_editor, "elm,state,tools,show", "");
+   else
+     elm_object_signal_emit(text_editor, "elm,state,tools,hide", "");
+}
diff --git a/src/bin/preference_setting.c b/src/bin/preference_setting.c
new file mode 100644 (file)
index 0000000..ac35356
--- /dev/null
@@ -0,0 +1,352 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "common.h"
+
+typedef struct preference_setting_s
+{
+   Evas_Object *box;
+   Evas_Object *view_size_w_entry;
+   Evas_Object *view_size_h_entry;
+   Evas_Object *toggle_tools;
+   Evas_Object *toggle_status;
+   Evas_Object *toggle_console;
+   Evas_Object *toggle_indent;
+   Evas_Object *toggle_autocomp;
+   //Tizen Only
+   //Evas_Object *toggle_smart_undo_redo;
+   Evas_Object *toggle_red_alert;
+} preference_setting_data;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+static Evas_Object *
+label_create(Evas_Object *parent, const char *text)
+{
+   Evas_Object *label = elm_label_add(parent);
+   elm_object_text_set(label, text);
+   evas_object_show(label);
+
+   return label;
+}
+
+static Evas_Object *
+toggle_create(Evas_Object *parent, const char *text, Eina_Bool state,
+              const char *tooltip_msg)
+{
+   Evas_Object *toggle = elm_check_add(parent);
+   elm_object_style_set(toggle, "toggle");
+   //Tizen Only
+   elm_object_focus_highlight_style_set(toggle, "blank");
+   //
+   elm_check_state_set(toggle, state);
+   evas_object_size_hint_weight_set(toggle, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(toggle, EVAS_HINT_FILL, 0);
+   elm_object_text_set(toggle, text);
+   elm_object_tooltip_text_set(toggle, tooltip_msg);
+   evas_object_show(toggle);
+
+   return toggle;
+}
+
+static Evas_Object *
+entry_create(Evas_Object *parent)
+{
+   Evas_Object *entry = elm_entry_add(parent);
+   elm_entry_single_line_set(entry, EINA_TRUE);
+   elm_entry_scrollable_set(entry, EINA_TRUE);
+   evas_object_show(entry);
+
+   return entry;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+void
+preference_setting_focus_set(preference_setting_data *psd)
+{
+   EINA_SAFETY_ON_NULL_RETURN(psd);
+   elm_object_focus_set(psd->view_size_w_entry, EINA_TRUE);
+}
+
+void
+preference_setting_config_set(preference_setting_data *psd)
+{
+   EINA_SAFETY_ON_NULL_RETURN(psd);
+
+   config_tools_set(elm_check_state_get(psd->toggle_tools));
+   config_stats_bar_set(elm_check_state_get(psd->toggle_status));
+   config_console_set(elm_check_state_get(psd->toggle_console));
+   config_auto_indent_set(elm_check_state_get(psd->toggle_indent));
+   config_auto_complete_set(elm_check_state_get(psd->toggle_autocomp));
+   //Tizen Only
+   //config_smart_undo_redo_set(elm_check_state_get(psd->toggle_smart_undo_redo));
+   config_red_alert_set(elm_check_state_get(psd->toggle_red_alert));
+
+   Evas_Coord w = 0;
+   Evas_Coord h = 0;
+   const char *w_entry = elm_entry_entry_get(psd->view_size_w_entry);
+   if (w_entry) w = (Evas_Coord)atoi(w_entry);
+   const char *h_entry = elm_entry_entry_get(psd->view_size_h_entry);
+   if (h_entry) h = (Evas_Coord)atoi(h_entry);
+   config_view_size_set(w, h);
+}
+
+void
+preference_setting_reset(preference_setting_data *psd)
+{
+   EINA_SAFETY_ON_NULL_RETURN(psd);
+
+   elm_check_state_set(psd->toggle_tools, config_tools_get());
+   elm_check_state_set(psd->toggle_status, config_stats_bar_get());
+   elm_check_state_set(psd->toggle_console, config_console_get());
+   elm_check_state_set(psd->toggle_indent, config_auto_indent_get());
+   elm_check_state_set(psd->toggle_autocomp, config_auto_complete_get());
+   //Tizen Only
+   //elm_check_state_set(psd->toggle_smart_undo_redo,
+   //                    config_smart_undo_redo_get());
+   elm_check_state_set(psd->toggle_red_alert, config_red_alert_get());
+
+   //Reset view scale
+   int view_size_w, view_size_h;
+   config_view_size_get(&view_size_w, &view_size_h);
+   char buf[10];
+   snprintf(buf, sizeof(buf), "%d", view_size_w);
+   elm_entry_entry_set(psd->view_size_w_entry, buf);
+   snprintf(buf, sizeof(buf), "%d", view_size_h);
+   elm_entry_entry_set(psd->view_size_h_entry, buf);
+}
+
+Evas_Object *
+preference_setting_content_get(preference_setting_data *psd,
+                               Evas_Object *parent)
+{
+   static Elm_Entry_Filter_Accept_Set digits_filter_data;
+   static Elm_Entry_Filter_Limit_Size limit_filter_data;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(psd, NULL);
+   if (psd->box) return psd->box;
+
+   //Preference
+
+   //Box
+   Evas_Object *box = elm_box_add(parent);
+   //Tizen Only
+   //elm_box_padding_set(box, 0, ELM_SCALE_SIZE(5));
+   elm_box_padding_set(box, 0, ELM_SCALE_SIZE(10));
+   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);
+
+   Evas_Object *rect;
+
+   //Spacer
+   rect = evas_object_rectangle_add(evas_object_evas_get(box));
+   evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_min_set(rect, 0, ELM_SCALE_SIZE(1));
+   elm_box_pack_end(box, rect);
+
+   Evas_Object *box2;
+
+   //View Size
+
+   //Box for View Size
+   box2 = elm_box_add(box);
+   elm_box_horizontal_set(box2, EINA_TRUE);
+   elm_box_padding_set(box2, ELM_SCALE_SIZE(5), 0);
+   evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, 0);
+   evas_object_show(box2);
+
+   elm_box_pack_end(box, box2);
+
+   elm_object_tooltip_text_set(box2,
+                               _("Set default size of live view.<br>"
+                                 "When you open a new group, Its<br>"
+                                 "view size will be set with this."));
+   //Label (View Size)
+
+   /* This layout is intended to put the label aligned to left side
+      far from 3 pixels. */
+
+   //Tizen Only
+   //layout_padding3 = elm_layout_add(box2);
+   //elm_layout_file_set(layout_padding3, EDJE_PATH, "padding3_layout");
+   //evas_object_show(layout_padding3);
+
+   //elm_box_pack_end(box2, layout_padding3);
+
+   //Evas_Object *label_view_size = label_create(layout_padding3,
+   //                                            _("View Size"));
+   //elm_object_part_content_set(layout_padding3, "elm.swallow.content",
+   //                            label_view_size);
+   Evas_Object *label_view_size = label_create(box2,
+                                               "<font_weight=Bold><color=#585858><style=Regular><font_size=13>Live view size</font_size></style></color></font_weight>");
+   elm_box_pack_end(box2, label_view_size);
+   //
+
+   //Spacer
+   rect = evas_object_rectangle_add(evas_object_evas_get(box2));
+   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_box_pack_end(box2, rect);
+
+   Evas_Coord w, h;
+   char w_str[5], h_str[5];
+   config_view_size_get(&w, &h);
+   snprintf(w_str, sizeof(w_str), "%d", w);
+   snprintf(h_str, sizeof(h_str), "%d", h);
+
+   //Entry (View Width)
+   Evas_Object *entry_view_size_w = entry_create(box2);
+   //Tizen Only
+   evas_object_size_hint_weight_set(entry_view_size_w, 0.27, EVAS_HINT_EXPAND);
+   //evas_object_size_hint_weight_set(entry_view_size_w, 0.15, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(entry_view_size_w, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+   digits_filter_data.accepted = "0123456789";
+   digits_filter_data.rejected = NULL;
+   elm_entry_markup_filter_append(entry_view_size_w,
+                                  elm_entry_filter_accept_set,
+                                  &digits_filter_data);
+   limit_filter_data.max_char_count = 4;
+   limit_filter_data.max_byte_count = 0;
+   elm_entry_markup_filter_append(entry_view_size_w,
+                                  elm_entry_filter_limit_size,
+                                  &limit_filter_data);
+
+   elm_object_text_set(entry_view_size_w, w_str);
+   elm_box_pack_end(box2, entry_view_size_w);
+
+   //Label (X)
+   //Tizen Only
+   //Evas_Object *label_view_size_x = label_create(box2, "X");
+   Evas_Object *img_view_size_x = elm_image_add(box2);
+
+   elm_image_file_set(img_view_size_x, EDJE_PATH, "sizebox_icon");
+   evas_object_size_hint_min_set(img_view_size_x, 13, 24);
+   evas_object_show(img_view_size_x);
+
+   elm_box_pack_end(box2, img_view_size_x);
+   //elm_box_pack_end(box2, label_view_size_x);
+   //
+
+   //Entry (View Height)
+   Evas_Object *entry_view_size_h = entry_create(box2);
+   //Tizen Only
+   evas_object_size_hint_weight_set(entry_view_size_h, 0.27, EVAS_HINT_EXPAND);
+   //evas_object_size_hint_weight_set(entry_view_size_h, 0.15, EVAS_HINT_FILL);
+   evas_object_size_hint_align_set(entry_view_size_h, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+   elm_entry_markup_filter_append(entry_view_size_h,
+                                  elm_entry_filter_accept_set,
+                                  &digits_filter_data);
+   elm_entry_markup_filter_append(entry_view_size_h,
+                                  elm_entry_filter_limit_size,
+                                  &limit_filter_data);
+
+   elm_object_text_set(entry_view_size_h, h_str);
+   elm_box_pack_end(box2, entry_view_size_h);
+
+   //Toggle (Tools)
+   Evas_Object *toggle_tools =
+      toggle_create(box, _("Tools"),
+                    config_tools_get(),
+                    _("Tools (F7)<br>"
+                      "Display Tools on the top area.<br>"
+                      "Tools displays the essential function <br>"
+                      "toggles to edit the layout."));
+   elm_box_pack_end(box, toggle_tools);
+
+   //Toggle (Status)
+   Evas_Object *toggle_status =
+      toggle_create(box, _("Status"), config_stats_bar_get(),
+                    _("Status (F8)<br>"
+                      "Display Status bar, which shows subsidiary<br>"
+                      "information for editing in the bottom area."));
+   elm_box_pack_end(box, toggle_status);
+
+   //Toggle (Console)
+   Evas_Object *toggle_console =
+      toggle_create(box, _("Auto Hiding Console"), config_console_get(),
+                    _("Hide the console box automatically<br>"
+                      "when no messages are to be shown.<br>"
+                      "for example, when you have fixed all<br>"
+                      "grammatical errors."));
+   elm_box_pack_end(box, toggle_console);
+
+   //Toggle (Auto Indentation)
+   Evas_Object *toggle_indent =
+      toggle_create(box, _("Auto Indentation"), config_auto_indent_get(),
+                    _("Apply automatic indentation for text editing.<br>"
+                      "When wrapping the text around, EDC Editor<br>"
+                      "inserts the line indentation automatically."));
+   elm_box_pack_end(box, toggle_indent);
+
+   //Toggle (Auto Completion)
+   Evas_Object *toggle_autocomp =
+      toggle_create(box, _("Auto Completion"), config_auto_complete_get(),
+                    _("Display the candidate keyword popup with<br>"
+                      "regards to the current editing context.<br>"
+                      "When you type texts in the editor, the candidate<br>"
+                      "popup appears. You can choose an item<br>"
+                      "from the list, and a code template is inserted."));
+   elm_box_pack_end(box, toggle_autocomp);
+
+   //Tizen Only
+   //Toggle (Smart Undo/Redo)
+   //Evas_Object *toggle_smart_undo_redo =
+   //   toggle_create(box, _("Smart Undo/Redo"), config_smart_undo_redo_get(),
+   //                 _("Redo/Undo text by word. If disabled, redoing<br>"
+   //                   "and undoing works by character."));
+   //elm_box_pack_end(box, toggle_smart_undo_redo);
+
+   //Toggle (Red Alert)
+   Evas_Object *toggle_red_alert =
+      toggle_create(box, _("Error Message Red Alert"), config_red_alert_get(),
+                    _("Enable error message red alert effect.<br>"
+                      "When EDC compilation fails because of<br>"
+                      "a grammar error, EDC Editor alerts<br>"
+                      "you with a fading screen effect."));
+   evas_object_size_hint_weight_set(toggle_red_alert, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(toggle_red_alert, EVAS_HINT_FILL, 0);
+   elm_box_pack_end(box, toggle_red_alert);
+
+   psd->box = box;
+   psd->view_size_w_entry = entry_view_size_w;
+   psd->view_size_h_entry = entry_view_size_h;
+   psd->toggle_tools = toggle_tools;
+   psd->toggle_status = toggle_status;
+   psd->toggle_console = toggle_console;
+   psd->toggle_indent = toggle_indent;
+   psd->toggle_autocomp = toggle_autocomp;
+   //Tizen Only
+   //psd->toggle_smart_undo_redo = toggle_smart_undo_redo;
+   psd->toggle_red_alert = toggle_red_alert;
+
+   return box;
+}
+
+preference_setting_data *
+preference_setting_init(void)
+{
+   preference_setting_data *psd = calloc(1, sizeof(preference_setting_data));
+   if (!psd)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+   return psd;
+}
+
+void
+preference_setting_term(preference_setting_data *psd)
+{
+   EINA_SAFETY_ON_NULL_RETURN(psd);
+
+   evas_object_del(psd->box);
+   free(psd);
+}
diff --git a/src/bin/search.c b/src/bin/search.c
new file mode 100644 (file)
index 0000000..188c72f
--- /dev/null
@@ -0,0 +1,518 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "common.h"
+
+typedef struct search_s
+{
+   Evas_Object *win;
+   Evas_Object *layout;
+   Evas_Object *en_find;
+   Evas_Object *en_replace;
+   int pos;
+   int len;
+   int syntax_color;
+   Enventor_Item *it;
+   Eina_Bool forward : 1;
+} search_data;
+
+static search_data *g_sd = NULL;
+static Evas_Coord win_x = -1;
+static Evas_Coord win_y = -1;
+static Evas_Coord win_w = DEFAULT_SEARCH_WIN_W;
+static Evas_Coord win_h = DEFAULT_SEARCH_WIN_H;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+syntax_color_context_clear(search_data *sd)
+{
+   enventor_item_select_none(sd->it);
+   while (sd->syntax_color > 0)
+     {
+        enventor_item_syntax_color_partial_apply(sd->it, -1);
+        sd->syntax_color--;
+     }
+}
+
+static void
+win_delete_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+   search_close();
+}
+
+static void
+win_moved_cb(void *data EINA_UNUSED, Evas_Object *obj,
+             void *event_info EINA_UNUSED)
+{
+   /* Move the window with the previous remembered position when the window is
+      moved by window manager first time. */
+   if ((win_x != -1) || (win_y != -1)) evas_object_move(obj, win_x, win_y);
+   evas_object_smart_callback_del(obj, "moved", win_moved_cb);
+}
+
+static void
+replace_all_proc(search_data *sd)
+{
+   const char *find = elm_entry_entry_get(sd->en_find);
+   if (!find) return;
+   int find_len = strlen(find);
+
+   const char *replace = elm_entry_entry_get(sd->en_replace);
+   int replace_len = 0;
+
+   //Same word. no need to replace
+   if (replace)
+     {
+        replace_len = strlen(replace);
+        if (!strcmp(find, replace) && (find_len == replace_len))
+          return;
+     }
+
+   char buf[256];
+   int replace_cnt = 0;
+
+   const char *text = enventor_item_text_get(sd->it);
+   char *utf8 = elm_entry_markup_to_utf8(text);
+
+   char *s = utf8;
+   int pos;
+   int delta = replace_len - find_len;
+
+   while ((s = strstr(s, find)))
+     {
+        pos = s + (delta * replace_cnt) - utf8;
+        enventor_item_select_region_set(sd->it, pos, (pos + find_len));
+        enventor_item_text_insert(sd->it, replace);
+        enventor_item_select_none(sd->it);
+        replace_cnt++;
+        s++;
+     }
+
+   snprintf(buf, sizeof(buf), _("%d matches replaced"), replace_cnt);
+   stats_info_msg_update(buf);
+
+   free(utf8);
+}
+
+/* FIXME: selection_region_set() won't be worked all just right after entry
+   changes, no idea why? so use the animator. */
+static Eina_Bool
+selection_region_anim_cb(void *data)
+{
+   search_data *sd = data;
+   enventor_item_select_region_set(sd->it, sd->pos,
+                                   (sd->pos + sd->len));
+
+   //Move search position to the end of the word if search type is forward
+   if (sd->forward)
+     sd->pos += sd->len;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+find_forward_proc(search_data *sd)
+{
+   const char *find = elm_entry_entry_get(sd->en_find);
+   if (!find) return;
+
+   char buf[256];
+   Eina_Bool need_iterate = EINA_TRUE;
+
+   const char *text = enventor_item_text_get(sd->it);
+   if (!text) return;
+   char *utf8 = elm_entry_markup_to_utf8(text);
+
+   //get the character position begun with searching.
+   if (sd->pos == -1) sd->pos = enventor_item_cursor_pos_get(sd->it);
+   else if (sd->pos == 0) need_iterate = EINA_FALSE;
+   else sd->pos++;
+
+   char *s = strstr((utf8 + sd->pos), find);
+
+   //No found
+   if (!s)
+     {
+        //Need to iterate finding?
+        if (need_iterate)
+          {
+             sd->pos = 0;
+             find_forward_proc(sd);
+          }
+        //There are no searched words in the text
+        else
+          {
+             snprintf(buf, sizeof(buf), _("No \"%s\" in the text"), find);
+             stats_info_msg_update(buf);
+             sd->pos = -1;
+          }
+        free(utf8);
+        return;
+     }
+
+   //Got you!
+   sd->len = strlen(find);
+   sd->pos = s - utf8;
+   ecore_animator_add(selection_region_anim_cb, sd);
+   free(utf8);
+}
+
+static void
+find_backward_proc(search_data *sd)
+{
+   const char *find = elm_entry_entry_get(sd->en_find);
+   if (!find) return;
+
+   char buf[256];
+   Eina_Bool need_iterate = EINA_TRUE;
+   int len = 0;
+
+   const char *text = enventor_item_text_get(sd->it);
+   if (!text) return;
+   char *utf8 = elm_entry_markup_to_utf8(text);
+
+   //get the character position begun with searching.
+   if (sd->pos == -1)
+      {
+        sd->pos = enventor_item_cursor_pos_get(sd->it);
+      }
+   else
+      {
+         len = strlen(utf8);
+         if (sd->pos == len) need_iterate = EINA_FALSE;
+      }
+
+   char *prev = NULL;
+   char *s = utf8;
+
+   while ((s = strstr(s, find)))
+     {
+        if ((s - utf8) >= sd->pos) break;
+        prev = s;
+        s++;
+     }
+
+   //No found. Need to iterate finding?
+   if (!prev)
+     {
+        if (need_iterate)
+          {
+             sd->pos = len;
+             find_backward_proc(sd);
+          }
+        else
+          {
+             snprintf(buf, sizeof(buf), _("No \"%s\" in the text"), find);
+             stats_info_msg_update(buf);
+             sd->pos = -1;
+          }
+        free(utf8);
+        return;
+     }
+
+   //Got you!
+   sd->pos = prev - utf8;
+   sd->len = strlen(find);
+   ecore_animator_add(selection_region_anim_cb, sd);
+
+   free(utf8);
+}
+
+static Eina_Bool
+replace_proc(search_data *sd)
+{
+   const char *find = elm_entry_entry_get(sd->en_find);
+   const char *selection = enventor_item_selection_get(sd->it);
+   if (!find || !selection) return EINA_FALSE;
+   char *utf8 = elm_entry_markup_to_utf8(selection);
+   if (strcmp(find, utf8)) return EINA_FALSE;
+   const char *replace = elm_entry_entry_get(sd->en_replace);
+   enventor_item_text_insert(sd->it, replace);
+   enventor_item_select_none(sd->it);
+   free(utf8);
+   return EINA_TRUE;
+}
+
+static void
+backward_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                    void *event_info EINA_UNUSED)
+{
+   search_data *sd = data;
+   find_backward_proc(sd);
+   sd->forward = EINA_FALSE;
+   elm_object_part_text_set(sd->layout, "elm.text.dir", _("Previous"));
+}
+
+static void
+replace_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                   void *event_info EINA_UNUSED)
+{
+   search_data *sd = data;
+   Eina_Bool next;
+   next = replace_proc(sd);
+   enventor_item_syntax_color_full_apply(sd->it, EINA_TRUE);
+   if (!next) return;
+   if (sd->forward) find_forward_proc(sd);
+   else find_backward_proc(sd);
+}
+
+static void
+replace_all_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                   void *event_info EINA_UNUSED)
+{
+   search_data *sd = data;
+   replace_all_proc(sd);
+   enventor_item_syntax_color_full_apply(sd->it, EINA_TRUE);
+}
+
+static void
+forward_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                   void *event_info EINA_UNUSED)
+{
+   search_data *sd = data;
+   find_forward_proc(sd);
+   sd->forward = EINA_TRUE;
+   elm_object_part_text_set(sd->layout, "elm.text.dir", _("Next"));
+}
+
+static void
+find_activated_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                  void* event_info EINA_UNUSED)
+{
+   search_data *sd = data;
+   if (sd->forward) find_forward_proc(sd);
+   else find_backward_proc(sd);
+}
+
+static void
+replace_activated_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                     void* event_info EINA_UNUSED)
+{
+   search_data *sd = data;
+   Eina_Bool next;
+   next = replace_proc(sd);
+   enventor_item_syntax_color_full_apply(sd->it, EINA_TRUE);
+   if (!next) return;
+   if (sd->forward) find_forward_proc(sd);
+   else find_backward_proc(sd);
+}
+
+static void
+win_focused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   search_data *sd = g_sd;
+   enventor_item_syntax_color_full_apply(sd->it, EINA_FALSE);
+   sd->syntax_color++;
+   /* FIXME: reset position because search requests syntax color partial apply
+      when it's window is unfocused. the selection region would be dismissed.
+      we can remove this once selection region could be recovered just right
+      after syntax color is applied. */
+   sd->pos = -1;
+}
+
+static void
+win_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                 void *event_info EINA_UNUSED)
+{
+   search_data *sd = g_sd;
+   enventor_item_syntax_color_partial_apply(sd->it, -1);
+   sd->syntax_color--;
+}
+
+static void
+keygrabber_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+                       Evas_Object *obj  EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   search_close();
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+search_open(void)
+{
+   search_data *sd = g_sd;
+
+   if (sd)
+   {
+      elm_win_activate(sd->win);
+      return;
+   }
+
+   goto_close();
+
+   Enventor_Item *it = file_mgr_focused_item_get();
+
+   sd = calloc(1, sizeof(search_data));
+   if (!sd)
+     {
+        mem_fail_msg();
+        return;
+     }
+   g_sd = sd;
+
+   //Win
+   Evas_Object *win = elm_win_add(base_win_get(), _("EDC Editor Search"),
+                                  ELM_WIN_DIALOG_BASIC);
+   elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+   elm_win_title_set(win, _("Find/Replace"));
+   win_w = (Evas_Coord) ((double) win_w * elm_config_scale_get());
+   win_h = (Evas_Coord) ((double) win_h * elm_config_scale_get());
+   evas_object_resize(win, win_w, win_h);
+   evas_object_smart_callback_add(win, "delete,request", win_delete_request_cb,
+                                  sd);
+   evas_object_smart_callback_add(win, "moved", win_moved_cb, sd);
+   evas_object_smart_callback_add(win, "focused", win_focused_cb, sd);
+   evas_object_smart_callback_add(win, "unfocused", win_unfocused_cb, sd);
+
+   //Window icon
+   char buf[PATH_MAX];
+   Evas_Object *icon = evas_object_image_add(evas_object_evas_get(win));
+#ifdef _WIN32
+   snprintf(buf, sizeof(buf), "%s/images/enventor.ico",
+            elm_app_data_dir_get());
+#else
+   snprintf(buf, sizeof(buf), "%s/images/enventor_logo.png",
+            elm_app_data_dir_get());
+#endif
+   evas_object_image_file_set(icon, buf, NULL);
+   elm_win_icon_object_set(win, icon);
+
+   //Bg
+   Evas_Object *bg = elm_bg_add(win);
+   evas_object_show(bg);
+   elm_win_resize_object_add(win, bg);
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(win);
+   elm_layout_file_set(layout, EDJE_PATH, "search_layout");
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(layout);
+   elm_win_resize_object_add(win, layout);
+
+   //Entry (find)
+   Evas_Object *entry_find = elm_entry_add(layout);
+   //Tizen Only
+   elm_entry_context_menu_disabled_set(entry_find, EINA_TRUE);
+   elm_object_style_set(entry_find, "single_line");
+   elm_entry_single_line_set(entry_find, EINA_TRUE);
+   elm_entry_scrollable_set(entry_find, EINA_TRUE);
+   evas_object_smart_callback_add(entry_find, "activated", find_activated_cb,
+                                  sd);
+   evas_object_size_hint_weight_set(entry_find, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(entry_find, EVAS_HINT_FILL, 0);
+   evas_object_show(entry_find);
+   elm_object_focus_set(entry_find, EINA_TRUE);
+   elm_object_part_content_set(layout, "elm.swallow.find_entry", entry_find);
+
+   //Entry (replace)
+   Evas_Object *entry_replace = elm_entry_add(layout);
+   //Tizen Only
+   elm_entry_context_menu_disabled_set(entry_replace, EINA_TRUE);
+   elm_object_style_set(entry_replace, "single_line");
+   elm_entry_single_line_set(entry_replace, EINA_TRUE);
+   elm_entry_scrollable_set(entry_replace, EINA_TRUE);
+   evas_object_smart_callback_add(entry_replace, "activated",
+                                  replace_activated_cb, sd);
+   evas_object_size_hint_weight_set(entry_replace, EVAS_HINT_EXPAND,0);
+   evas_object_size_hint_align_set(entry_replace, EVAS_HINT_FILL, 0);
+   elm_object_part_content_set(layout, "elm.swallow.replace_entry",
+                               entry_replace);
+   //Button (backward)
+   Evas_Object *btn_backward = elm_button_add(layout);
+   elm_object_text_set(btn_backward, _("Previous"));
+   evas_object_smart_callback_add(btn_backward, "clicked",
+                                  backward_clicked_cb, sd);
+   elm_object_part_content_set(layout, "elm.swallow.backward",
+                               btn_backward);
+   //Button (forward)
+   Evas_Object *btn_forward = elm_button_add(layout);
+   elm_object_text_set(btn_forward, _("Next"));
+   evas_object_smart_callback_add(btn_forward, "clicked", forward_clicked_cb,
+                                  sd);
+   elm_object_part_content_set(layout, "elm.swallow.forward", btn_forward);
+
+   //Button (replace)
+   Evas_Object *btn_replace = elm_button_add(layout);
+   elm_object_text_set(btn_replace, _("Replace"));
+   evas_object_smart_callback_add(btn_replace, "clicked",
+                                  replace_clicked_cb, sd);
+   elm_object_part_content_set(layout, "elm.swallow.replace", btn_replace);
+
+   //Button (replace all)
+   Evas_Object *btn_replace_all = elm_button_add(layout);
+   elm_object_text_set(btn_replace_all, _("Replace All"));
+   evas_object_smart_callback_add(btn_replace_all, "clicked",
+                                  replace_all_clicked_cb, sd);
+   elm_object_part_content_set(layout, "elm.swallow.replace_all",
+                               btn_replace_all);
+   evas_object_show(win);
+
+   tools_search_update();
+
+   //Keygrabber
+   Evas_Object *keygrabber =
+      evas_object_rectangle_add(evas_object_evas_get(win));
+   evas_object_event_callback_add(keygrabber, EVAS_CALLBACK_KEY_DOWN,
+                                  keygrabber_key_down_cb, sd);
+   if (!evas_object_key_grab(keygrabber, "Escape", 0, 0, EINA_TRUE))
+     EINA_LOG_ERR(_("Failed to grab key - Escape"));
+
+   sd->win = win;
+   sd->layout = layout;
+   sd->en_find = entry_find;
+   sd->en_replace = entry_replace;
+   sd->pos = -1;
+   sd->forward = EINA_TRUE;
+   sd->it = it;
+}
+
+Eina_Bool
+search_is_opened(void)
+{
+   search_data *sd = g_sd;
+   return (sd ? EINA_TRUE : EINA_FALSE);
+}
+
+Eina_Bool
+search_close(void)
+{
+   search_data *sd = g_sd;
+   if (!sd) return EINA_FALSE;
+
+   syntax_color_context_clear(sd);
+
+   //Save last state
+   evas_object_geometry_get(sd->win, NULL, NULL, &win_w, &win_h);
+   elm_win_screen_position_get(sd->win, &win_x, &win_y);
+   evas_object_del(sd->win);
+   free(sd);
+   g_sd = NULL;
+
+   tools_search_update();
+
+   return EINA_TRUE;
+}
+
+void
+search_reset(void)
+{
+   search_data *sd = g_sd;
+   if (!sd) return;
+
+   syntax_color_context_clear(sd);
+
+   sd->it = file_mgr_focused_item_get();
+   sd->pos = -1;
+   sd->forward = EINA_TRUE;
+   sd->len = 0;
+}
diff --git a/src/bin/setting.c b/src/bin/setting.c
new file mode 100644 (file)
index 0000000..55479b8
--- /dev/null
@@ -0,0 +1,276 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "common.h"
+#include "text_setting.h"
+
+typedef enum {
+   SETTING_VIEW_PREFERENCE = 0,
+   SETTING_VIEW_TEXT,
+   SETTING_VIEW_BUILD,
+   SETTING_VIEW_NONE
+} setting_view;
+
+typedef struct setting_s
+{
+   Evas_Object *layout;
+   Evas_Object *toolbar;
+
+   preference_setting_data *psd;
+   text_setting_data *tsd;
+   build_setting_data *bsd;
+
+   setting_view current_view;
+
+   Evas_Object *apply_btn;
+   Evas_Object *reset_btn;
+   Evas_Object *cancel_btn;
+
+} setting_data;
+
+static setting_data *g_sd = NULL;
+
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+setting_dismiss_done_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                        const char *emission EINA_UNUSED,
+                        const char *source EINA_UNUSED)
+{
+   setting_data *sd = data;
+
+   text_setting_term(sd->tsd);
+   build_setting_term(sd->bsd);
+
+   evas_object_del(sd->layout);
+   sd->layout = NULL;
+   menu_deactivate_request();
+
+   free(sd);
+   g_sd = NULL;
+}
+
+static void
+setting_apply_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                     void *event_info EINA_UNUSED)
+{
+   setting_data *sd = data;
+
+   preference_setting_config_set(sd->psd);
+   build_setting_config_set(sd->bsd);
+   text_setting_config_set(sd->tsd);
+
+   config_apply();
+
+   setting_close();
+}
+
+static void
+setting_cancel_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+   setting_close();
+}
+
+static void
+setting_reset_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+   setting_data *sd = data;
+
+   preference_setting_reset(sd->psd);
+   text_setting_reset(sd->tsd);
+   build_setting_reset(sd->bsd);
+}
+
+static void
+focus_custom_chain_set(setting_data *sd, Evas_Object *content)
+{
+   //Set a custom chain to set the focus order.
+   Eina_List *custom_chain = NULL;
+   custom_chain = eina_list_append(custom_chain, sd->toolbar);
+   custom_chain = eina_list_append(custom_chain, content);
+   custom_chain = eina_list_append(custom_chain, sd->apply_btn);
+   custom_chain = eina_list_append(custom_chain, sd->reset_btn);
+   custom_chain = eina_list_append(custom_chain, sd->cancel_btn);
+   elm_object_focus_custom_chain_set(sd->layout, custom_chain);
+}
+
+static void
+toolbar_preferene_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   setting_data *sd = data;
+
+   if (sd->current_view == SETTING_VIEW_PREFERENCE) return;
+
+   //Hide previous tab view
+   Evas_Object *pcontent = elm_object_part_content_unset(sd->layout,
+                                                        "elm.swallow.content");
+   evas_object_hide(pcontent);
+
+   Evas_Object *content = preference_setting_content_get(sd->psd, obj);
+   elm_object_part_content_set(sd->layout, "elm.swallow.content",
+                               content);
+   focus_custom_chain_set(sd, content);
+   preference_setting_focus_set(sd->psd);
+
+   sd->current_view = SETTING_VIEW_PREFERENCE;
+}
+
+static void
+toolbar_text_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   setting_data *sd = data;
+
+   if (sd->current_view == SETTING_VIEW_TEXT) return;
+
+   if (!sd->tsd) sd->tsd = text_setting_init();
+
+   //Hide previous tab view
+   Evas_Object *pcontent = elm_object_part_content_unset(sd->layout,
+                                                        "elm.swallow.content");
+   evas_object_hide(pcontent);
+
+   Evas_Object *content = text_setting_content_get(sd->tsd, obj);
+   elm_object_part_content_set(sd->layout, "elm.swallow.content",
+                               content);
+   focus_custom_chain_set(sd, content);
+   text_setting_focus_set(sd->tsd);
+
+   sd->current_view = SETTING_VIEW_TEXT;
+}
+
+static void
+toolbar_build_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   setting_data *sd = data;
+
+   if (sd->current_view == SETTING_VIEW_BUILD) return;
+
+   if (!sd->bsd) sd->bsd = build_setting_init();
+
+   //Hide previous tab view
+   Evas_Object *pcontent = elm_object_part_content_unset(sd->layout,
+                                                        "elm.swallow.content");
+   evas_object_hide(pcontent);
+
+   Evas_Object *content = build_setting_content_get(sd->bsd, obj);
+   elm_object_part_content_set(sd->layout, "elm.swallow.content",
+                               content);
+   focus_custom_chain_set(sd, content);
+   build_setting_focus_set(sd->bsd);
+
+   sd->current_view = SETTING_VIEW_BUILD;
+}
+
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+setting_open(void)
+{
+   setting_data *sd = g_sd;
+   if (sd) return;
+
+   sd = calloc(1, sizeof(setting_data));
+   if (!sd)
+     {
+        mem_fail_msg();
+        return;
+     }
+   g_sd = sd;
+
+   search_close();
+   goto_close();
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(base_win_get());
+   elm_layout_file_set(layout, EDJE_PATH, "setting_layout");
+   elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "",
+                                  setting_dismiss_done_cb, sd);
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_layout_text_set(layout, "title_name", _("Settings"));
+   evas_object_show(layout);
+   base_win_resize_object_add(layout);
+
+   //Tabbar
+   Evas_Object *toolbar = elm_toolbar_add(layout);
+   //elm_object_style_set(toolbar, "item_horizontal");
+   elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
+   elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_ALWAYS);
+   evas_object_size_hint_weight_set(toolbar, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   //Tizen Only
+   elm_object_style_set(toolbar, ENVENTOR_NAME);
+   //elm_toolbar_homogeneous_set(toolbar, EINA_FALSE);
+   //elm_toolbar_align_set(toolbar, 0.0);
+
+   elm_toolbar_item_append(toolbar, NULL,  _("Preferences"),
+                           toolbar_preferene_cb, sd);
+   elm_toolbar_item_append(toolbar, NULL, _("Text Editor"), toolbar_text_cb,
+                           sd);
+   elm_toolbar_item_append(toolbar, NULL, _("Resources"), toolbar_build_cb,
+                           sd);
+
+   elm_object_part_content_set(layout, "elm.swallow.toolbar", toolbar);
+   //Tizen Only
+   elm_object_focus_allow_set(toolbar, EINA_FALSE);
+
+   //Preference Content as a default
+   sd->psd = preference_setting_init();
+   Evas_Object *content = preference_setting_content_get(sd->psd, layout);
+   elm_object_part_content_set(layout, "elm.swallow.content", content);
+   preference_setting_focus_set(sd->psd);
+   sd->current_view = SETTING_VIEW_PREFERENCE;
+
+   //Apply Button
+   Evas_Object *apply_btn = elm_button_add(layout);
+   elm_object_text_set(apply_btn, _("Apply"));
+   evas_object_smart_callback_add(apply_btn, "clicked", setting_apply_btn_cb,
+                                  sd);
+   elm_object_part_content_set(layout, "elm.swallow.apply_btn", apply_btn);
+
+   //Reset Button
+   Evas_Object *reset_btn = elm_button_add(layout);
+   elm_object_text_set(reset_btn, _("Reset"));
+   evas_object_smart_callback_add(reset_btn, "clicked", setting_reset_btn_cb,
+                                  sd);
+   elm_object_part_content_set(layout, "elm.swallow.reset_btn", reset_btn);
+
+   //Cancel Button
+   Evas_Object *cancel_btn = elm_button_add(layout);
+   elm_object_text_set(cancel_btn, _("Cancel"));
+   evas_object_smart_callback_add(cancel_btn, "clicked", setting_cancel_btn_cb,
+                                  sd);
+   elm_object_part_content_set(layout, "elm.swallow.cancel_btn", cancel_btn);
+
+   sd->layout = layout;
+   sd->toolbar = toolbar;
+   sd->apply_btn = apply_btn;
+   sd->reset_btn = reset_btn;
+   sd->cancel_btn = cancel_btn;
+
+   menu_activate_request();
+}
+
+void
+setting_close()
+{
+   setting_data *sd = g_sd;
+   EINA_SAFETY_ON_NULL_RETURN(sd);
+   elm_object_signal_emit(sd->layout, "elm,state,dismiss", "");
+}
+
+Eina_Bool
+setting_is_opened(void)
+{
+   setting_data *sd = g_sd;
+   if (!sd) return EINA_FALSE;
+   return EINA_TRUE;
+}
diff --git a/src/bin/statusbar.c b/src/bin/statusbar.c
new file mode 100644 (file)
index 0000000..66fb547
--- /dev/null
@@ -0,0 +1,421 @@
+#include "common.h"
+
+#define VIEW_RESIZE_TYPE_W "W"
+#define VIEW_RESIZE_TYPE_H "H"
+
+typedef struct statusbar_s
+{
+   Evas_Object *layout;
+   Evas_Object *ctxpopup;
+   Eina_Stringshare *group_name;
+   int cur_line;
+   int max_line;
+} stats_data;
+
+typedef struct invert_transit_data_s
+{
+   Evas_Coord orig_w;
+   Evas_Coord orig_h;
+   Evas_Coord diff_w;
+   Evas_Coord diff_h;
+} invert_data;
+
+stats_data *g_sd = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+view_invert_transit_op(void *data, Elm_Transit *transit EINA_UNUSED,
+                       double progress)
+{
+   invert_data *id = data;
+   Evas_Coord w, h;
+   w = id->orig_w + ((double)(id->diff_w)) * progress;
+   h = id->orig_h + ((double)(id->diff_h)) * progress;
+
+   enventor_object_live_view_size_set(base_enventor_get(), w, h);
+
+   //Just in live edit mode case.
+   live_edit_update();
+}
+
+static void
+view_invert_transit_end(void *data, Elm_Transit *transit EINA_UNUSED)
+{
+   invert_data *id = data;
+   enventor_object_live_view_size_set(base_enventor_get(),
+                                      (id->orig_w + id->diff_w),
+                                      (id->orig_h + id->diff_h));
+   free(id);
+}
+
+static void
+view_invert_btn_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                   void *event_info EINA_UNUSED)
+{
+   invert_data *id = malloc(sizeof(invert_data));
+
+   Evas_Coord w, h;
+   enventor_object_live_view_size_get(base_enventor_get(), &w, &h);
+   id->orig_w = w;
+   id->orig_h = h;
+   id->diff_w = h - w;
+   id->diff_h = w - h;
+
+   Elm_Transit *transit = elm_transit_add();
+   elm_transit_object_add(transit, obj);
+   elm_transit_effect_add(transit, view_invert_transit_op, id,
+                          view_invert_transit_end);
+   elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
+   elm_transit_duration_set(transit, TRANSIT_TIME);
+   elm_transit_go(transit);
+}
+
+static void
+view_resize_slider_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                              void *event_info EINA_UNUSED)
+{
+   Evas_Object *layout = data;
+   Eina_Bool horizontal;
+   const char *type = elm_object_part_text_get(layout, "elm.text.type");
+   if (type && !strcmp(type, VIEW_RESIZE_TYPE_W))
+     horizontal = EINA_TRUE;
+   else
+     horizontal = EINA_FALSE;
+
+   Evas_Object *slider = elm_object_part_content_get(layout,
+                                                     "elm.swallow.slider");
+   int val = elm_slider_value_get(slider);
+   int w, h;
+   enventor_object_live_view_size_get(base_enventor_get(), &w, &h);
+   if (horizontal)
+     enventor_object_live_view_size_set(base_enventor_get(), val, h);
+   else
+     enventor_object_live_view_size_set(base_enventor_get(), w, val);
+
+   //Just in live edit mode case.
+   live_edit_update();
+}
+
+static Evas_Object *
+view_resize_slider_layout_create(Evas_Object *parent, const char *type,
+                                 int slider_val)
+{
+   //Layout
+   Evas_Object *layout = elm_layout_add(parent);
+   elm_layout_file_set(layout, EDJE_PATH, "slider_layout");
+   evas_object_show(layout);
+
+   //Type
+   elm_object_part_text_set(layout, "elm.text.type", type);
+
+   //Slider
+   Evas_Object *slider = elm_slider_add(layout);
+   elm_object_focus_allow_set(slider, EINA_FALSE);
+
+   //Tizen Only
+   elm_object_style_set(slider, "pop");
+   elm_slider_span_size_set(slider, 310);
+   //elm_slider_span_size_set(slider, 120);
+
+   elm_slider_indicator_show_set(slider, EINA_FALSE);
+   double step = 1 / (double) (3840 - 1);
+   elm_slider_step_set(slider, step);
+   elm_slider_min_max_set(slider, 1, 3840);
+   elm_slider_value_set(slider, slider_val);
+   evas_object_smart_callback_add(slider, "changed",
+                                  view_resize_slider_changed_cb, layout);
+   elm_object_part_text_set(layout, "elm.text.slider_min", "1");
+   elm_object_part_text_set(layout, "elm.text.slider_max", "3840");
+   elm_object_part_content_set(layout, "elm.swallow.slider", slider);
+
+   return layout;
+}
+
+static void
+view_resize_btn_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   stats_data *sd = data;
+   evas_object_del(sd->ctxpopup);
+
+   //Ctxpopup
+   Evas_Object *ctxpopup = elm_ctxpopup_add(base_layout_get());
+   if (!ctxpopup) return;
+
+   elm_object_style_set(ctxpopup, ENVENTOR_NAME);
+   elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_UP,
+                                       ELM_CTXPOPUP_DIRECTION_RIGHT,
+                                       ELM_CTXPOPUP_DIRECTION_LEFT,
+                                       ELM_CTXPOPUP_DIRECTION_DOWN);
+   //Slider Layout
+   Evas_Object *box = elm_box_add(ctxpopup);
+   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);
+   elm_object_content_set(ctxpopup, box);
+
+   Evas_Object *slider;
+   Evas_Coord w, h;
+   enventor_object_live_view_size_get(base_enventor_get(), &w, &h);
+
+   //Slider 1
+   slider = view_resize_slider_layout_create(box, VIEW_RESIZE_TYPE_W, w);
+   elm_box_pack_end(box, slider);
+
+   //Tizen Only
+   Evas_Object *separator =
+      evas_object_rectangle_add(evas_object_evas_get(box));
+
+   evas_object_size_hint_weight_set(separator, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(separator, EVAS_HINT_FILL, 0);
+   evas_object_size_hint_min_set(separator, 0, ELM_SCALE_SIZE(1));
+   evas_object_size_hint_max_set(separator, -1, ELM_SCALE_SIZE(1));
+   evas_object_color_set(separator, 204, 204, 204, 255);
+   evas_object_show(separator);
+   elm_box_pack_end(box, separator);
+   //
+
+   //Slider 2
+   slider = view_resize_slider_layout_create(box, VIEW_RESIZE_TYPE_H, h);
+   //Tizen Only
+   //elm_object_signal_emit(slider, "odd,item,set", "");
+   elm_box_pack_end(box, slider);
+
+   //Ctxpopup Position
+   Evas_Coord x, y;
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+   evas_object_move(ctxpopup, x + (w/2), y);
+   evas_object_show(ctxpopup);
+
+   sd->ctxpopup = ctxpopup;
+}
+
+static Evas_Object *
+create_statusbar_btn(Evas_Object *layout, const char *image,
+                     const char *part_name, const char *tooltip_msg,
+                     Elm_Tooltip_Orient tooltip_orient,
+                     Evas_Smart_Cb func, void *data)
+{
+   Evas_Object *box = elm_box_add(layout);
+
+   Evas_Object *btn = elm_button_add(box);
+   elm_object_style_set(btn, ENVENTOR_NAME);
+   elm_object_focus_allow_set(btn, EINA_FALSE);
+   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_object_scale_set(btn, 0.5);
+   evas_object_smart_callback_add(btn, "clicked", func, data);
+   evas_object_show(btn);
+
+   //Tizen Only
+   Evas_Object *img = elm_layout_add(btn);
+   elm_layout_file_set(img, EDJE_PATH, image);
+#if 0
+   Evas_Object *img = elm_image_add(btn);
+   elm_image_file_set(img, EDJE_PATH, image);
+#endif
+   elm_object_content_set(btn, img);
+
+   elm_object_tooltip_text_set(box, tooltip_msg);
+   elm_object_tooltip_orient_set(box, tooltip_orient);
+
+   elm_box_pack_end(box, btn);
+   elm_object_part_content_set(layout, part_name, box);
+
+   return btn;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+stats_line_num_update(int cur_line, int max_line)
+{
+   stats_data *sd = g_sd;
+   EINA_SAFETY_ON_NULL_RETURN(sd);
+
+   char buf[20];
+   snprintf(buf, sizeof(buf), "%d", cur_line);
+   elm_object_part_text_set(sd->layout, "elm.text.line_cur", buf);
+   snprintf(buf, sizeof(buf), "%d", max_line);
+   elm_object_part_text_set(sd->layout, "elm.text.line_max", buf);
+
+   sd->cur_line = cur_line;
+   sd->max_line = max_line;
+}
+
+void
+stats_edc_group_update(Eina_Stringshare *group_name)
+{
+   stats_data *sd = g_sd;
+   EINA_SAFETY_ON_NULL_RETURN(sd);
+
+   elm_object_part_text_set(sd->layout, "elm.text.group_name", group_name);
+   sd->group_name = eina_stringshare_add(group_name);
+}
+
+Evas_Object *
+stats_init(Evas_Object *parent)
+{
+   stats_data *sd = calloc(1, sizeof(stats_data));
+   if (!sd)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+   g_sd = sd;
+
+   Evas_Object *layout = elm_layout_add(parent);
+   elm_layout_file_set(layout, EDJE_PATH, "statusbar_layout");
+
+   //Tizen Only
+   //View Scale button
+   //create_statusbar_btn(layout, "expand", "scale_btn",
+   //                     _("View zoom level (Ctrl + Mouse Wheel)<br>"
+   //                       "Zoom the live view in or out."),
+   //                     ELM_TOOLTIP_ORIENT_TOP_RIGHT,
+   //                     view_scale_btn_cb, sd);
+   //View Resize Button
+   create_statusbar_btn(layout, "expand", "resize_btn",
+                        _("Resize the width and height of the live view."),
+                        //Tizen Only
+                        //ELM_TOOLTIP_ORIENT_TOP,
+                        ELM_TOOLTIP_ORIENT_TOP_RIGHT,
+                        //
+                        view_resize_btn_cb, sd);
+   //View Invert Button
+   create_statusbar_btn(layout, "invert", "invert_btn",
+                        _("Swap the width and height of the live view."),
+                        //Tizen Only
+                        //ELM_TOOLTIP_ORIENT_TOP,
+                        ELM_TOOLTIP_ORIENT_TOP_RIGHT,
+                        view_invert_btn_cb, sd);
+
+   //Arrow Tooltip
+   Evas_Object *arrow_tooltip = elm_button_add(layout);
+   elm_object_style_set(arrow_tooltip, ENVENTOR_NAME);
+   elm_object_part_content_set(layout, "elm.swallow.cursor_arrow.tooltip",
+                               arrow_tooltip);
+   elm_object_tooltip_text_set(arrow_tooltip,
+                                _("Mouse cursor position in live view.<br>"
+                                  "Absolute coordinate | Relative coordinate."));
+   elm_object_tooltip_orient_set(arrow_tooltip, ELM_TOOLTIP_ORIENT_TOP);
+   elm_object_focus_allow_set(arrow_tooltip, EINA_FALSE);
+
+   //Group Tooltip
+   Evas_Object *group_tooltip = elm_button_add(layout);
+   elm_object_style_set(group_tooltip, ENVENTOR_NAME);
+   elm_object_part_content_set(layout, "elm.swallow.group_icon.tooltip",
+                               group_tooltip);
+   elm_object_tooltip_text_set(group_tooltip,
+                               _("Name of the current editing group."));
+   elm_object_tooltip_orient_set(group_tooltip, ELM_TOOLTIP_ORIENT_TOP);
+   elm_object_focus_allow_set(group_tooltip, EINA_FALSE);
+
+   //Line Tooltip
+   Evas_Object *line_tooltip = elm_button_add(layout);
+   elm_object_style_set(line_tooltip, ENVENTOR_NAME);
+   elm_object_part_content_set(layout, "elm.swallow.line.tooltip",
+                               line_tooltip);
+   elm_object_tooltip_text_set(line_tooltip,
+                               _("Cursor line number : Max line number"));
+   elm_object_tooltip_orient_set(line_tooltip, ELM_TOOLTIP_ORIENT_TOP_LEFT);
+   elm_object_focus_allow_set(line_tooltip, EINA_FALSE);
+
+   sd->layout = layout;
+
+   stats_cursor_pos_update(0, 0, 0, 0);
+   stats_edc_group_update(NULL);
+   stats_view_scale_update(1.0);
+
+   return layout;
+}
+
+Eina_Stringshare *
+stats_group_name_get(void)
+{
+   stats_data *sd = g_sd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(sd, NULL);
+
+   return sd->group_name;
+}
+
+void
+stats_term(void)
+{
+   stats_data *sd = g_sd;
+   if (!sd) return;
+
+   eina_stringshare_del(sd->group_name);
+   free(sd);
+}
+
+void
+stats_info_msg_update(const char *msg)
+{
+   if (!config_stats_bar_get()) return;
+
+   stats_data *sd = g_sd;
+   EINA_SAFETY_ON_NULL_RETURN(sd);
+
+   elm_object_part_text_set(sd->layout, "elm.text.info_msg", msg);
+   elm_object_signal_emit(sd->layout, "elm,action,info_msg,show", "");
+}
+
+void
+stats_view_scale_update(double scale)
+{
+   stats_data *sd = g_sd;
+   EINA_SAFETY_ON_NULL_RETURN(sd);
+
+   char buf[10];
+   snprintf(buf, sizeof(buf), "%0.2fx", scale);
+   elm_object_part_text_set(sd->layout, "elm.text.scale", buf);
+}
+
+void
+stats_view_size_update(Evas_Coord w, Evas_Coord h)
+{
+   stats_data *sd = g_sd;
+   EINA_SAFETY_ON_NULL_RETURN(sd);
+
+   char buf[10];
+   snprintf(buf, sizeof(buf), "%d", w);
+   elm_object_part_text_set(sd->layout, "elm.text.size_w", buf);
+   snprintf(buf, sizeof(buf), "%d", h);
+   elm_object_part_text_set(sd->layout, "elm.text.size_h", buf);
+}
+
+void
+stats_cursor_pos_update(Evas_Coord x, Evas_Coord y, float rel_x, float rel_y)
+{
+   stats_data *sd = g_sd;
+   EINA_SAFETY_ON_NULL_RETURN(sd);
+
+   char buf[10];
+   snprintf(buf, sizeof(buf), "%d", x);
+   elm_object_part_text_set(sd->layout, "elm.text.cursor_pxx", buf);
+   snprintf(buf, sizeof(buf), "%d", y);
+   elm_object_part_text_set(sd->layout, "elm.text.cursor_pxy", buf);
+
+   snprintf(buf, sizeof(buf), "%0.2f", rel_x);
+   elm_object_part_text_set(sd->layout, "elm.text.cursor_relx", buf);
+   snprintf(buf, sizeof(buf), "%0.2f", rel_y);
+   elm_object_part_text_set(sd->layout, "elm.text.cursor_rely", buf);
+}
+
+Eina_Bool
+stats_ctxpopup_dismiss(void)
+{
+   stats_data *sd = g_sd;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EINA_FALSE);
+
+   if (sd->ctxpopup)
+     {
+        elm_ctxpopup_dismiss(sd->ctxpopup);
+        return EINA_TRUE;
+     }
+   return EINA_FALSE;
+}
diff --git a/src/bin/text_setting.c b/src/bin/text_setting.c
new file mode 100644 (file)
index 0000000..9a9f3dd
--- /dev/null
@@ -0,0 +1,1341 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "common.h"
+
+#define UNSUPPORTED_FONT_CNT 28
+#define UNSUPPORTED_FONT_MAX_LEN 32
+//Tizen Only : Support Tizen version
+//#define COLOR_KEYWORD_MAX_CNT 76   old style
+#define OLD_COLOR_KEYWORD_MAX_CNT 76   //old style
+//
+#define COLOR_KEYWORD_MAX_CNT 66
+#define SYNTAX_TEMPLATE_MAX_LEN 3072
+#define SYNTAX_TEMPLATE_FONT_SIZE 10
+#define SYNTAX_COLOR_LEN 7
+
+typedef struct color_keyword_s
+{
+   int pos_begin;
+   int pos_end;
+   int color_type;
+} color_keyword;
+
+typedef struct text_setting_s
+{
+   Evas_Object *layout;
+   Evas_Object *text_edit_entry;
+   Evas_Object *color_ctxpopup;
+
+   Evas_Object *slider_font;
+   Evas_Object *spinner_font;
+   Evas_Object *list_font_name;
+   Evas_Object *list_font_style;
+
+   color_keyword *color_keyword_list;
+   char *syntax_template_format;
+   char *syntax_template_str;
+
+   const char *font_name;
+   const char *font_style;
+   double font_scale;
+} text_setting_data;
+
+static char unsupported_font_list[UNSUPPORTED_FONT_CNT][UNSUPPORTED_FONT_MAX_LEN] =
+{
+   "Dingbats", "KacstArt", "KacstBook", "KacstDecorative", "KacstDigital",
+   "KacstFarsi", "KacstLetter", "KacstNaskh", "KacstOffice", "KacstPen",
+   "KacstPoster", "KacstQurn", "KacstScreen", "KacstTitle", "KacstTitleL",
+   "LKLUG", "Lohit Bengali", "Lohit Gujarati", "Lohit Punjabi", "Lohit Tamil",
+   "OpenSymbol", "Pothana2000", "Saab", "Standard Symbols L", "Symbol",
+   "Vemana2000", "ori1Uni", "mry_KacstQurn"
+};
+
+static char color_val[ENVENTOR_SYNTAX_COLOR_LAST][SYNTAX_COLOR_LEN] = {{0}};
+
+static int color_type_list[COLOR_KEYWORD_MAX_CNT] =
+{
+   //comment ...  #define ...
+   ENVENTOR_SYNTAX_COLOR_COMMENT,        ENVENTOR_SYNTAX_COLOR_MACRO,
+   //rect { ...
+   ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,   ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_STRING,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //desc { ...
+   ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,   ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_STRING,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //rel1 { ...
+   ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,   ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //relative ...
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //0.0; rel2 ...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,
+   //.relative ...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,
+   //: 1.0 1.0; ...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //color: ...
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //RECT_COLOR; ...
+   ENVENTOR_SYNTAX_COLOR_MACRO,          ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //} } ...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //program { ...
+   ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,   ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   // "mouse_down"; ...
+   ENVENTOR_SYNTAX_COLOR_STRING,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //signal: ...
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   // "mouse,down,1" ...
+   ENVENTOR_SYNTAX_COLOR_STRING,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //source: ...
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //"rect" ...
+   ENVENTOR_SYNTAX_COLOR_STRING,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //action: ...
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //STATE_SET ...
+   ENVENTOR_SYNTAX_COLOR_CONSTANT,       ENVENTOR_SYNTAX_COLOR_STRING,
+   //0.0; target ...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,
+   //: "rect" ...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_STRING,
+   //"; } ...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //script { ...
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //public flag = ...
+   ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //0; public ...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD,
+   //func() { if ...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD,
+   //(!get_int ...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC,
+   //(flag))...
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //set_int(...
+   ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //flag, 1);... 
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   //} }
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL
+};
+
+
+/* old style */
+//Tizen Only : Support Tizen version
+//#if 0
+static int old_color_type_list[OLD_COLOR_KEYWORD_MAX_CNT] =
+{
+   ENVENTOR_SYNTAX_COLOR_COMMENT,        ENVENTOR_SYNTAX_COLOR_MACRO,
+   ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,   ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_STRING,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_CONSTANT,       ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,   ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_STRING,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,   ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_MACRO,          ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,   ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_STRING,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_STRING,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_STRING,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_CONSTANT,       ENVENTOR_SYNTAX_COLOR_STRING,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_STRING,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC,    ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,         ENVENTOR_SYNTAX_COLOR_SYMBOL
+};
+//#endif
+//
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+syntax_template_set(char *syntax_template_str, char *syntax_template_format,
+                    double font_scale)
+{
+   if (!syntax_template_str || !syntax_template_format) return;
+
+   //Tizen Only : Support Tizen version
+   const char *tizen_version =
+      enventor_object_tizen_version_get(base_enventor_get());
+
+   //Tizen Only : Support old style for Tizen version 2.x
+   if (tizen_version && !strncmp(tizen_version, "2.", strlen("2.")))
+     /* old style */
+//#if 0
+     snprintf(syntax_template_str, SYNTAX_TEMPLATE_MAX_LEN,
+              syntax_template_format,
+              (int) ((SYNTAX_TEMPLATE_FONT_SIZE * font_scale) + 0.5),
+              color_val[old_color_type_list[0]],  color_val[old_color_type_list[1]],
+              color_val[old_color_type_list[2]],  color_val[old_color_type_list[3]],
+              color_val[old_color_type_list[4]],  color_val[old_color_type_list[5]],
+              color_val[old_color_type_list[6]],  color_val[old_color_type_list[7]],
+              color_val[old_color_type_list[8]],  color_val[old_color_type_list[9]],
+              color_val[old_color_type_list[10]], color_val[old_color_type_list[11]],
+              color_val[old_color_type_list[12]], color_val[old_color_type_list[13]],
+              color_val[old_color_type_list[14]], color_val[old_color_type_list[15]],
+              color_val[old_color_type_list[16]], color_val[old_color_type_list[17]],
+              color_val[old_color_type_list[18]], color_val[old_color_type_list[19]],
+              color_val[old_color_type_list[20]], color_val[old_color_type_list[21]],
+              color_val[old_color_type_list[22]], color_val[old_color_type_list[23]],
+              color_val[old_color_type_list[24]], color_val[old_color_type_list[25]],
+              color_val[old_color_type_list[26]], color_val[old_color_type_list[27]],
+              color_val[old_color_type_list[28]], color_val[old_color_type_list[29]],
+              color_val[old_color_type_list[30]], color_val[old_color_type_list[31]],
+              color_val[old_color_type_list[32]], color_val[old_color_type_list[33]],
+              color_val[old_color_type_list[34]], color_val[old_color_type_list[35]],
+              color_val[old_color_type_list[36]], color_val[old_color_type_list[37]],
+              color_val[old_color_type_list[38]], color_val[old_color_type_list[39]],
+              color_val[old_color_type_list[40]], color_val[old_color_type_list[41]],
+              color_val[old_color_type_list[42]], color_val[old_color_type_list[43]],
+              color_val[old_color_type_list[44]], color_val[old_color_type_list[45]],
+              color_val[old_color_type_list[46]], color_val[old_color_type_list[47]],
+              color_val[old_color_type_list[48]], color_val[old_color_type_list[49]],
+              color_val[old_color_type_list[50]], color_val[old_color_type_list[51]],
+              color_val[old_color_type_list[52]], color_val[old_color_type_list[53]],
+              color_val[old_color_type_list[54]], color_val[old_color_type_list[55]],
+              color_val[old_color_type_list[56]], color_val[old_color_type_list[57]],
+              color_val[old_color_type_list[58]], color_val[old_color_type_list[59]],
+              color_val[old_color_type_list[60]], color_val[old_color_type_list[61]],
+              color_val[old_color_type_list[62]], color_val[old_color_type_list[63]],
+              color_val[old_color_type_list[64]], color_val[old_color_type_list[65]],
+              color_val[old_color_type_list[66]], color_val[old_color_type_list[67]],
+              color_val[old_color_type_list[68]], color_val[old_color_type_list[69]],
+              color_val[old_color_type_list[70]], color_val[old_color_type_list[71]],
+              color_val[old_color_type_list[72]], color_val[old_color_type_list[73]],
+              color_val[old_color_type_list[74]], color_val[old_color_type_list[75]]);
+//#endif
+   //Tizen Only : Support lazy style since Tizen version 3.0
+   else
+     snprintf(syntax_template_str, SYNTAX_TEMPLATE_MAX_LEN,
+              syntax_template_format,
+              (int) ((SYNTAX_TEMPLATE_FONT_SIZE * font_scale) + 0.5),
+              color_val[color_type_list[0]],  color_val[color_type_list[1]],
+              color_val[color_type_list[2]],  color_val[color_type_list[3]],
+              color_val[color_type_list[4]],  color_val[color_type_list[5]],
+              color_val[color_type_list[6]],  color_val[color_type_list[7]],
+              color_val[color_type_list[8]],  color_val[color_type_list[9]],
+              color_val[color_type_list[10]], color_val[color_type_list[11]],
+              color_val[color_type_list[12]], color_val[color_type_list[13]],
+              color_val[color_type_list[14]], color_val[color_type_list[15]],
+              color_val[color_type_list[16]], color_val[color_type_list[17]],
+              color_val[color_type_list[18]], color_val[color_type_list[19]],
+              color_val[color_type_list[20]], color_val[color_type_list[21]],
+              color_val[color_type_list[22]], color_val[color_type_list[23]],
+              color_val[color_type_list[24]], color_val[color_type_list[25]],
+              color_val[color_type_list[26]], color_val[color_type_list[27]],
+              color_val[color_type_list[28]], color_val[color_type_list[29]],
+              color_val[color_type_list[30]], color_val[color_type_list[31]],
+              color_val[color_type_list[32]], color_val[color_type_list[33]],
+              color_val[color_type_list[34]], color_val[color_type_list[35]],
+              color_val[color_type_list[36]], color_val[color_type_list[37]],
+              color_val[color_type_list[38]], color_val[color_type_list[39]],
+              color_val[color_type_list[40]], color_val[color_type_list[41]],
+              color_val[color_type_list[42]], color_val[color_type_list[43]],
+              color_val[color_type_list[44]], color_val[color_type_list[45]],
+              color_val[color_type_list[46]], color_val[color_type_list[47]],
+              color_val[color_type_list[48]], color_val[color_type_list[49]],
+              color_val[color_type_list[50]], color_val[color_type_list[51]],
+              color_val[color_type_list[52]], color_val[color_type_list[53]],
+              color_val[color_type_list[54]], color_val[color_type_list[55]],
+              color_val[color_type_list[56]], color_val[color_type_list[57]],
+              color_val[color_type_list[58]], color_val[color_type_list[59]],
+              color_val[color_type_list[60]], color_val[color_type_list[61]],
+              color_val[color_type_list[62]], color_val[color_type_list[63]],
+              color_val[color_type_list[64]], color_val[color_type_list[65]]);
+   //
+}
+
+static void
+syntax_template_apply(text_setting_data *tsd)
+{
+   Evas_Object *layout = tsd->layout;
+   if (!layout) return;
+
+   Evas_Object *entry = elm_object_part_content_get(layout,
+                                                    "elm.swallow.text_setting");
+   syntax_template_set(tsd->syntax_template_str, tsd->syntax_template_format,
+                       tsd->font_scale);
+   elm_entry_entry_set(entry, tsd->syntax_template_str);
+}
+
+static void
+text_setting_syntax_color_load(void)
+{
+   const char *color;
+   Enventor_Syntax_Color_Type color_type = ENVENTOR_SYNTAX_COLOR_STRING;
+   for (; color_type < ENVENTOR_SYNTAX_COLOR_LAST; color_type++)
+     {
+        color = config_syntax_color_get(color_type);
+        if (color) strncpy(color_val[color_type], color, 6);
+        else strncpy(color_val[color_type], "FFFFFF", 6);
+     }
+}
+
+static void
+text_setting_syntax_color_reset(text_setting_data *tsd)
+{
+   text_setting_syntax_color_load();
+   syntax_template_apply(tsd);
+}
+
+static void
+text_setting_syntax_color_save(void)
+{
+   Enventor_Syntax_Color_Type color_type = ENVENTOR_SYNTAX_COLOR_STRING;
+   for (; color_type < ENVENTOR_SYNTAX_COLOR_LAST; color_type++)
+     {
+        config_syntax_color_set(color_type, color_val[color_type]);
+     }
+}
+
+static void
+text_setting_syntax_color_update(Evas_Object *ctxpopup,
+                                 color_keyword *selected_color_keyword)
+{
+   Evas_Object *box = elm_object_content_get(ctxpopup);
+   Evas_Object *layout;
+   Evas_Object *slider;
+   Eina_List *box_children = elm_box_children_get(box);
+   Eina_List *l;
+   char color[SYNTAX_COLOR_LEN] = {0};
+   char buf[3];
+
+   if (eina_list_count(box_children) == 0) return;
+
+   //Extract color value from sliders
+   EINA_LIST_FOREACH(box_children, l, layout)
+     {
+        slider = elm_object_part_content_get(layout,
+                                             "elm.swallow.slider");
+        snprintf(buf, sizeof(buf), "%02X",
+                 (int) roundf(elm_slider_value_get(slider)));
+        strncat(color, buf, strlen(buf));
+     }
+   color[SYNTAX_COLOR_LEN - 1] = '\0';
+
+   //Set the extracted color value to the selected color keyword
+   strncpy(color_val[selected_color_keyword->color_type], color, 7);
+}
+
+static void
+color_ctxpopup_dismiss_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                          void *event_info EINA_UNUSED)
+{
+   evas_object_del(obj);
+}
+
+static void
+color_ctxpopup_del_cb(void *data, Evas *e EINA_UNUSED,
+                      Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   text_setting_data *tsd = data;
+   color_keyword *selected_color_keyword;
+   selected_color_keyword = evas_object_data_get(obj, "color_keyword");
+
+   elm_object_disabled_set(tsd->layout, EINA_FALSE);
+   elm_object_focus_set(tsd->slider_font, EINA_TRUE);
+
+   text_setting_syntax_color_update(obj, selected_color_keyword);
+   syntax_template_apply(tsd);
+
+   elm_config_focus_autoscroll_mode_set(ELM_FOCUS_AUTOSCROLL_MODE_SHOW);
+
+   tsd->color_ctxpopup = NULL;
+}
+
+static void
+color_slider_changed_cb(void *data, Evas_Object *obj,
+                        void *event_info EINA_UNUSED)
+{
+   text_setting_data *tsd = data;
+
+   Evas_Object *ctxpopup = evas_object_data_get(obj, "ctxpopup");
+   color_keyword *selected_color_keyword;
+   selected_color_keyword = evas_object_data_get(ctxpopup, "color_keyword");
+
+   text_setting_syntax_color_update(ctxpopup, selected_color_keyword);
+   syntax_template_apply(tsd);
+}
+
+static Evas_Object *
+color_slider_layout_create(text_setting_data *tsd, Evas_Object *parent,
+                           Evas_Object *ctxpopup, const char *type,
+                           double slider_val)
+{
+   //Layout
+   Evas_Object *layout = elm_layout_add(parent);
+   elm_layout_file_set(layout, EDJE_PATH, "slider_layout");
+   evas_object_show(layout);
+
+   //Type
+   if (type)
+     elm_object_part_text_set(layout, "elm.text.type", type);
+
+   //Slider
+   Evas_Object *slider = elm_slider_add(layout);
+   evas_object_data_set(slider, "ctxpopup", ctxpopup);
+   elm_slider_span_size_set(slider, 120);
+   elm_slider_indicator_show_set(slider, EINA_FALSE);
+   elm_slider_min_max_set(slider, 0, 255);
+   elm_slider_value_set(slider, slider_val);
+
+   char slider_min[16];
+   char slider_max[16];
+   snprintf(slider_min, sizeof(slider_min), "%1.0f", 0.0);
+   snprintf(slider_max, sizeof(slider_max), "%1.0f", 255.0);
+   elm_object_part_text_set(layout, "elm.text.slider_min", slider_min);
+   elm_object_part_text_set(layout, "elm.text.slider_max", slider_max);
+   elm_object_part_content_set(layout, "elm.swallow.slider", slider);
+   evas_object_smart_callback_add(slider, "changed", color_slider_changed_cb,
+                                  tsd);
+   return layout;
+}
+
+static int
+convert_hexadecimal_to_decimal(char *hexadecimal)
+{
+   int i;
+   int len;
+   int decimal = 0;
+   char digit;
+
+   if (!hexadecimal) return 0;
+
+   len = strlen(hexadecimal);
+   if (len == 0) return 0;
+
+   for (i = 0; i < len; i++)
+     {
+        digit = hexadecimal[i];
+
+        if ((digit >= 'a') && (digit <= 'f'))
+          decimal += ((digit - 'a') + 10) * pow(16, (len - i - 1));
+        else if ((digit >= 'A') && (digit <= 'F'))
+          decimal += ((digit - 'A') + 10) * pow(16, (len - i - 1));
+        else if ((digit >= '0') && (digit <= '9'))
+          decimal += atoi(&digit) * pow(16, (len - i - 1));
+     }
+   return decimal;
+}
+
+static void
+color_slider_layout_set(text_setting_data *tsd, Evas_Object *ctxpopup)
+{
+   Eina_Array *type_array;
+   Eina_Stringshare *type = NULL;
+   Eina_Array_Iterator itr;
+   unsigned int i;
+   const char *color;
+   char color_rgb_str[3][3] = {{0}};
+   int color_rgb_val[3] = {0};
+   color_keyword *selected_color_keyword;
+   selected_color_keyword = evas_object_data_get(ctxpopup, "color_keyword");
+
+   //Box
+   Evas_Object *box = elm_box_add(ctxpopup);
+   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);
+
+   //Layout
+   Evas_Object *layout;
+
+   type_array = eina_array_new(3);
+   eina_array_push(type_array, eina_stringshare_add("R"));
+   eina_array_push(type_array, eina_stringshare_add("G"));
+   eina_array_push(type_array, eina_stringshare_add("B"));
+
+   color = config_syntax_color_get(selected_color_keyword->color_type);
+
+   for (i = 0; i < 3; i++)
+     {
+        strncpy(color_rgb_str[i], &color[i * 2], 2);
+        color_rgb_val[i] = convert_hexadecimal_to_decimal(color_rgb_str[i]);
+     }
+
+   EINA_ARRAY_ITER_NEXT(type_array, i, type, itr)
+     {
+        //Tizen Only
+        if (i > 0)
+          {
+             Evas_Object *separator =
+                evas_object_rectangle_add(evas_object_evas_get(box));
+
+             evas_object_size_hint_weight_set(separator, EVAS_HINT_EXPAND, 0);
+             evas_object_size_hint_align_set(separator, EVAS_HINT_FILL, 0);
+             evas_object_size_hint_min_set(separator, 0, ELM_SCALE_SIZE(1));
+             evas_object_size_hint_max_set(separator, -1, ELM_SCALE_SIZE(1));
+             evas_object_color_set(separator, 204, 204, 204, 255);
+             evas_object_show(separator);
+             elm_box_pack_end(box, separator);
+          }
+        //
+        layout = color_slider_layout_create(tsd, box, ctxpopup, type,
+                                            color_rgb_val[i]);
+        //Tizen Only
+        //if (i % 2) elm_object_signal_emit(layout, "odd,item,set", "");
+        elm_box_pack_end(box, layout);
+     }
+
+   while (eina_array_count(type_array))
+     eina_stringshare_del(eina_array_pop(type_array));
+   eina_array_free(type_array);
+
+   elm_object_content_set(ctxpopup, box);
+}
+
+static Evas_Object *
+color_ctxpopup_create(text_setting_data *tsd,
+                      color_keyword *selected_color_keyword)
+{
+   Evas_Object *ctxpopup = elm_ctxpopup_add(tsd->layout);
+   if (!ctxpopup) return NULL;
+
+   elm_config_focus_autoscroll_mode_set(ELM_FOCUS_AUTOSCROLL_MODE_NONE);
+
+   elm_object_style_set(ctxpopup, ENVENTOR_NAME);
+   evas_object_data_set(ctxpopup, "color_keyword", selected_color_keyword);
+   elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_RIGHT,
+                                       ELM_CTXPOPUP_DIRECTION_LEFT,
+                                       ELM_CTXPOPUP_DIRECTION_UP,
+                                       ELM_CTXPOPUP_DIRECTION_DOWN);
+   color_slider_layout_set(tsd, ctxpopup);
+
+   evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL,
+                                  color_ctxpopup_del_cb, tsd);
+   evas_object_smart_callback_add(ctxpopup, "dismissed",
+                                  color_ctxpopup_dismiss_cb, NULL);
+   return ctxpopup;
+}
+
+static color_keyword *
+color_keyword_list_create(char *syntax_template_str)
+{
+   char *cur = syntax_template_str;
+   char *next = NULL;
+   int i;
+
+   //Tizen Only : Support Tizen version
+   //color_keyword *color_keyword_list = calloc(COLOR_KEYWORD_MAX_CNT,
+   //                                           sizeof(color_keyword));
+   const char *tizen_version =
+      enventor_object_tizen_version_get(base_enventor_get());
+   int color_keyword_max_cnt;
+
+   //Tizen Only : Support old style for Tizen version 2.x
+   if (tizen_version && !strncmp(tizen_version, "2.", strlen("2.")))
+     color_keyword_max_cnt = OLD_COLOR_KEYWORD_MAX_CNT;
+   //Tizen Only : Support lazy style since Tizen version 3.0
+   else
+     color_keyword_max_cnt = COLOR_KEYWORD_MAX_CNT;
+
+   color_keyword *color_keyword_list = calloc(color_keyword_max_cnt,
+                                              sizeof(color_keyword));
+   //
+   if (!color_keyword_list)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+
+   //Tizen Only : Support Tizen version
+   //for (i = 0; i < COLOR_KEYWORD_MAX_CNT; i++)
+   for (i = 0; i < color_keyword_max_cnt; i++)
+   //
+     {
+        next = strstr(cur, "<color=#");
+        cur = next + 15; //Move position to first character of keyword
+        (color_keyword_list + i)->pos_begin = cur - syntax_template_str;
+
+        next = strstr(cur, "</color>");
+        cur = next - 1; //Move position to last character of keyword
+        (color_keyword_list + i)->pos_end = cur - syntax_template_str;
+
+        (color_keyword_list + i)->color_type = color_type_list[i];
+     }
+
+   return color_keyword_list;
+}
+
+static char *
+syntax_template_format_create(text_setting_data *tsd)
+{
+   text_setting_syntax_color_load();
+
+   char file_path[PATH_MAX];
+   //Tizen Only : Support Tizen version
+   //snprintf(file_path, sizeof(file_path), "%s/color/syntax_template.dat",
+   //         elm_app_data_dir_get());
+   const char *tizen_version =
+      enventor_object_tizen_version_get(base_enventor_get());
+
+   //Tizen Only : Support old style for Tizen version 2.x
+   if (tizen_version && !strncmp(tizen_version, "2.", strlen("2.")))
+     snprintf(file_path, sizeof(file_path), "%s/color/syntax_template_old.dat",
+              elm_app_data_dir_get());
+   //Tizen Only : Support lazy style since Tizen version 3.0
+   else
+     snprintf(file_path, sizeof(file_path), "%s/color/syntax_template.dat",
+              elm_app_data_dir_get());
+   //
+
+   Eina_File *file = NULL;
+   file = eina_file_open(file_path, EINA_FALSE);
+   if (!file)
+     {
+        EINA_LOG_ERR(_("Failed to open file \"%s\""), file_path);
+        return NULL;
+     }
+
+   char *utf8 = eina_file_map_all(file, EINA_FILE_POPULATE);
+   if (!utf8) goto err;
+
+   char *syntax_template_format = calloc(1, sizeof(char) * (strlen(utf8) + 1));
+   if (!syntax_template_format) goto err;
+   strncpy(syntax_template_format, utf8, strlen(utf8) + 1);
+
+   tsd->syntax_template_format = syntax_template_format;
+
+   eina_file_close(file);
+
+   return tsd->syntax_template_format;
+
+err:
+   mem_fail_msg();
+   if (utf8) free(utf8);
+
+   eina_file_close(file);
+
+   return NULL;
+}
+
+static char *
+syntax_template_create(text_setting_data *tsd)
+{
+   char *syntax_template_str = NULL;
+   char *syntax_template_format = syntax_template_format_create(tsd);
+   if (!syntax_template_format) goto err;
+
+   syntax_template_str = calloc(1, sizeof(char) * SYNTAX_TEMPLATE_MAX_LEN);
+   if (!syntax_template_str) goto err;
+
+   syntax_template_set(syntax_template_str, syntax_template_format,
+                       tsd->font_scale);
+
+   color_keyword *color_keyword_list;
+   color_keyword_list = color_keyword_list_create(syntax_template_str);
+   if (!color_keyword_list) goto err;
+
+   tsd->syntax_template_str = syntax_template_str;
+   tsd->color_keyword_list = color_keyword_list;
+
+   return tsd->syntax_template_str;
+
+err:
+   mem_fail_msg();
+
+   if (syntax_template_format)
+     {
+        free(syntax_template_format);
+        tsd->syntax_template_format = NULL;
+     }
+   if (syntax_template_str) free(syntax_template_str);
+
+   return NULL;
+}
+
+static int
+color_keyword_pos_get(const char *syntax_template_str, const char *selected_str)
+{
+   Eina_Bool left_arrow_found = EINA_FALSE;
+   char *cur;
+   int i;
+   int len = 0;
+   int pos = 0;
+
+   cur = strstr(syntax_template_str, selected_str);
+   //Tizen Only
+   if (!cur) return -1;
+   len = strlen(cur);
+   for (i = 0; i < len; i++)
+     {
+        if (left_arrow_found)
+          {
+             if (*(cur + i) == '>')
+               left_arrow_found = EINA_FALSE;
+             continue;
+          }
+
+        if (*(cur + i) == '<')
+          {
+             left_arrow_found = EINA_TRUE;
+          }
+        else
+          {
+             pos = (cur + i) - syntax_template_str;
+             break;
+          }
+     }
+
+   return pos;
+}
+
+static void
+text_setting_double_clicked_cb(void *data, Evas_Object *obj,
+                               void *event_info EINA_UNUSED)
+{
+   text_setting_data *tsd = data;
+   color_keyword *selected_color_keyword;
+   Evas_Object *ctxpopup;
+   const char *syntax_template_str;
+   const char *selected_str;
+   int i;
+   int pos;
+   int x, y;
+
+   syntax_template_str = elm_entry_entry_get(obj);
+   if (!syntax_template_str) return;
+
+   selected_str = elm_entry_selection_get(obj);
+   if (!selected_str) return;
+
+   pos = color_keyword_pos_get(syntax_template_str, selected_str);
+
+   //Tizen Only : Support Tizen version
+   const char *tizen_version =
+      enventor_object_tizen_version_get(base_enventor_get());
+   int color_keyword_max_cnt;
+
+   //Tizen Only : Support old style for Tizen version 2.x
+   if (tizen_version && !strncmp(tizen_version, "2.", strlen("2.")))
+     color_keyword_max_cnt = OLD_COLOR_KEYWORD_MAX_CNT;
+   //Tizen Only : Support lazy style since Tizen version 3.0
+   else
+     color_keyword_max_cnt = COLOR_KEYWORD_MAX_CNT;
+
+   //for (i = 0; i < COLOR_KEYWORD_MAX_CNT; i++)
+   for (i = 0; i < color_keyword_max_cnt; i++)
+   //
+     {
+        selected_color_keyword = tsd->color_keyword_list + i;
+        if ((pos >= selected_color_keyword->pos_begin) &&
+            (pos <= selected_color_keyword->pos_end))
+          {
+             ctxpopup = color_ctxpopup_create(tsd, selected_color_keyword);
+             if (!ctxpopup) return;
+
+             evas_pointer_output_xy_get(evas_object_evas_get(obj), &x, &y);
+             evas_object_move(ctxpopup, x, y);
+             evas_object_show(ctxpopup);
+             tsd->color_ctxpopup = ctxpopup;
+             break;
+          }
+     }
+}
+
+static Evas_Object *
+label_create(Evas_Object *parent, const char *text)
+{
+   Evas_Object *label = elm_label_add(parent);
+   elm_object_text_set(label, text);
+   evas_object_show(label);
+
+   return label;
+}
+
+static Evas_Object *
+list_create(Evas_Object *parent)
+{
+   Evas_Object *list = elm_list_add(parent);
+   //Tizen Only
+   elm_object_focus_highlight_style_set(list, "blank");
+   //
+   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);
+
+   return list;
+}
+
+static void
+font_scale_slider_changed_cb(void *data, Evas_Object *obj,
+                             void *event_info EINA_UNUSED)
+{
+   text_setting_data *tsd = data;
+   double val = elm_slider_value_get(obj);
+   tsd->font_scale = val;
+
+   syntax_template_apply(tsd);
+   //Tizen Only
+   elm_spinner_value_set(tsd->spinner_font, val * 100);
+   //elm_spinner_value_set(tsd->spinner_font, val);
+}
+
+static void
+font_scale_spinner_changed_cb(void *data, Evas_Object *obj,
+                              void *event_info EINA_UNUSED)
+{
+   text_setting_data *tsd = data;
+   double val = elm_spinner_value_get(obj);
+   //Tizen Only
+   tsd->font_scale = val * 0.01;
+   //tsd->font_scale = val;
+
+   syntax_template_apply(tsd);
+   //Tizen Only
+   elm_slider_value_set(tsd->slider_font, val * 0.01);
+   //elm_slider_value_set(tsd->slider_font, val);
+}
+
+//Tizen Only
+static void
+font_scale_button_dec_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   text_setting_data *tsd = data;
+   tsd->font_scale -= 0.5;
+   if (tsd->font_scale < 0.5) tsd->font_scale = 0.5;
+   syntax_template_apply(tsd);
+
+   elm_slider_value_set(tsd->slider_font, tsd->font_scale);
+   elm_spinner_value_set(tsd->spinner_font, tsd->font_scale * 100);
+}
+
+//Tizen Only
+static void
+font_scale_button_inc_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   text_setting_data *tsd = data;
+   tsd->font_scale += 0.5;
+   if (tsd->font_scale > 5) tsd->font_scale = 5;
+   syntax_template_apply(tsd);
+
+   elm_slider_value_set(tsd->slider_font, tsd->font_scale);
+   elm_spinner_value_set(tsd->spinner_font, tsd->font_scale * 100);
+}
+
+static void
+text_setting_font_apply(text_setting_data *tsd)
+{
+   char text_class_name[32];
+   snprintf(text_class_name, sizeof(text_class_name), "%s_setting_entry",
+            "enventor");
+
+   char *font = NULL;
+   if (tsd->font_name)
+     font = elm_font_fontconfig_name_get(tsd->font_name, tsd->font_style);
+   edje_text_class_set(text_class_name, font, -100);
+   elm_font_fontconfig_name_free(font);
+
+   elm_entry_calc_force(tsd->text_edit_entry);
+}
+
+static int
+font_cmp_cb(const void *data1,
+            const void *data2)
+{
+   if (!data1) return 1;
+   if (!data2) return -1;
+   return strcmp(data1, data2);
+}
+
+static void
+font_style_selected_cb(void *data, Evas_Object *obj,
+                       void *event_info EINA_UNUSED)
+{
+   text_setting_data *tsd = data;
+   Elm_Object_Item *font_style_it = elm_list_selected_item_get(obj);
+   const char *font_style = elm_object_item_text_get(font_style_it);
+
+   eina_stringshare_replace(&tsd->font_style, font_style);
+   text_setting_font_apply(tsd);
+}
+
+static void
+font_name_selected_cb(void *data, Evas_Object *obj,
+                      void *event_info EINA_UNUSED)
+{
+   text_setting_data *tsd = data;
+   Elm_Object_Item *font_name_it = elm_list_selected_item_get(obj);
+   Elm_Object_Item *font_style_it = NULL;
+   const char *sel_font_name = elm_object_item_text_get(font_name_it);
+   const char *font_name = NULL;
+   const char *font_style = NULL;
+
+   config_font_get(&font_name, &font_style);
+
+   //Initialize font style
+   elm_list_clear(tsd->list_font_style);
+   eina_stringshare_del(tsd->font_style);
+   tsd->font_style = NULL;
+
+   //Append Items of Font Style List
+   Elm_Font_Properties *efp;
+   Eina_List *font_list;
+   Eina_List *l, *ll;
+   char *font, *style;
+   font_list = evas_font_available_list(evas_object_evas_get(obj));
+   font_list = eina_list_sort(font_list, eina_list_count(font_list),
+                              font_cmp_cb);
+   EINA_LIST_FOREACH(font_list, l, font)
+     {
+        efp = elm_font_properties_get(font);
+        if (efp)
+          {
+             if (!strcmp(sel_font_name, efp->name))
+               {
+                  EINA_LIST_FOREACH(efp->styles, ll, style)
+                    {
+                       Elm_Object_Item *it
+                          = elm_list_item_append(tsd->list_font_style, style,
+                                                 NULL,
+                                                 NULL, font_style_selected_cb,
+                                                 tsd);
+
+                       if (font_name && !strcmp(font_name, efp->name) &&
+                           font_style && !strcmp(font_style, style))
+                         font_style_it = it;
+                    }
+               }
+             elm_font_properties_free(efp);
+          }
+     }
+   elm_list_go(tsd->list_font_style);
+
+   if (!font_style_it)
+     font_style_it = elm_list_first_item_get(tsd->list_font_style);
+   elm_list_item_selected_set(font_style_it, EINA_TRUE);
+
+   eina_stringshare_replace(&tsd->font_name, sel_font_name);
+   text_setting_font_apply(tsd);
+}
+
+static Eina_Bool
+is_supported_font(const char *font_name)
+{
+   if (!font_name) return EINA_FALSE;
+
+   int i;
+   for (i = 0; i < UNSUPPORTED_FONT_CNT; i++)
+     {
+        if (!strcmp(font_name, unsupported_font_list[i]))
+          return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+static void
+text_setting_font_set(text_setting_data *tsd, const char *font_name,
+                      const char *font_style)
+{
+   eina_stringshare_replace(&tsd->font_name, font_name);
+   eina_stringshare_replace(&tsd->font_style, font_style);
+
+   if (!tsd->list_font_name) return;
+
+   //Reset font name
+   if (font_name)
+     {
+        const Eina_List *it_list = elm_list_items_get(tsd->list_font_name);
+        const Eina_List *l;
+        Elm_Object_Item *it;
+
+        EINA_LIST_FOREACH(it_list, l, it)
+          {
+             const char *name = elm_object_item_text_get(it);
+             if (!strcmp(font_name, name))
+               {
+                  elm_list_item_selected_set(it, EINA_TRUE);
+                  break;
+               }
+          }
+     }
+
+   //Reset font style
+   if (font_style)
+     {
+        const Eina_List *it_list = elm_list_items_get(tsd->list_font_style);
+        const Eina_List *l;
+        Elm_Object_Item *it;
+
+        EINA_LIST_FOREACH(it_list, l, it)
+          {
+             const char *name = elm_object_item_text_get(it);
+             if (!strcmp(font_style, name))
+               {
+                  elm_list_item_selected_set(it, EINA_TRUE);
+                  break;
+               }
+          }
+     }
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+Evas_Object *
+text_setting_content_get(text_setting_data *tsd, Evas_Object *parent)
+{
+   if (!tsd) return NULL;
+   if (tsd->layout) return tsd->layout;
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(parent);
+   elm_layout_file_set(layout, EDJE_PATH, "text_setting_layout");
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(layout);
+
+   //Text Editor
+   Evas_Object *entry = elm_entry_add(layout);
+   char style_name[128];
+   snprintf(style_name, sizeof(style_name), "%s_setting", "enventor");
+   elm_object_style_set(entry, style_name);
+   elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
+   elm_entry_line_wrap_set(entry, ELM_WRAP_NONE);
+   elm_entry_scrollable_set(entry, EINA_TRUE);
+   elm_entry_editable_set(entry, EINA_FALSE);
+   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_layout_text_set(layout, "text_setting_guide", _("Double click a keyword to change its color :"));
+
+   //Font Scale Information
+   tsd->font_scale = (double) config_font_scale_get();
+   char *syntax_template_str = syntax_template_create(tsd);
+   elm_entry_entry_set(entry, syntax_template_str);
+   evas_object_smart_callback_add(entry, "clicked,double",
+                                  text_setting_double_clicked_cb, tsd);
+   elm_object_focus_set(entry, EINA_TRUE);
+   elm_object_part_content_set(layout, "elm.swallow.text_setting", entry);
+
+   //Box
+   Evas_Object *box = elm_box_add(layout);
+   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
+   evas_object_show(box);
+
+   elm_object_part_content_set(layout, "elm.swallow.font_size", box);
+
+   //Font Size (Box)
+   Evas_Object *box2 = elm_box_add(box);
+   elm_box_horizontal_set(box2, EINA_TRUE);
+   evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, 0);
+   evas_object_show(box2);
+
+   elm_box_pack_end(box, box2);
+
+   //Tizen Only
+   //decrease button (spinner_font)
+   Evas_Object *button_dec = elm_button_add(box2);
+   //Tizen Only
+   elm_object_style_set(button_dec, "decrease/enventor");
+   //elm_object_text_set(button_dec, "-");
+   evas_object_size_hint_weight_set(button_dec, 0, 0);
+   evas_object_size_hint_align_set(button_dec, 0.5, 0.5);
+   //Tizen Only
+   evas_object_size_hint_min_set(button_dec, 7, 7);
+   //evas_object_size_hint_min_set(button_dec, 20, 20);
+   evas_object_smart_callback_add(button_dec, "clicked",
+                                  font_scale_button_dec_cb, tsd);
+   evas_object_show(button_dec);
+
+   elm_box_pack_end(box2, button_dec);
+
+   //Font Size (Slider)
+   Evas_Object *slider_font = elm_slider_add(box2);
+   //Tizen Only
+   elm_object_focus_highlight_style_set(slider_font, "blank");
+   //
+   evas_object_size_hint_weight_set(slider_font, 0, 0);
+   evas_object_size_hint_align_set(slider_font, EVAS_HINT_FILL, 0.5);
+   //Tizen Only
+   elm_slider_span_size_set(slider_font, 100);
+   //elm_slider_span_size_set(slider_font, 400);
+   elm_slider_indicator_show_set(slider_font, EINA_FALSE);
+   elm_slider_min_max_set(slider_font, MIN_FONT_SCALE, MAX_FONT_SCALE);
+   elm_slider_value_set(slider_font, tsd->font_scale);
+   //Tizen Only
+   double step = 0.01 / (double) (MAX_FONT_SCALE - MIN_FONT_SCALE);
+   elm_slider_step_set(slider_font, step);
+   evas_object_smart_callback_add(slider_font, "changed",
+                                  font_scale_slider_changed_cb, tsd);
+   evas_object_show(slider_font);
+   elm_object_focus_set(slider_font, EINA_TRUE);
+
+   elm_box_pack_end(box2, slider_font);
+
+   //Tizen Only
+   //increase button (spinner_font)
+   Evas_Object *button_inc = elm_button_add(box2);
+   //Tizen Only
+   elm_object_style_set(button_inc, "increase/enventor");
+   //elm_object_text_set(button_inc, "+");
+   evas_object_size_hint_weight_set(button_inc, 0, 0);
+   evas_object_size_hint_align_set(button_inc, 0.5, 0.5);
+   //Tizen Only
+   evas_object_size_hint_min_set(button_inc, 7, 7);
+   //evas_object_size_hint_min_set(button_inc, 20, 20);
+   evas_object_smart_callback_add(button_inc, "clicked",
+                                  font_scale_button_inc_cb, tsd);
+   evas_object_show(button_inc);
+
+   elm_box_pack_end(box2, button_inc);
+
+   Evas_Object *padding = elm_box_add(box2);
+   evas_object_size_hint_min_set(padding, 15, 20);
+   elm_box_pack_end(box2, padding);
+
+   //Spinner font
+   Evas_Object *spinner_box = elm_box_add(box2);
+   evas_object_size_hint_weight_set(spinner_box, EVAS_HINT_EXPAND, 0.5);
+   //Tizen Only
+   evas_object_size_hint_align_set(spinner_box, 0, 0.5);
+   //evas_object_size_hint_align_set(spinner_box, EVAS_HINT_FILL, 0.5);
+   evas_object_show(spinner_box);
+
+   elm_box_pack_end(box2, spinner_box);
+
+   Evas_Object *spinner_font = elm_spinner_add(spinner_box);
+   //Tizen Only
+   //elm_spinner_label_format_set(spinner_font, "%1.2fx");
+   elm_spinner_step_set(spinner_font, 5.0);
+   //elm_spinner_step_set(spinner_font, 0.01);
+   elm_spinner_wrap_set(spinner_font, EINA_TRUE);
+   elm_spinner_editable_set(spinner_font, EINA_TRUE);
+   //Tizen Only
+   elm_spinner_min_max_set(spinner_font, MIN_FONT_SCALE * 100, MAX_FONT_SCALE * 100);
+   //elm_spinner_min_max_set(spinner_font, MIN_FONT_SCALE, MAX_FONT_SCALE);
+   evas_object_size_hint_align_set(spinner_font, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   //Tizen Only
+   elm_spinner_value_set(spinner_font, tsd->font_scale * 100);
+   //elm_spinner_value_set(spinner_font, tsd->font_scale);
+   //Tizen Only
+   evas_object_size_hint_min_set(spinner_font, 94, 28);
+   //evas_object_size_hint_min_set(spinner_font, 50, 15);
+   elm_box_pack_end(spinner_box, spinner_font);
+   evas_object_show(spinner_font);
+   evas_object_smart_callback_add(spinner_font, "changed", font_scale_spinner_changed_cb, tsd);
+   //Tizen Only
+   Evas_Object *spinner_inc_btn =
+      elm_object_part_content_get(spinner_font, "elm.swallow.inc_button");
+   elm_object_focus_highlight_style_set(spinner_inc_btn, "blank");
+   Evas_Object *spinner_dec_btn =
+      elm_object_part_content_get(spinner_font, "elm.swallow.dec_button");
+   elm_object_focus_highlight_style_set(spinner_dec_btn, "blank");
+   //
+
+   //Font Name and Style (Box)
+   box = elm_box_add(layout);
+   //Tizen Only
+   //elm_box_padding_set(box, 0, ELM_SCALE_SIZE(5));
+   elm_box_padding_set(box, 0, ELM_SCALE_SIZE(10));
+   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_object_part_content_set(layout, "elm.swallow.font", box);
+
+   //Font Name (Box)
+   box2 = elm_box_add(box);
+   evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(box2);
+
+   elm_box_pack_end(box, box2);
+
+   //Font Name (Label)
+
+   /* This layout is intended to put the label aligned to left side
+      far from 3 pixels. */
+   Evas_Object *layout_padding3 = elm_layout_add(box2);
+   elm_layout_file_set(layout_padding3, EDJE_PATH, "padding3_layout");
+   evas_object_size_hint_align_set(layout_padding3, 0.0, EVAS_HINT_FILL);
+   evas_object_show(layout_padding3);
+
+   elm_box_pack_end(box2, layout_padding3);
+
+   //Tizen Only
+   //Evas_Object *label_font_name = label_create(layout_padding3, _("Font Name"));
+   Evas_Object *label_font_name = label_create(layout_padding3,
+                                               "<font_weight=Bold><color=#585858><style=Regular><font_size=13>Font name</font_size></style></color></font_weight>");
+   elm_object_part_content_set(layout_padding3, "elm.swallow.content",
+                               label_font_name);
+
+   //Font Name (List)
+   Evas_Object *list_font_name = list_create(box2);
+   elm_box_pack_end(box2, list_font_name);
+
+   //Font Style (Box)
+   box2 = elm_box_add(box);
+   //Tizen Only
+   evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   //evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0.6);
+   evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(box2);
+
+   elm_box_pack_end(box, box2);
+
+   //Font Style (Label)
+
+   /* This layout is intended to put the label aligned to left side
+      far from 3 pixels. */
+   layout_padding3 = elm_layout_add(box2);
+   elm_layout_file_set(layout_padding3, EDJE_PATH, "padding3_layout");
+   evas_object_size_hint_align_set(layout_padding3, 0.0, EVAS_HINT_FILL);
+   evas_object_show(layout_padding3);
+
+   elm_box_pack_end(box2, layout_padding3);
+
+   //Tizen Only
+   //Evas_Object *label_font_style = label_create(layout_padding3, _("Font Style"));
+   Evas_Object *label_font_style = label_create(layout_padding3,
+                                                "<font_weight=Bold><color=#585858><style=Regular><font_size=13>Font style</font_size></style></color></font_weight>");
+   elm_object_part_content_set(layout_padding3, "elm.swallow.content",
+                               label_font_style);
+
+   //Font Style (List)
+   tsd->list_font_style = list_create(box2);
+   elm_box_pack_end(box2, tsd->list_font_style);
+
+   //Font Name and Style Information
+   const char *font_name;
+   const char *font_style;
+   config_font_get(&font_name, &font_style);
+   eina_stringshare_replace(&tsd->font_name, font_name);
+   eina_stringshare_replace(&tsd->font_style, font_style);
+
+   //Append Items of Font Name List
+   Elm_Font_Properties *efp;
+   Eina_List *font_list;
+   Eina_List *l;
+   Elm_Object_Item *font_name_it = NULL;
+   char *font;
+   char prev_font[128] = {0};
+   font_list = evas_font_available_list(evas_object_evas_get(parent));
+   font_list = eina_list_sort(font_list, eina_list_count(font_list),
+                              font_cmp_cb);
+   EINA_LIST_FOREACH(font_list, l, font)
+     {
+        efp = elm_font_properties_get(font);
+        if (efp)
+          {
+             if (strcmp(prev_font, efp->name) && is_supported_font(efp->name))
+               {
+                  Elm_Object_Item *it
+                     = elm_list_item_append(list_font_name, efp->name, NULL,
+                                            NULL, font_name_selected_cb,
+                                            tsd);
+                  if (font_name && !strcmp(font_name, efp->name))
+                    font_name_it = it;
+                  snprintf(prev_font, sizeof(prev_font), "%s", efp->name);
+               }
+             elm_font_properties_free(efp);
+          }
+     }
+   elm_list_go(list_font_name);
+   if (font_name_it)
+     {
+        elm_list_item_selected_set(font_name_it, EINA_TRUE);
+        elm_list_item_show(font_name_it);
+     }
+
+   tsd->layout = layout;
+   tsd->text_edit_entry = entry;
+   tsd->slider_font = slider_font;
+   tsd->list_font_name = list_font_name;
+   tsd->spinner_font = spinner_font;
+
+   return layout;
+}
+
+void
+text_setting_focus_set(text_setting_data *tsd)
+{
+   EINA_SAFETY_ON_NULL_RETURN(tsd);
+
+   elm_object_focus_set(tsd->slider_font, EINA_TRUE);
+}
+
+void
+text_setting_config_set(text_setting_data *tsd)
+{
+   if (!tsd) return;
+
+   config_font_set(tsd->font_name, tsd->font_style);
+   config_font_scale_set((float) elm_slider_value_get(tsd->slider_font));
+
+   text_setting_syntax_color_save();
+}
+
+void
+text_setting_reset(text_setting_data *tsd)
+{
+   if (!tsd) return;
+
+   //font scale
+   tsd->font_scale = (double) config_font_scale_get();
+   elm_slider_value_set(tsd->slider_font, tsd->font_scale);
+   //Tizen Only
+   elm_spinner_value_set(tsd->spinner_font, tsd->font_scale * 100);
+   //elm_spinner_value_set(tsd->spinner_font, tsd->font_scale);
+
+   //font reset
+   const char *font_name, *font_style;
+   config_font_get(&font_name, &font_style);
+   text_setting_font_set(tsd, font_name, font_style);
+
+   text_setting_syntax_color_reset(tsd);
+}
+
+text_setting_data *
+text_setting_init(void)
+{
+   text_setting_data *tsd = calloc(1, sizeof(text_setting_data));
+   if (!tsd)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+   return tsd;
+}
+
+void
+text_setting_term(text_setting_data *tsd)
+{
+   if (!tsd) return;
+
+   evas_object_del(tsd->color_ctxpopup);
+   free(tsd->color_keyword_list);
+   free(tsd->syntax_template_format);
+   free(tsd->syntax_template_str);
+   eina_stringshare_del(tsd->font_name);
+   eina_stringshare_del(tsd->font_style);
+   evas_object_del(tsd->layout);
+   free(tsd);
+}
diff --git a/src/bin/tools.c b/src/bin/tools.c
new file mode 100644 (file)
index 0000000..35a5c71
--- /dev/null
@@ -0,0 +1,975 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "common.h"
+
+typedef struct tools_s
+{
+   Evas_Object *swallow_btn;
+   Evas_Object *wireframes_btn;
+   Evas_Object *file_tab;
+   Evas_Object *file_browser_btn;
+   Evas_Object *edc_navigator_btn;
+   Evas_Object *lines_btn;
+   Evas_Object *template_btn;
+   Evas_Object *highlight_btn;
+   Evas_Object *mirror_btn;
+   Evas_Object *goto_btn;
+   Evas_Object *find_btn;
+   Evas_Object *console_btn;
+   //Tizen Only
+   //Evas_Object *menu_btn;
+   Evas_Object *setting_btn;
+   Evas_Object *about_btn;
+   //
+   Evas_Object *live_view_ly;
+   Evas_Object *text_editor_ly;
+   //Tizen Only
+   Evas_Object *view_scale_slider;
+   Evas_Object *view_scale_spinner;
+} tools_data;
+
+static tools_data *g_td = NULL;
+
+//Tizen Only
+static void
+setting_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+           void *event_info EINA_UNUSED)
+{
+   live_edit_cancel(EINA_FALSE);
+   search_close();
+   tools_goto_update();
+
+   menu_setting();
+}
+
+//Tizen Only
+static void
+about_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+         void *event_info EINA_UNUSED)
+{
+   live_edit_cancel(EINA_FALSE);
+   search_close();
+   tools_goto_update();
+
+   help_open();
+}
+
+static void
+highlight_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+             void *event_info EINA_UNUSED)
+{
+   tools_highlight_update(EINA_TRUE);
+}
+
+static void
+dummy_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+         void *event_info EINA_UNUSED)
+{
+   tools_dummy_update(EINA_TRUE);
+}
+
+static void
+wireframes_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
+{
+   tools_wireframes_update(EINA_TRUE);
+}
+
+static void
+mirror_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+             void *event_info EINA_UNUSED)
+{
+   tools_mirror_mode_update(EINA_TRUE);
+}
+
+static void
+lines_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+         void *event_info EINA_UNUSED)
+{
+   tools_lines_update(EINA_TRUE);
+}
+
+static void
+template_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   tools_template_insert();
+}
+
+static void
+file_browser_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
+{
+   tools_file_browser_update(EINA_TRUE);
+}
+
+static void
+edc_navigator_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                 void *event_info EINA_UNUSED)
+{
+   tools_edc_navigator_update(EINA_TRUE);
+}
+
+static void
+file_tab_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+           void *event_info EINA_UNUSED)
+{
+   tools_file_tab_update(EINA_TRUE);
+}
+
+static void
+find_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+        void *event_info EINA_UNUSED)
+{
+   live_edit_cancel(EINA_FALSE);
+   if (search_close()) return;
+   else search_open();
+}
+
+static void
+goto_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+        void *event_info EINA_UNUSED)
+{
+   live_edit_cancel(EINA_FALSE);
+   if (goto_close()) return;
+   else goto_open();
+}
+
+static void
+console_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+           void *event_info EINA_UNUSED)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   base_console_toggle();
+}
+
+static void
+save_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+        void *event_info EINA_UNUSED)
+{
+#ifdef _WIN32
+   Enventor_Item *it = file_mgr_focused_item_get();
+   if (enventor_item_modified_get(it))
+     win32_edj_path_reset(config_input_path_get());
+#endif
+   file_mgr_edc_save();
+}
+
+static void
+redo_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+        void *event_info EINA_UNUSED)
+{
+   if (enventor_item_redo(file_mgr_focused_item_get()))
+     stats_info_msg_update(_("Redo text."));
+   else
+     stats_info_msg_update(_("No text to be redo."));
+}
+
+static void
+undo_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+        void *event_info EINA_UNUSED)
+{
+   if (enventor_item_undo(file_mgr_focused_item_get()))
+     stats_info_msg_update(_("Undo text."));
+   else
+     stats_info_msg_update(_("No text to be undo."));
+}
+
+static Evas_Object *
+tools_btn_create(Evas_Object *parent, const char *icon,
+                 const char *tooltip_msg, Evas_Smart_Cb func)
+{
+   Evas_Object *btn = elm_button_add(parent);
+   elm_object_style_set(btn, ENVENTOR_NAME);
+   elm_object_focus_allow_set(btn, EINA_FALSE);
+   elm_object_tooltip_text_set(btn, tooltip_msg);
+   elm_object_tooltip_orient_set(btn, ELM_TOOLTIP_ORIENT_BOTTOM);
+
+   //Tizen Only
+   Evas_Object *img = elm_layout_add(btn);
+   elm_layout_file_set(img, EDJE_PATH, icon);
+#if 0
+   Evas_Object *img = elm_image_add(btn);
+   elm_image_file_set(img, EDJE_PATH, icon);
+#endif
+   elm_object_content_set(btn, img);
+
+   evas_object_smart_callback_add(btn, "clicked", func, NULL);
+   evas_object_show(btn);
+
+   return btn;
+}
+
+void
+tools_term(void)
+{
+   tools_data *td = g_td;
+   if (!td) return;
+   free(td);
+}
+
+//Tizen Only
+static void
+view_scale_slider_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                             void *event_info EINA_UNUSED)
+{
+   tools_data *td = data;
+   double scale = elm_slider_value_get(obj);
+   enventor_object_live_view_scale_set(base_enventor_get(), scale);
+   elm_spinner_value_set(td->view_scale_spinner, scale * 100);
+}
+
+//Tizen Only
+static void
+view_scale_spinner_changed_cb(void *data, Evas_Object *obj,
+                              void *event_info EINA_UNUSED)
+{
+   tools_data *td = data;
+   double scale = elm_spinner_value_get(obj) * 0.01;
+   enventor_object_live_view_scale_set(base_enventor_get(), scale);
+   elm_slider_value_set(td->view_scale_slider, scale);
+}
+
+//Tizen Only
+static void
+view_scale_button_dec_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   tools_data *td = data;
+   double scale = enventor_object_live_view_scale_get(base_enventor_get());
+   scale -= 0.5;
+   if (scale < 0.1) scale = 0.1;
+
+   enventor_object_live_view_scale_set(base_enventor_get(), scale);
+   elm_slider_value_set(td->view_scale_slider, scale);
+   elm_spinner_value_set(td->view_scale_spinner, scale * 100);
+}
+
+//Tizen Only
+static void
+view_scale_button_inc_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   tools_data *td = data;
+   double scale = enventor_object_live_view_scale_get(base_enventor_get());
+   scale += 0.5;
+   if (scale > 5.0) scale = 5.0;
+   enventor_object_live_view_scale_set(base_enventor_get(), scale);
+   elm_slider_value_set(td->view_scale_slider, scale);
+   elm_spinner_value_set(td->view_scale_spinner, scale * 100);
+}
+
+void
+tools_init(Evas_Object *parent)
+{
+   tools_data *td = g_td;
+   if (td) return;
+
+   td = calloc(1, sizeof(tools_data));
+   if (!td)
+     {
+        mem_fail_msg();
+        return;
+     }
+   g_td = td;
+
+   //Live view tools
+   Evas_Object *live_view_ly = elm_layout_add(parent);
+   elm_layout_file_set(live_view_ly, EDJE_PATH, "live_view_tools_layout");
+   evas_object_size_hint_weight_set(live_view_ly, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(live_view_ly, EVAS_HINT_FILL,
+                                   EVAS_HINT_FILL);
+
+   Evas_Object *btn;
+   btn = tools_btn_create(live_view_ly, "highlight",
+                          _("Part highlighting (Ctrl + H)<br>"
+                            "Show a highlight effect on the selected part<br>"
+                            "in the live view."),
+                          highlight_cb);
+   elm_object_tooltip_orient_set(btn, ELM_TOOLTIP_ORIENT_BOTTOM_RIGHT);
+   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_object_part_content_set(live_view_ly, "elm.swallow.highlight", btn);
+   td->highlight_btn = btn;
+
+   btn = tools_btn_create(live_view_ly, "dummy",
+                          _("Dummy parts (Ctrl + U)<br>"
+                            "Display virtual images for the swallow and<br>"
+                            "spacer parts."),
+                          dummy_cb);
+   elm_object_tooltip_orient_set(btn, ELM_TOOLTIP_ORIENT_BOTTOM_RIGHT);
+   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_object_part_content_set(live_view_ly, "elm.swallow.dummy", btn);
+   td->swallow_btn = btn;
+
+   btn = tools_btn_create(live_view_ly, "wireframes_icon",
+                          _("Wireframes (Ctrl + W)<br>"
+                            "Display wireframes to identify the parts<br>"
+                            "boundaries."),
+                          wireframes_cb);
+   elm_object_tooltip_orient_set(btn, ELM_TOOLTIP_ORIENT_BOTTOM_RIGHT);
+   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_object_part_content_set(live_view_ly, "elm.swallow.wireframes", btn);
+   td->wireframes_btn = btn;
+
+   btn = tools_btn_create(live_view_ly, "mirror",
+                          _("Mirror mode (Ctrl + M)<br>"
+                            "Invert the layout horizontally and review<br>"
+                            "the designed layout in RTL(right-to-left)<br>"
+                            "LTR(left-to-right) settings."),
+                          mirror_cb);
+   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_object_part_content_set(live_view_ly, "elm.swallow.mirror", btn);
+   td->mirror_btn = btn;
+
+   //Live edit tools
+   Eina_List *btn_list = live_edit_tools_create(live_view_ly);
+   Eina_List *l = NULL;
+   int i = 1;
+   EINA_LIST_FOREACH(btn_list, l, btn)
+     {
+        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);
+
+        char swallow_part[32];
+        snprintf(swallow_part, sizeof(swallow_part), "elm.swallow.live_edit%d",
+                 i);
+        elm_object_part_content_set(live_view_ly, swallow_part, btn);
+        i++;
+     }
+   eina_list_free(btn_list);
+
+   td->live_view_ly = live_view_ly;
+
+   //Tizen Only
+   //Box for view scale slider
+   Evas_Object *slider_box = elm_box_add(live_view_ly);
+   elm_box_horizontal_set(slider_box, EINA_TRUE);
+   evas_object_size_hint_weight_set(slider_box, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(slider_box, EVAS_HINT_FILL, 0);
+   elm_object_part_content_set(live_view_ly, "elm.swallow.view_slider", slider_box);
+
+   //Tizen Only
+   //decrease button
+   Evas_Object *button_dec = elm_button_add(slider_box);
+   elm_object_tree_focus_allow_set(button_dec, EINA_FALSE);
+   elm_object_style_set(button_dec, "decrease/enventor");
+   evas_object_size_hint_align_set(button_dec, 0.5, 0.5);
+   evas_object_size_hint_min_set(button_dec, 7, 7);
+   evas_object_smart_callback_add(button_dec, "clicked", view_scale_button_dec_cb, td);
+   evas_object_show(button_dec);
+   elm_box_pack_end(slider_box, button_dec);
+
+   //Tizen Only
+   //slider
+   Evas_Object *slider = elm_slider_add(slider_box);
+   elm_object_tree_focus_allow_set(slider, EINA_FALSE);
+   evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5);
+   elm_slider_span_size_set(slider, 100);
+   elm_slider_indicator_show_set(slider, EINA_FALSE);
+   elm_slider_min_max_set(slider, MIN_VIEW_SCALE, MAX_VIEW_SCALE);
+   double step = 0.01 / (double) (MAX_VIEW_SCALE - MIN_VIEW_SCALE);
+   elm_slider_step_set(slider, step);
+   elm_slider_value_set(slider, 1.0);
+   evas_object_smart_callback_add(slider, "changed", view_scale_slider_changed_cb, td);
+   evas_object_show(slider);
+   elm_box_pack_end(slider_box, slider);
+   td->view_scale_slider = slider;
+
+   //Tizen Only
+   //increase button
+   Evas_Object *button_inc = elm_button_add(slider_box);
+   elm_object_tree_focus_allow_set(button_inc, EINA_FALSE);
+   elm_object_style_set(button_inc, "increase/enventor");
+   evas_object_size_hint_align_set(button_inc, 0.5, 0.5);
+   evas_object_size_hint_min_set(button_inc, 7, 7);
+   evas_object_smart_callback_add(button_inc, "clicked", view_scale_button_inc_cb, td);
+   evas_object_show(button_inc);
+   elm_box_pack_end(slider_box, button_inc);
+
+   //Tizen Only
+   //padding
+   Evas_Object *padding = elm_box_add(slider_box);
+   evas_object_size_hint_min_set(padding, 17, 20);
+   elm_box_pack_end(slider_box, padding);
+
+   //Tizen Only
+   //spinner
+   Evas_Object *spinner = elm_spinner_add(slider_box);
+   elm_spinner_step_set(spinner, 5.0);
+   elm_spinner_wrap_set(spinner, EINA_TRUE);
+   elm_spinner_editable_set(spinner, EINA_TRUE);
+   elm_spinner_min_max_set(spinner, MIN_VIEW_SCALE * 100, MAX_VIEW_SCALE * 100);
+   evas_object_size_hint_align_set(spinner, EVAS_HINT_FILL, 0.5);
+   evas_object_size_hint_min_set(spinner, 74, 28);
+   elm_spinner_value_set(spinner, (double) 100);
+   evas_object_smart_callback_add(spinner, "changed", view_scale_spinner_changed_cb, td);
+   Evas_Object *spinner_inc_btn =
+      elm_object_part_content_get(spinner, "elm.swallow.inc_button");
+   elm_object_focus_highlight_style_set(spinner_inc_btn, "blank");
+   Evas_Object *spinner_dec_btn =
+      elm_object_part_content_get(spinner, "elm.swallow.dec_button");
+   elm_object_focus_highlight_style_set(spinner_dec_btn, "blank");
+
+   elm_box_pack_end(slider_box, spinner);
+   evas_object_show(spinner);
+   td->view_scale_spinner = spinner;
+
+   //Text editor tools
+   Evas_Object *text_editor_ly = elm_layout_add(parent);
+   elm_layout_file_set(text_editor_ly, EDJE_PATH, "text_editor_tools_layout");
+   evas_object_size_hint_weight_set(text_editor_ly, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(text_editor_ly, EVAS_HINT_FILL,
+                                   EVAS_HINT_FILL);
+
+   btn = tools_btn_create(text_editor_ly, "save",
+                          _("Save the file (Ctrl + S)<br>"
+                            "Save the current script to a file."),
+                          save_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.save", btn);
+
+   btn = tools_btn_create(text_editor_ly, "undo",
+                          _("Undo text (Ctrl + Z)"),
+                          undo_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.undo", btn);
+
+   btn = tools_btn_create(text_editor_ly, "redo",
+                          _("Redo text (Ctrl + R)"),
+                          redo_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.redo", btn);
+
+   btn = tools_btn_create(text_editor_ly, "find",
+                          _("Find/Replace (Ctrl + F)<br>"
+                            "Find or replace text."),
+                          find_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.find", btn);
+   td->find_btn = btn;
+
+   btn = tools_btn_create(text_editor_ly, "goto",
+                          _("Go to line (Ctrl + L)<br>"
+                            "Open the Go to window to move the cursor<br>"
+                            "line position."),
+                          goto_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.goto", btn);
+   td->goto_btn = btn;
+
+   btn = tools_btn_create(text_editor_ly, "lines",
+                          _("Line numbers<br>"
+                            "Display the script line numbers."),
+                          lines_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.lines", btn);
+   td->lines_btn = btn;
+
+   btn = tools_btn_create(text_editor_ly, "template",
+                          _("Insert a code snippet (Ctrl + T)<br>"
+                            "EDC Editor chooses the best code with regards<br>"
+                            "to the current editing context. For instance,<br>"
+                            "if the cursor is inside a part section,<br>"
+                            "description code is generated."),
+                          template_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.template", btn);
+   td->template_btn = btn;
+
+   btn = tools_btn_create(text_editor_ly, "console",
+                          _("Console box (Alt + Down)<br>"
+                            "Display the console box, which shows the EDC<br>"
+                            "build logs, such as error messages. It pops<br>"
+                            "up automatically when compilation errors occur."),
+                          console_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.console", btn);
+   td->console_btn = btn;
+
+   btn = tools_btn_create(text_editor_ly, "file_browser",
+                          _("File browser (F9)<br>"
+                            "Display the file browser, which shows a file list<br>"
+                            "in current workspace."),
+                          file_browser_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.file_browser", btn);
+   td->file_browser_btn = btn;
+
+   btn = tools_btn_create(text_editor_ly, "edc_navigator",
+                          _("EDC navigator (F10)<br>"
+                            "Display the EDC navigator, which shows the current<br>"
+                            "group hierarchy tree that contains parts,<br>"
+                            "descriptions and programs lists."),
+                          edc_navigator_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.edc_navigator",
+                               btn);
+   td->edc_navigator_btn = btn;
+
+   btn = tools_btn_create(text_editor_ly, "filetab",
+                          _("File tab (F11)<br>"
+                            "Display the file tab in the top area<br>"
+                             "It shows an opened file list to switch<br>"
+                             "files quickly."),
+                          file_tab_cb);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.file_tab", btn);
+   td->file_tab = btn;
+
+   //Tizen Only
+   //btn = tools_btn_create(text_editor_ly, "menu",
+   //                       _("Enventor Menu (Esc)<br>"
+   //                       "Open Enventor Main Menu."),
+   //                       menu_cb);
+   //elm_object_tooltip_orient_set(btn, ELM_TOOLTIP_ORIENT_BOTTOM_LEFT);
+   //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_object_part_content_set(text_editor_ly, "elm.swallow.menu", btn);
+   //td->menu_btn = btn;
+
+   //Tizen Only
+   btn = tools_btn_create(text_editor_ly, "setting", _("Setting (F12)"),
+                          setting_cb);
+   elm_object_tooltip_orient_set(btn, ELM_TOOLTIP_ORIENT_BOTTOM_LEFT);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.setting", btn);
+   td->setting_btn = btn;
+
+   btn = tools_btn_create(text_editor_ly, "about", _("About (F1)"),
+                          about_cb);
+   elm_object_tooltip_orient_set(btn, ELM_TOOLTIP_ORIENT_BOTTOM_LEFT);
+   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_object_part_content_set(text_editor_ly, "elm.swallow.about", btn);
+   td->about_btn = btn;
+   //
+
+   td->text_editor_ly = text_editor_ly;
+
+   //Turn on if console is valid size.
+   if (!config_console_get() && (config_console_size_get() > 0))
+     tools_console_update(EINA_TRUE);
+}
+
+//Tizen Only
+void
+tools_view_scale_update(double scale)
+{
+   tools_data *td = g_td;
+   if (!td) return;
+
+   elm_slider_value_set(td->view_scale_slider, scale);
+   elm_spinner_value_set(td->view_scale_spinner, scale * 100);
+}
+
+Evas_Object *
+tools_live_view_get(void)
+{
+   tools_data *td = g_td;
+   if (!td) return NULL;
+
+   return td->live_view_ly;
+}
+
+Evas_Object *
+tools_text_editor_get(void)
+{
+   tools_data *td = g_td;
+   if (!td) return NULL;
+
+   return td->text_editor_ly;
+}
+
+void
+tools_highlight_update(Eina_Bool toggle)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   if (toggle) config_part_highlight_set(!config_part_highlight_get());
+   enventor_object_part_highlight_set(base_enventor_get(),
+                                      config_part_highlight_get());
+   if (toggle)
+     {
+        if (config_part_highlight_get())
+          stats_info_msg_update(_("Part highlighting enabled."));
+        else
+          stats_info_msg_update(_("Part highlighting disabled."));
+     }
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->highlight_btn);
+
+   //Toggle on/off
+   if (config_part_highlight_get())
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+#if 0
+   //Toggle on/off
+   if (config_part_highlight_get())
+     elm_object_signal_emit(td->highlight_btn, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(td->highlight_btn, "icon,highlight,disabled", "");
+#endif
+}
+
+void
+tools_file_browser_update(Eina_Bool toggle)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   if (toggle) config_file_browser_set(!config_file_browser_get());
+
+   base_file_browser_toggle(EINA_FALSE);
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->file_browser_btn);
+
+   //Toggle on/off
+   if (config_file_browser_get())
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+
+#if 0
+   //Toggle on/off
+   if (config_file_browser_get())
+     {
+        elm_object_signal_emit(td->file_browser_btn, "icon,highlight,enabled",
+                               "");
+     }
+   else
+     {
+        elm_object_signal_emit(td->file_browser_btn, "icon,highlight,disabled",
+                               "");
+     }
+#endif
+}
+
+void
+tools_edc_navigator_update(Eina_Bool toggle)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   if (toggle) config_edc_navigator_set(!config_edc_navigator_get());
+
+   base_edc_navigator_toggle(EINA_FALSE);
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->edc_navigator_btn);
+
+   //Toggle on/off
+   if (config_edc_navigator_get())
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+
+#if 0
+   //Toggle on/off
+   if (config_edc_navigator_get())
+     {
+        elm_object_signal_emit(td->edc_navigator_btn, "icon,highlight,enabled",
+                               "");
+     }
+   else
+     {
+        elm_object_signal_emit(td->edc_navigator_btn, "icon,highlight,disabled",
+                               "");
+     }
+#endif
+}
+
+void
+tools_lines_update(Eina_Bool toggle)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   if (toggle) config_linenumber_set(!config_linenumber_get());
+   enventor_object_linenumber_set(base_enventor_get(), config_linenumber_get());
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->lines_btn);
+
+   //Toggle on/off
+   if (config_linenumber_get())
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+
+#if 0
+   //Toggle on/off
+   if (config_linenumber_get())
+     elm_object_signal_emit(td->lines_btn, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(td->lines_btn, "icon,highlight,disabled", "");
+#endif
+}
+
+void
+tools_dummy_update(Eina_Bool toggle)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   if (toggle) config_dummy_parts_set(!config_dummy_parts_get());
+   enventor_object_dummy_parts_set(base_enventor_get(),
+                                   config_dummy_parts_get());
+
+   if (toggle)
+     {
+        if (config_dummy_parts_get())
+          stats_info_msg_update(_("Dummy parts enabled."));
+        else
+          stats_info_msg_update(_("Dummy parts disabled."));
+     }
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->swallow_btn);
+
+   //Toggle on/off
+   if (config_dummy_parts_get())
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+
+#if 0
+   //Toggle on/off
+   if (config_dummy_parts_get())
+     elm_object_signal_emit(td->swallow_btn, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(td->swallow_btn, "icon,highlight,disabled", "");
+#endif
+}
+
+void
+tools_wireframes_update(Eina_Bool toggle)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   if (toggle) config_wireframes_set(!config_wireframes_get());
+   enventor_object_wireframes_set(base_enventor_get(),
+                                     config_wireframes_get());
+
+   if (toggle)
+     {
+        if (config_wireframes_get())
+          stats_info_msg_update(_("Wireframes enabled."));
+        else
+          stats_info_msg_update(_("Wireframes disabled."));
+     }
+
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->wireframes_btn);
+
+   //Toggle on/off
+   if (config_wireframes_get())
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+
+#if 0
+   //Toggle on/off
+   if (config_wireframes_get())
+     elm_object_signal_emit(td->wireframes_btn, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(td->wireframes_btn, "icon,highlight,disabled", "");
+#endif
+}
+
+void
+tools_mirror_mode_update(Eina_Bool toggle)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   if (toggle) config_mirror_mode_set(!config_mirror_mode_get());
+   enventor_object_mirror_mode_set(base_enventor_get(),
+                                   config_mirror_mode_get());
+   live_edit_update();
+
+   if (toggle)
+     {
+        if (config_mirror_mode_get())
+          stats_info_msg_update(_("Mirror mode enabled."));
+        else
+          stats_info_msg_update(_("Mirror mode disabled."));
+     }
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->mirror_btn);
+
+   //Toggle on/off
+   if (config_mirror_mode_get())
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+#if 0
+   //Toggle on/off
+   if (config_mirror_mode_get())
+     elm_object_signal_emit(td->mirror_btn, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(td->mirror_btn, "icon,highlight,disabled", "");
+#endif
+}
+
+void
+tools_file_tab_update(Eina_Bool toggle)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   base_file_tab_toggle(toggle);
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->file_tab);
+
+   //Toggle on/off
+   if (config_file_tab_get())
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+#if 0
+   //Toggle on/off
+   if (config_file_tab_get())
+     elm_object_signal_emit(td->file_tab, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(td->file_tab, "icon,highlight,disabled", "");
+#endif
+}
+
+void
+tools_goto_update(void)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->goto_btn);
+
+   //Toggle on/off
+   if (goto_is_opened())
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+#if 0
+   if (goto_is_opened())
+     elm_object_signal_emit(td->goto_btn, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(td->goto_btn, "icon,highlight,disabled", "");
+#endif
+}
+
+void
+tools_search_update(void)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->find_btn);
+
+   //Toggle on/off
+   if (search_is_opened())
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+
+#if 0
+   if (search_is_opened())
+     elm_object_signal_emit(td->find_btn, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(td->find_btn, "icon,highlight,disabled", "");
+#endif
+}
+
+void
+tools_template_insert(void)
+{
+   if (live_edit_get())
+     {
+        stats_info_msg_update(_("Insertion of template code is disabled while in Live Edit mode"));
+        return;
+     }
+
+   Enventor_Item *it = file_mgr_focused_item_get();
+
+   char syntax[12];
+   if (enventor_item_template_insert(file_mgr_focused_item_get(), syntax,
+                                     sizeof(syntax)))
+     {
+        char msg[64];
+        snprintf(msg, sizeof(msg), _("Template code inserted, (%s)"), syntax);
+        stats_info_msg_update(msg);
+        enventor_item_file_save(it, NULL);
+     }
+   else
+     {
+        stats_info_msg_update(_("Can't insert template code here. Move the "
+                              "cursor inside the \"Collections,Images,Parts,"
+                              "Part,Programs\" scope."));
+     }
+}
+
+void
+tools_console_update(Eina_Bool on)
+{
+   tools_data *td = g_td;
+   EINA_SAFETY_ON_NULL_RETURN(td);
+
+   //Tizen Only
+   Evas_Object *icon = elm_object_content_get(td->console_btn);
+
+   //Toggle on/off
+   if (on)
+     elm_object_signal_emit(icon, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(icon, "icon,highlight,disabled", "");
+#if 0
+   if (on)
+     elm_object_signal_emit(td->console_btn, "icon,highlight,enabled", "");
+   else
+     elm_object_signal_emit(td->console_btn, "icon,highlight,disabled", "");
+#endif
+}
+
+//Tizen Only
+//void
+//tools_menu_update(Eina_Bool on)
+//{
+//   tools_data *td = g_td;
+//   EINA_SAFETY_ON_NULL_RETURN(td);
+//   if (!td) return;
+//
+//   if (on)
+//     elm_object_signal_emit(td->menu_btn, "icon,highlight,enabled", "");
+//   else
+//     elm_object_signal_emit(td->menu_btn, "icon,highlight,disabled", "");
+//}
diff --git a/src/bin/utils.c b/src/bin/utils.c
new file mode 100644 (file)
index 0000000..6fd2e1d
--- /dev/null
@@ -0,0 +1,49 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "common.h"
+
+const char *DEFAULT_EDC_FORMAT = "enventor_XXXXXX.edc";
+#ifdef _WIN32
+const char *DEFAULT_EDJ_FORMAT = "enventor_XXXXXX.edj";
+#endif
+char EDJE_PATH[PATH_MAX];
+const char *ENVENTOR_NAME = "enventor";
+Enventor_Item *active_item = NULL;
+
+void mem_fail_msg(void)
+{
+   EINA_LOG_ERR("Failed to allocate Memory!");
+}
+
+void win32_edj_path_reset(const char *path)
+{
+#ifdef _WIN32
+   if (path) config_input_path_set(path);
+   Eina_List *list = eina_list_append(NULL, config_output_path_get());
+   enventor_object_path_set(base_enventor_get(), ENVENTOR_PATH_TYPE_EDJ, list);
+   eina_list_free(list);
+#else
+   (void) path;
+#endif
+}
+
+void win32_edj_update(void)
+{
+#ifdef _WIN32
+   if (!config_output_path_get())
+     return;
+
+   if (!ecore_file_exists(config_output_path_get()))
+     return;
+
+   if (!config_win_output_path_get())
+     return;
+
+   if (ecore_file_exists(config_win_output_path_get()))
+     ecore_file_remove(config_win_output_path_get());
+
+   ecore_file_cp(config_output_path_get(), config_win_output_path_get());
+#endif
+}
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
new file mode 100644 (file)
index 0000000..ff7891f
--- /dev/null
@@ -0,0 +1,23 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EXTRA_DIST = common.h \
+       base_gui.h \
+       config_data.h \
+       menu.h \
+       panes.h \
+       statusbar.h \
+       globals.h \
+       tools.h \
+       newfile.h \
+       goto.h \
+       setting.h \
+       text_setting.h \
+       search.h \
+       live_edit.h \
+       console.h \
+       file_mgr.h \
+       edc_navigator.h \
+       file_browser.h \
+       build_setting.h \
+       preference_setting.h \
+       help.h
diff --git a/src/include/base_gui.h b/src/include/base_gui.h
new file mode 100644 (file)
index 0000000..2c69a93
--- /dev/null
@@ -0,0 +1,33 @@
+#include "panes.h"
+#include "edc_navigator.h"
+#include "file_browser.h"
+
+#define EDC_NAVIGATOR_UPDATE_TIME 0.25
+
+Eina_Bool base_gui_init(void);
+void base_gui_show(void);
+Evas_Object *base_win_get(void);
+Evas_Object *base_layout_get(void);
+Enventor_Object *base_enventor_get(void);
+void base_win_resize_object_add(Evas_Object *resize_obj);
+void base_title_set(const char *path);
+void base_statusbar_toggle(Eina_Bool config);
+void base_tools_toggle(Eina_Bool config);
+void base_tools_set(Evas_Object *live_view_tools, Evas_Object *text_editor_tools);
+void base_live_edit_fixed_bar_set(Evas_Object *fixed_bar);
+void base_enventor_full_view(void);
+void base_live_view_full_view(void);
+void base_editors_full_view(void);
+void base_console_auto_hide(void);
+void base_console_toggle(void);
+void base_live_view_set(Evas_Object *live_view);
+void base_enventor_set(Enventor_Object *enventor);
+void base_gui_term(void);
+void base_console_reset(void);
+void base_error_msg_set(const char *msg);
+void base_console_full_view(void);
+void base_file_browser_toggle(Eina_Bool toggle);
+void base_edc_navigator_toggle(Eina_Bool toggle);
+void base_edc_navigator_group_update(void);
+void base_edc_navigator_deselect(void);
+void base_file_tab_toggle(Eina_Bool toggle);
diff --git a/src/include/build_setting.h b/src/include/build_setting.h
new file mode 100644 (file)
index 0000000..3efa107
--- /dev/null
@@ -0,0 +1,8 @@
+typedef struct build_setting_s build_setting_data;
+
+Evas_Object *build_setting_content_get(build_setting_data *bsd, Evas_Object *parent);
+void build_setting_config_set(build_setting_data *bsd);
+void build_setting_term(build_setting_data *bsd);
+build_setting_data *build_setting_init(void);
+void build_setting_focus_set(build_setting_data *bsd);
+void build_setting_reset(build_setting_data *bsd);
diff --git a/src/include/common.h b/src/include/common.h
new file mode 100644 (file)
index 0000000..7309f77
--- /dev/null
@@ -0,0 +1,106 @@
+#ifndef __COMMON_H__
+#define __COMMON_H__
+
+#define ENVENTOR_HELP_EXAMPLES \
+"Examples of Enventor command line usage:\n \
+$ enventor\n \
+$ enventor input.edc -i ./images\n \
+$ enventor input.edc output.edj -i ./images\n \
+$ enventor -t\n \
+$ enventor newfile.edc -t\n \
+$ enventor input.edc output.edj -i ./images -s ./sounds -w ./workspace\n"
+
+#define ENVENTOR_USAGE \
+"%prog [input file] [output file] [-t] [-i image path] [-s sound path] [-f font path] [-d data path]"
+
+#define ENVENTOR_INFO \
+"This is an EDC editor with some convenient functions.\n \
+Enventor supports text edit and preview function for EDC source code.\n \
+You can edit EDC source code to create complex application layout\n \
+using Enventor. This was started near the begining of June 2013,\n \
+so expecting it to do everything a mature script editor does is\n \
+a bit premature. However, considering its young age, it does a lot.\n \
+\n http://www.enlightenment.org \n \
+https://phab.enlightenment.org/w/projects/enventor/ \n \
+http://www.openhub.net/p/enventor\n"
+
+#define ENVENTOR_COPYRIGHT \
+"Copyright (C) 2013-2015 Hermet Park and various contributors (see AUTHORS)\n \
+\nAll rights reserved.\n \
+\nRedistribution and use in source and binary forms, with or without\n \
+modification, are permitted provided that the following conditions are met:\n \
+\n   1. Redistributions of source code must retain the above copyright\n \
+      notice, this list of conditions and the following disclaimer.\n \
+\n   2. Redistributions in binary form must reproduce the above copyright \n \
+      notice, this list of conditions and the following disclaimer in the \n \
+      documentation and/or other materials provided with the distribution.\n"
+
+#define ENVENTOR_LICENSE \
+"\nTHIS SOFTWARE IS PROVIDED \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, \n \
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n \
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n \
+COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n \
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n \
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\n \
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n \
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n \
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n \
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
+
+#define TRANSIT_TIME 0.25
+#define EOL "<br/>"
+#define EOL_LEN 5
+#define REL1_X 0.25f
+#define REL1_Y 0.25f
+#define REL2_X 0.75f
+#define REL2_Y 0.75f
+#define INIT_WIN_W 1100
+#define INIT_WIN_H 600
+
+#define ROUNDING(x, dig) (floor((x) * pow(10, dig) + 0.5) / pow(10, dig))
+
+#define ENVENTOR_CONFIG_VERSION 14
+
+#define EVENT_KEY_MODIFIER_CHECK(NAME, MASK) \
+  ((MASK & ECORE_EVENT_MODIFIER_##NAME) && \
+   !((0xFF ^ ECORE_EVENT_MODIFIER_##NAME) & (MASK & 0x0F)))
+
+#define WIN_DEFAULT_W 1600
+#define WIN_DEFAULT_H 750
+
+#define ENVENTOR_BETA_API_SUPPORT 1
+#include <Enventor.h>
+#include <assert.h>
+#include "menu.h"
+#include "statusbar.h"
+#include "config_data.h"
+#include "utils.h"
+#include "tools.h"
+#include "base_gui.h"
+#include "search.h"
+#include "goto.h"
+#include "newfile.h"
+#include "setting.h"
+#include "live_edit.h"
+#include "console.h"
+#include "file_mgr.h"
+#include "build_setting.h"
+#include "preference_setting.h"
+#include "help.h"
+#include "file_tab.h"
+
+/* localization */
+#ifdef HAVE_GETTEXT
+   #include <libintl.h>
+   #define _(string) gettext(string)
+   #define N_(string) string
+   #define NGETTEXT(single, plur, n) ngettext(single, plur, n)
+#else
+   #define _(string) string
+   #define N_(string) string
+   #define NGETTEXT(single, plur, n) (((n)==1)? (single):(plur))
+#endif /* localization */
+
+#define ENVENTOR_LOCK_FILE ".enventor.lock"
+
+#endif
diff --git a/src/include/config_data.h b/src/include/config_data.h
new file mode 100644 (file)
index 0000000..97d1b68
--- /dev/null
@@ -0,0 +1,79 @@
+#define MAX_FONT_SCALE 5.0
+#define MIN_FONT_SCALE 0.5
+#define MAX_VIEW_SCALE 5.0
+#define MIN_VIEW_SCALE 0.1
+
+Eina_Bool config_init(const char *input_path, const char *output_path, const char *workspace_path, Eina_List *img_path, Eina_List *snd_path, Eina_List *fnt_path, Eina_List *dat_path);
+void config_term(void);
+const char *config_input_path_get(void);
+const char *config_output_path_get(void);
+//Tizen Only
+#ifdef _WIN32
+const char *config_win_output_path_get(void);
+#endif
+//
+const char *config_workspace_path_get(void);
+const char *config_img_path_get(void);
+const char *config_snd_path_get(void);
+const char *config_fnt_path_get(void);
+const char *config_dat_path_get(void);
+void config_img_path_set(const char *img_path);
+void config_snd_path_set(const char *snd_path);
+void config_fnt_path_set(const char *fnt_path);
+void config_dat_path_set(const char *fnt_path);
+Eina_List *config_img_path_list_get(void);
+Eina_List *config_snd_path_list_get(void);
+Eina_List *config_fnt_path_list_get(void);
+Eina_List *config_dat_path_list_get(void);
+void config_syntax_color_set(Enventor_Syntax_Color_Type color_type, const char *val);
+const char *config_syntax_color_get(Enventor_Syntax_Color_Type color_type);
+void config_update_cb_set(void (*cb)(void *data), void *data);
+void config_stats_bar_set(Eina_Bool enabled);
+void config_linenumber_set(Eina_Bool enabled);
+void config_file_tab_set(Eina_Bool enabled);
+Eina_Bool config_stats_bar_get(void);
+Eina_Bool config_linenumber_get(void);
+Eina_Bool config_file_tab_get(void);
+void config_apply(void);
+void config_input_path_set(const char *input_path);
+void config_view_size_get(Evas_Coord *w, Evas_Coord *h);
+void config_view_size_set(Evas_Coord w, Evas_Coord h);
+Eina_Bool config_part_highlight_get(void);
+void config_part_highlight_set(Eina_Bool highlight);
+Eina_Bool config_dummy_parts_get(void);
+void config_dummy_parts_set(Eina_Bool dummy_parts);
+Eina_Bool config_wireframes_get(void);
+void config_wireframes_set(Eina_Bool wireframes);
+void config_auto_indent_set(Eina_Bool auto_indent);
+Eina_Bool config_auto_indent_get(void);
+void config_auto_complete_set(Eina_Bool auto_complete);
+Eina_Bool config_auto_complete_get(void);
+void config_font_set(const char *font_name, const char *font_style);
+void config_font_get(const char **font_name, const char **font_style);
+void config_font_scale_set(float font_scale);
+float config_font_scale_get(void);
+Eina_Bool config_tools_get(void);
+void config_tools_set(Eina_Bool enabled);
+Eina_Bool config_config_get(void);
+void config_config_set(Eina_Bool enabled);
+double config_console_size_get(void);
+void config_console_size_set(double size);
+Eina_Bool config_console_get(void);
+void config_editor_size_set(double size);
+double config_editor_size_get(void);
+void config_console_set(Eina_Bool enabled);
+void config_win_size_get(Evas_Coord *w, Evas_Coord *h);
+void config_win_size_set(Evas_Coord w, Evas_Coord h);
+void config_smart_undo_redo_set(Eina_Bool smart_undo_redo);
+Eina_Bool config_smart_undo_redo_get(void);
+void config_file_browser_set(Eina_Bool enabled);
+Eina_Bool config_file_browser_get(void);
+void config_edc_navigator_set(Eina_Bool enabled);
+Eina_Bool config_edc_navigator_get(void);
+Eina_Bool config_mirror_mode_get(void);
+void config_mirror_mode_set(Eina_Bool mirror_mode);
+void config_red_alert_set(Eina_Bool enabled);
+Eina_Bool config_red_alert_get(void);
+//Tizen Only
+void config_font_color_palette_set(int color_palette);
+int config_font_color_palette_get(void);
diff --git a/src/include/console.h b/src/include/console.h
new file mode 100644 (file)
index 0000000..751ef21
--- /dev/null
@@ -0,0 +1,5 @@
+#define DEFAULT_CONSOLE_SIZE 0.078
+
+Evas_Object *console_create(Evas_Object *parent);
+void console_text_set(Evas_Object *console, const char *text);
+char *error_msg_syntax_color_set(char *text);
diff --git a/src/include/edc_navigator.h b/src/include/edc_navigator.h
new file mode 100644 (file)
index 0000000..d48ff90
--- /dev/null
@@ -0,0 +1,6 @@
+Evas_Object *edc_navigator_init(Evas_Object *parent);
+void edc_navigator_term(void);
+void edc_navigator_group_update(const char *cur_group);
+void edc_navigator_deselect(void);
+void edc_navigator_tools_set(void);
+void edc_navigator_tools_visible_set(Eina_Bool visible);
diff --git a/src/include/file_browser.h b/src/include/file_browser.h
new file mode 100644 (file)
index 0000000..e341d51
--- /dev/null
@@ -0,0 +1,9 @@
+Evas_Object *file_browser_init(Evas_Object *parent);
+void file_browser_term(void);
+void file_browser_workspace_set(const char *workspace_dir);
+void file_browser_tools_set(void);
+void file_browser_tools_visible_set(Eina_Bool visible);
+void file_browser_refresh(void);
+void file_browser_selected_file_main_set(void);
+void file_brwser_refresh(void);
+void file_browser_main_file_unset(void);
diff --git a/src/include/file_mgr.h b/src/include/file_mgr.h
new file mode 100644 (file)
index 0000000..d36e998
--- /dev/null
@@ -0,0 +1,18 @@
+Eina_Bool file_mgr_warning_is_opened(void);
+void file_mgr_warning_close(void);
+void file_mgr_warning_open(void);
+void file_mgr_init(void);
+void file_mgr_term(void);
+int file_mgr_edc_modified_get(void);
+void file_mgr_reset(void);
+void file_mgr_edc_save(void);
+Enventor_Item *file_mgr_main_file_set(const char *path);
+Enventor_Item *file_mgr_sub_file_add(const char *path, Eina_Bool focus);
+Enventor_Item *file_mgr_focused_item_get(void);
+void file_mgr_file_focus(Enventor_Item *it);
+Eina_Bool file_mgr_save_all(void);
+Enventor_Item *file_mgr_main_item_get(void);
+Eina_Bool file_mgr_modified_get(void);
+Eina_Bool file_mgr_file_open(const char *file_path);
+void file_mgr_file_del(Enventor_Item *it);
+Eina_Bool file_mgr_file_backward(void);
diff --git a/src/include/file_tab.h b/src/include/file_tab.h
new file mode 100644 (file)
index 0000000..c1733b0
--- /dev/null
@@ -0,0 +1,7 @@
+Evas_Object *file_tab_init(Evas_Object *parent);
+void file_tab_term(void);
+Eina_Bool file_tab_it_add(Enventor_Item *it);
+void file_tab_it_remove(Enventor_Item *enventor_it);
+Eina_Bool file_tab_it_select(Enventor_Item *enventor_it);
+void file_tab_disabled_set(Eina_Bool disabled);
+void file_tab_clear(void);
diff --git a/src/include/goto.h b/src/include/goto.h
new file mode 100644 (file)
index 0000000..18196dc
--- /dev/null
@@ -0,0 +1,5 @@
+#define DEFAULT_GOTO_WIN_W 330
+#define DEFAULT_GOTO_WIN_H 77
+void goto_open(void);
+Eina_Bool goto_close(void);
+Eina_Bool goto_is_opened(void);
diff --git a/src/include/help.h b/src/include/help.h
new file mode 100644 (file)
index 0000000..cc7aad2
--- /dev/null
@@ -0,0 +1,5 @@
+#define DEFAULT_HELP_WIN_W 430
+#define DEFAULT_HELP_WIN_H 285
+
+void help_open(void);
+void help_close(void);
diff --git a/src/include/live_edit.h b/src/include/live_edit.h
new file mode 100644 (file)
index 0000000..1b09846
--- /dev/null
@@ -0,0 +1,16 @@
+#define LIVE_EDIT_REL1 0.25
+#define LIVE_EDIT_REL2 0.75
+#define LIVE_EDIT_FONT "Sans"
+//Tizen Only
+#define LIVE_EDIT_FONT_SIZE 13
+//#define LIVE_EDIT_FONT_SIZE 10
+#define LIVE_EDIT_MAX_DIST 999999
+#define LIVE_EDIT_AUTO_ALIGN_DIST 10
+
+Evas_Object *live_edit_init(Evas_Object *parent);
+void live_edit_term(void);
+Eina_Bool live_edit_cancel(Eina_Bool phase_in);
+Eina_Bool live_edit_get(void);
+void live_edit_update(void);
+Eina_List *live_edit_tools_create(Evas_Object *parent);
+Evas_Object *live_edit_fixed_bar_get();
diff --git a/src/include/menu.h b/src/include/menu.h
new file mode 100644 (file)
index 0000000..49d634d
--- /dev/null
@@ -0,0 +1,12 @@
+void menu_init(void);
+void menu_term(void);
+void menu_toggle(void);
+void menu_edc_new(Eina_Bool template_new);
+void menu_edc_save(void);
+void menu_edc_load(void);
+void menu_exit(void);
+void menu_about(void);
+void menu_setting(void);
+int menu_activated_get(void);
+void menu_activate_request(void);
+void menu_deactivate_request(void);
diff --git a/src/include/newfile.h b/src/include/newfile.h
new file mode 100644 (file)
index 0000000..94fb03b
--- /dev/null
@@ -0,0 +1,7 @@
+//Tizen Only : Support Tizen version
+//void newfile_default_set(Eina_Bool default_edc);
+void newfile_default_set(Eina_Bool default_edc, const char *tizen_version);
+//
+void newfile_set(Eina_Bool template_new);
+Evas_Object * newfile_create(Evas_Object *parent, Evas_Smart_Cb selected_cb, void *data);
+
diff --git a/src/include/panes.h b/src/include/panes.h
new file mode 100644 (file)
index 0000000..afe0e76
--- /dev/null
@@ -0,0 +1,18 @@
+#define DEFAULT_EDITOR_SIZE 0.5
+
+Evas_Object *panes_init(Evas_Object *parent);
+void panes_term(void);
+void panes_text_editor_full_view(void);
+void panes_live_view_full_view(void);
+void panes_editors_full_view(Eina_Bool full_view);
+void panes_console_full_view(void);
+void panes_live_view_set(Evas_Object *live_view);
+void panes_text_editor_set(Evas_Object *text_editor);
+void panes_console_set(Evas_Object *console);
+Eina_Bool panes_editors_full_view_get(void);
+void panes_live_view_tools_set(Evas_Object *tools);
+void panes_live_edit_fixed_bar_set(Evas_Object *fixed_bar);
+void panes_text_editor_tools_set(Evas_Object *tools);
+void panes_live_view_tools_visible_set(Eina_Bool visible);
+void panes_live_edit_fixed_bar_visible_set(Eina_Bool visible);
+void panes_text_editor_tools_visible_set(Eina_Bool visible);
diff --git a/src/include/preference_setting.h b/src/include/preference_setting.h
new file mode 100644 (file)
index 0000000..fb86f20
--- /dev/null
@@ -0,0 +1,8 @@
+typedef struct preference_setting_s preference_setting_data;
+
+Evas_Object *preference_setting_content_get(preference_setting_data *psd, Evas_Object *parent);
+void preference_setting_config_set(preference_setting_data *psd);
+void preference_setting_term(preference_setting_data *psd);
+preference_setting_data *preference_setting_init(void);
+void preference_setting_focus_set(preference_setting_data *psd);
+void preference_setting_reset(preference_setting_data *psd);
diff --git a/src/include/search.h b/src/include/search.h
new file mode 100644 (file)
index 0000000..9abb4fe
--- /dev/null
@@ -0,0 +1,6 @@
+#define DEFAULT_SEARCH_WIN_W 330
+#define DEFAULT_SEARCH_WIN_H 90
+void search_open(void);
+Eina_Bool search_close(void);
+Eina_Bool search_is_opened(void);
+void search_reset(void);
diff --git a/src/include/setting.h b/src/include/setting.h
new file mode 100644 (file)
index 0000000..d66ff25
--- /dev/null
@@ -0,0 +1,3 @@
+void setting_open(void);
+void setting_close(void);
+Eina_Bool setting_is_opened(void);
diff --git a/src/include/statusbar.h b/src/include/statusbar.h
new file mode 100644 (file)
index 0000000..8732ccb
--- /dev/null
@@ -0,0 +1,11 @@
+Evas_Object *stats_init(Evas_Object *parent);
+void stats_term(void);
+void stats_view_size_update(Evas_Coord w, Evas_Coord h);
+void stats_cursor_pos_update(Evas_Coord x, Evas_Coord y, float rel_x, float rel_y);
+void stats_info_msg_update(const char *msg);
+void stats_line_num_update(int cur_line, int max_line);
+void stats_view_scale_update(double scale);
+Evas_Object *stats_obj_get(void);
+void stats_edc_group_update(const char *group_name);
+Eina_Stringshare *stats_group_name_get(void);
+Eina_Bool stats_ctxpopup_dismiss(void);
diff --git a/src/include/text_setting.h b/src/include/text_setting.h
new file mode 100644 (file)
index 0000000..8151595
--- /dev/null
@@ -0,0 +1,8 @@
+typedef struct text_setting_s text_setting_data;
+
+Evas_Object *text_setting_content_get(text_setting_data *tsd, Evas_Object *parent);
+void text_setting_config_set(text_setting_data *tsd);
+void text_setting_term(text_setting_data *tsd);
+text_setting_data *text_setting_init(void);
+void text_setting_focus_set(text_setting_data *tsd);
+void text_setting_reset(text_setting_data *tsd);
diff --git a/src/include/tools.h b/src/include/tools.h
new file mode 100644 (file)
index 0000000..a35a138
--- /dev/null
@@ -0,0 +1,21 @@
+void tools_init(Evas_Object *parent);
+void tools_term(void);
+void tools_highlight_update(Eina_Bool toggle);
+void tools_lines_update(Eina_Bool toggle);
+void tools_dummy_update(Eina_Bool toggle);
+void tools_wireframes_update(Eina_Bool toggle);
+void tools_mirror_mode_update(Eina_Bool toggle);
+void tools_file_tab_update(Eina_Bool toggle);
+void tools_file_browser_update(Eina_Bool toggle);
+void tools_edc_navigator_update(Eina_Bool toggle);
+void tools_goto_update(void);
+void tools_search_update(void);
+void tools_template_insert(void);
+void tools_live_update(Eina_Bool on);
+void tools_console_update(Eina_Bool on);
+//Tizen Only
+//void tools_menu_update(Eina_Bool on);
+Evas_Object *tools_live_view_get(void);
+Evas_Object *tools_text_editor_get(void);
+//Tizen Only
+void tools_view_scale_update(double scale);
diff --git a/src/include/utils.h b/src/include/utils.h
new file mode 100644 (file)
index 0000000..87cfaf3
--- /dev/null
@@ -0,0 +1,10 @@
+extern const char *DEFAULT_EDC_FORMAT;
+#ifdef _WIN32
+extern const char *DEFAULT_EDJ_FORMAT;
+#endif
+extern char EDJE_PATH[PATH_MAX];
+extern Eina_Prefix *PREFIX;
+extern const char *ENVENTOR_NAME;
+void mem_fail_msg(void);
+void win32_edj_path_reset(const char *path);
+void win32_edj_update(void);
diff --git a/src/lib/Enventor.h.in b/src/lib/Enventor.h.in
new file mode 100644 (file)
index 0000000..cd5cebf
--- /dev/null
@@ -0,0 +1,110 @@
+#ifndef ENVENTOR_H
+#define ENVENTOR_H
+
+#ifndef ENVENTOR_BETA_API_SUPPORT
+#error "Enventor APIs still unstable. It's under BETA and changeable!! If you really want to use the APIs, Please define ENVENTOR_BETA_API_SUPPORT"
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <Efl_Config.h>
+#include <Elementary.h>
+
+/***
+ * Compatible ABI for Win32
+ ***/
+#ifdef _WIN32
+# ifdef EAPI
+#  undef EAPI
+# endif
+# ifdef ENVENTOR_WIN32_BUILD_SUPPORT
+#  define EAPI __declspec(dllexport)
+# else
+#  define EAPI __declspec(dllimport)
+# endif
+# ifdef EOAPI
+#  undef EOAPI
+# endif
+#define EOAPI EAPI
+#endif
+
+typedef enum
+{
+   ENVENTOR_CTXPOPUP_TYPE_SLIDER = 0,
+   ENVENTOR_CTXPOPUP_TYPE_LIST,
+   ENVENTOR_CTXPOPUP_TYPE_TOGGLE,
+   ENVENTOR_CTXPOPUP_TYPE_IMAGE
+} Enventor_Ctxpopup_Type;
+
+typedef enum
+{
+   ENVENTOR_PATH_TYPE_EDJ = 0,
+   ENVENTOR_PATH_TYPE_IMAGE,
+   ENVENTOR_PATH_TYPE_SOUND,
+   ENVENTOR_PATH_TYPE_FONT,
+   ENVENTOR_PATH_TYPE_DATA,
+   ENVENTOR_PATH_TYPE_LAST
+} Enventor_Path_Type;
+
+typedef struct
+{
+   Evas_Coord x;
+   Evas_Coord y;
+   float relx;
+   float rely;
+} Enventor_Live_View_Cursor;
+
+typedef struct
+{
+   Evas_Coord w;
+   Evas_Coord h;
+} Enventor_Live_View_Size;
+
+typedef struct
+{
+   int cur_line;
+   int max_line;
+} Enventor_Cursor_Line;
+
+typedef struct
+{
+   Eina_Bool self_changed : 1;
+} Enventor_EDC_Modified;
+
+typedef enum {
+   ENVENTOR_TEMPLATE_INSERT_DEFAULT,
+   ENVENTOR_TEMPLATE_INSERT_LIVE_EDIT
+} Enventor_Template_Insert_Type;
+
+typedef enum {
+   ENVENTOR_SYNTAX_COLOR_STRING,
+   ENVENTOR_SYNTAX_COLOR_COMMENT,
+   ENVENTOR_SYNTAX_COLOR_MACRO,
+   ENVENTOR_SYNTAX_COLOR_SYMBOL,
+   ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD,
+   ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD,
+   ENVENTOR_SYNTAX_COLOR_CONSTANT,
+   ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC,
+   ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD,
+   ENVENTOR_SYNTAX_COLOR_LAST
+} Enventor_Syntax_Color_Type;
+
+EAPI int enventor_init(int argc, char **argv);
+EAPI int enventor_shutdown(void);
+
+#ifndef EFL_NOLEGACY_API_SUPPORT
+#include "Enventor_Legacy.h"
+#endif
+
+#ifdef EFL_EO_API_SUPPORT
+#include "Enventor_Eo.h"
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lib/Enventor_Eo.h b/src/lib/Enventor_Eo.h
new file mode 100644 (file)
index 0000000..76f204c
--- /dev/null
@@ -0,0 +1,19 @@
+/***
+ * Compatible ABI for Win32
+ ***/
+#ifdef _WIN32
+# ifdef EAPI
+#  undef EAPI
+# endif
+# ifdef EOAPI
+#  undef EOAPI
+# endif
+# ifdef ENVENTOR_WIN32_BUILD_SUPPORT
+#  define EAPI __declspec(dllexport)
+#  define EOAPI __declspec(dllexport)
+# else
+#  define EAPI __declspec(dllimport)
+#  define EOAPI __declspec(dllimport)
+# endif
+#endif
+#include "enventor_object.eo.h"
diff --git a/src/lib/Enventor_Legacy.h b/src/lib/Enventor_Legacy.h
new file mode 100644 (file)
index 0000000..daff29c
--- /dev/null
@@ -0,0 +1,41 @@
+typedef struct _Enventor_Item_Data Enventor_Item;
+
+EAPI Evas_Object *enventor_object_add(Evas_Object *parent);
+
+//FIXME: Eofy.
+EAPI Enventor_Item *enventor_object_main_item_set(Evas_Object *obj, const char *file);
+EAPI Enventor_Item *enventor_object_sub_item_add(Evas_Object *obj, const char *file);
+EAPI Enventor_Item *enventor_object_main_item_get(const Evas_Object *obj);
+EAPI const Eina_List *enventor_object_sub_items_get(const Evas_Object *obj);
+EAPI Evas_Object *enventor_item_editor_get(const Enventor_Item *it);
+EAPI const char *enventor_item_file_get(const Enventor_Item *it);
+EAPI Enventor_Item *enventor_object_focused_item_get(const Evas_Object *obj);
+EAPI Eina_Bool enventor_item_represent(Enventor_Item *it);
+EAPI int enventor_item_max_line_get(const Enventor_Item *it);
+EAPI Eina_Bool enventor_item_line_goto(Enventor_Item *it, int line);
+EAPI Eina_Bool enventor_item_syntax_color_full_apply(Enventor_Item *it, Eina_Bool force);
+EAPI Eina_Bool enventor_item_syntax_color_partial_apply(Enventor_Item *it, double interval);
+EAPI Eina_Bool enventor_item_select_region_set(Enventor_Item *it, int start, int end);
+EAPI Eina_Bool enventor_item_select_none(Enventor_Item *it);
+EAPI Eina_Bool enventor_item_cursor_pos_set(Enventor_Item *it, int position);
+EAPI int enventor_item_cursor_pos_get(const Enventor_Item *it);
+EAPI const char *enventor_item_selection_get(const Enventor_Item *it);
+EAPI Eina_Bool enventor_item_text_insert(Enventor_Item *it, const char *text);
+EAPI const char * enventor_item_text_get(const Enventor_Item *it);
+EAPI Eina_Bool enventor_item_line_delete(Enventor_Item *it);
+EAPI Eina_Bool enventor_item_file_save(Enventor_Item *it, const char *file);
+EAPI Eina_Bool enventor_item_modified_get(const Enventor_Item *it);
+EAPI void enventor_item_modified_set(Enventor_Item *it, Eina_Bool modified);
+EAPI Eina_Bool enventor_item_del(Enventor_Item *it);
+EAPI Eina_Bool enventor_item_template_insert(Enventor_Item *it, char *syntax, size_t n);
+EAPI Eina_Bool enventor_item_template_part_insert(Enventor_Item *it, Edje_Part_Type part, Enventor_Template_Insert_Type insert_type, Eina_Bool fixed_w, Eina_Bool fixed_h, char *rel1_x_to, char *rel1_y_to, char *rel2_x_to, char *rel2_y_to, float align_x, float align_y, int min_w, int min_h, float rel1_x, float rel1_y, float rel2_x,float rel2_y, char *syntax, size_t n);
+EAPI Eina_Bool enventor_item_redo(Enventor_Item *it);
+EAPI Eina_Bool enventor_item_undo(Enventor_Item *it);
+EAPI Eina_List *enventor_item_group_list_get(Enventor_Item *it);
+
+//Tizen Only : Support Tizen version
+EAPI Eina_Bool enventor_object_tizen_version_set(Evas_Object *obj, const char *version);
+EAPI const char *enventor_object_tizen_version_get(Evas_Object *obj);
+//
+
+#include "enventor_object.eo.legacy.h"
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
new file mode 100644 (file)
index 0000000..4206f10
--- /dev/null
@@ -0,0 +1,63 @@
+AUTOMAKE_OPTIONS = 1.4 foreign
+MAINTAINERCLEANFILES = Makefile.in
+
+CLEANFILES =
+
+EOLIAN_FLAGS = @DEPS_EOLIAN_FLAGS@ \
+               -I$(top_srcdir)/src/lib
+
+include $(top_srcdir)/Makefile_Eolian_Helper.am
+include $(top_srcdir)/Makefile_Eolian_Cxx_Helper.am
+
+AM_CPPFLAGS = -DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+              -DPACKAGE_BIN_DIR=\"$(bindir)\" \
+              -DPACKAGE_LIB_DIR=\"$(libdir)\" \
+              -I$(top_srcdir)/src/bin \
+              -I$(top_srcdir)/src/include \
+              @ENVENTOR_CFLAGS@
+
+lib_LTLIBRARIES = libenventor.la
+
+includes_HEADERS = \
+   Enventor_Legacy.h \
+   Enventor.h \
+   Enventor_Eo.h \
+   enventor_object.eo.h \
+   enventor_object.eo.legacy.h
+includesdir = $(includedir)/enventor-@ENVENTOR_VERSION_MAJOR@
+
+libenventor_la_SOURCES = \
+   enventor_private.h \
+   template_code.h \
+   enventor_main.c \
+   enventor_smart.c \
+   edc_parser.c \
+   redoundo.c \
+   syntax_helper.c \
+   syntax_color.c \
+   syntax_indent.c \
+   ctxpopup.c \
+   edc_editor.c \
+   auto_comp.c \
+   build.c \
+   template.c \
+   edj_mgr.c \
+   edj_viewer.c \
+   dummy_obj.c \
+   wireframes_obj.c \
+   util.c \
+   reference.c
+
+libenventor_la_CFLAGS = @ENVENTOR_CFLAGS@
+libenventor_la_LIBADD = @ENVENTOR_LIBS@
+
+libenventor_la_LDFLAGS = $(LTLIBINTL) -version-info @version_info@ -no-undefined
+
+BUILT_SOURCES = \
+   enventor_object.eo.c \
+   enventor_object.eo.h \
+   enventor_object.eo.legacy.h
+
+enventoreolianfilesdir = $(datadir)/eolian/include/enventor-@ENVENTOR_VERSION_MAJOR@
+enventoreolianfiles_DATA = enventor_object.eo
+EXTRA_DIST = ${enventoreolianfiles_DATA}
diff --git a/src/lib/auto_comp.c b/src/lib/auto_comp.c
new file mode 100644 (file)
index 0000000..bab5f8f
--- /dev/null
@@ -0,0 +1,1119 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+#define QUEUE_SIZE 20
+#define COMPSET_PAIR_MINIMUM 1
+#define MAX_CONTEXT_STACK 40
+#define MAX_KEYWORD_LENGTH 40
+
+typedef struct ctx_lexem_thread_data_s ctx_lexem_td;
+
+typedef struct lexem_s
+{
+   Eina_List *nodes;
+   char **txt;
+   int txt_count;
+   int cursor_offset;
+   int line_back;
+   char **name;
+   int name_count;
+   int dot;
+} lexem;
+
+typedef struct autocomp_s
+{
+   char queue[QUEUE_SIZE];
+   int queue_pos;
+   const lexem *lexem_root;
+   lexem *lexem_ptr;
+   Eet_File *source_file;
+   edit_data *ed;
+   Evas_Object *anchor;
+   Evas_Object *list;
+   Evas_Object *event_rect;
+
+   Ecore_Thread *init_thread;
+   ctx_lexem_td *cltd;
+
+   Eina_Bool anchor_visible : 1;
+   Eina_Bool initialized : 1;
+   Eina_Bool enabled : 1;
+   Eina_Bool dot_candidate : 1;
+   Eina_Bool on_keygrab : 1;
+   //Tizen Only : Support autocomp eet path set
+   Eina_Stringshare *eet_path;
+   Eina_Bool need_reinstall : 1;
+   //
+   Eina_Bool term: 1;
+} autocomp_data;
+
+struct ctx_lexem_thread_data_s
+{
+   char *utf8;
+   int cur_pos;
+   lexem *result;
+   edit_data *ed;
+   autocomp_data *ad;
+   Ecore_Thread *thread;
+   Eina_Bool list_show : 1;
+};
+
+static autocomp_data *g_ad = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+static Eet_Data_Descriptor *lex_desc = NULL;
+static void candidate_list_show(autocomp_data *ad);
+static void queue_reset(autocomp_data *ad);
+static void entry_anchor_off(autocomp_data *ad);
+static void anchor_key_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
+//Tizen Only
+static void init_thread_end_cb(void *data, Ecore_Thread *thread);
+
+
+static void
+eddc_init(void)
+{
+   Eet_Data_Descriptor_Class eddc;
+
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, lexem);
+   lex_desc = eet_data_descriptor_file_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_LIST(lex_desc, lexem, "nodes", nodes, lex_desc);
+   EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY_STRING(lex_desc, lexem, "txt", txt);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(lex_desc, lexem, "cursor_offset", cursor_offset, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(lex_desc, lexem, "line_back", line_back, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(lex_desc, lexem, "dot", dot, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY_STRING(lex_desc, lexem, "name", name);
+}
+
+static void
+autocomp_load(autocomp_data *ad)
+{
+   char buf[PATH_MAX];
+   //Tizen Only : Support autocomp path set
+   /*
+   snprintf(buf, sizeof(buf), "%s/autocomp/autocomp.eet",
+            eina_prefix_data_get(PREFIX));
+   */
+   if (ad->eet_path)
+     snprintf(buf, sizeof(buf), "%s", ad->eet_path);
+   else
+     snprintf(buf, sizeof(buf), "%s/autocomp/autocomp.eet",
+              eina_prefix_data_get(PREFIX));
+   //
+
+   if (ad->source_file)
+     eet_close(ad->source_file);
+   ad->source_file = eet_open(buf, EET_FILE_MODE_READ);
+
+   ad->lexem_root = (lexem *)eet_data_read(ad->source_file, lex_desc, "node");
+   ad->lexem_ptr = (lexem *)ad->lexem_root;
+}
+
+static void
+init_thread_cb(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   autocomp_data *ad = data;
+   eddc_init();
+   autocomp_load(ad);
+}
+
+static void
+lexem_tree_free(lexem **root)
+{
+   lexem *data = NULL;
+   Eina_List *l = NULL;
+
+   if (!(*root)) return;
+
+   EINA_LIST_FOREACH((*root)->nodes, l, data)
+    {
+       if (data->nodes)
+         lexem_tree_free(&data);
+    }
+
+   EINA_LIST_FREE((*root)->nodes, data)
+     {
+        free(data->txt);
+        free(data->name);
+        free(data);
+     }
+}
+
+static void
+context_lexem_thread_cb(void *data, Ecore_Thread *thread)
+{
+   const int quot_len = QUOT_UTF8_LEN;
+
+   ctx_lexem_td *td = (ctx_lexem_td *)data;
+   if (!td->ad || !td->utf8) return;
+
+   int cur_pos = td->cur_pos;
+   if (cur_pos <= 1) return;
+
+   Eina_List *l = NULL;
+   Eina_List *nodes = td->ad->lexem_root->nodes;
+   td->result = (lexem *)td->ad->lexem_root;
+   int i = 0;
+   int k = 0;
+   int depth = 0;
+   int context_len = 0;
+   char stack[MAX_CONTEXT_STACK][MAX_KEYWORD_LENGTH];
+   char *utf8 = td->utf8;
+   char *cur = utf8;
+   char *end = cur + cur_pos;
+   char *help_ptr = NULL;
+   char *help_end_ptr = NULL;
+   const char *quot = QUOT_UTF8;
+   Eina_Bool inside_quot = EINA_FALSE;
+   Eina_Bool find_flag = EINA_FALSE;
+   Eina_Bool dot_lex = EINA_FALSE;
+
+   //In case of sub items, it won't contain "collections".
+   //We added it arbitrary.
+   if (ecore_thread_check(thread)) return;
+
+   if (!edit_is_main_file(td->ed))
+     {
+        strncpy(stack[depth], "collections", MAX_KEYWORD_LENGTH);
+        depth++;
+     }
+
+   while (cur && cur <= end)
+     {
+        if (ecore_thread_check(thread)) break;
+
+        //Check inside quote
+        if ((cur != end) && (!strncmp(cur, quot, quot_len)))
+          {
+             /* TODO: add exception for case '\"' */
+             inside_quot = !inside_quot;
+          }
+        if (inside_quot)
+          {
+             cur++;
+             continue;
+          }
+
+        //Check inside comment
+        if (*cur == '/')
+          {
+             if (cur[1] == '/')
+               {
+                  cur = strchr(cur, '\n');
+                  continue;
+               }
+             else if (cur[1] == '*')
+               {
+                  cur = strstr(cur, "*/");
+                  continue;
+               }
+          }
+
+        //Case 1. Find a context and store it.
+        if (*cur == '{')
+          {
+             //Skip non-alpha numberics.
+             help_end_ptr = cur;
+             while (!isalnum(*help_end_ptr))
+               help_end_ptr--;
+
+             help_ptr = help_end_ptr;
+
+             //Figure out current context keyword
+             while ((help_ptr >= utf8) &&
+                    (isalnum(*help_ptr) || (*help_ptr == '_')))
+               {
+                  help_ptr--;
+               }
+
+             if (help_ptr != utf8)
+               help_ptr++;
+
+             //Exceptional case for size.
+             context_len = help_end_ptr - help_ptr + 1;
+             if (context_len >= MAX_KEYWORD_LENGTH)
+               {
+                  cur++;
+                  continue;
+               }
+
+             //Store this context.
+             strncpy(stack[depth], help_ptr, context_len);
+             if ((++depth) == MAX_CONTEXT_STACK) break;
+          }
+
+        //Case 2. Find a context and store it.
+        if (*cur == '.')
+          {
+             Eina_Bool alpha_present = EINA_FALSE;
+             help_end_ptr = cur - 1;
+
+             //Backtrace to the beginning of a certain keyword.
+             for (help_ptr = help_end_ptr; help_ptr && isalnum(*help_ptr);
+                  help_ptr--)
+               {
+                  if (isalpha(*help_ptr)) alpha_present = EINA_TRUE;
+               }
+
+             //Hanlding Exception cases.
+             if ((!alpha_present) || (!strncmp(help_ptr, quot, quot_len)))
+               {
+                  cur++;
+                  continue;
+               }
+
+             if (help_ptr != utf8) help_ptr++;
+
+             context_len = help_end_ptr - help_ptr + 1;
+             if (context_len >= MAX_KEYWORD_LENGTH)
+               {
+                  cur++;
+                  continue;
+               }
+
+             //Store this context.
+             strncpy(stack[depth], help_ptr, context_len);
+             strncpy(stack[depth], help_ptr, context_len);
+             if ((++depth) == MAX_CONTEXT_STACK) break;
+
+             dot_lex = EINA_TRUE;
+          }
+
+        //End of a dot lex context.
+        //Reset the previous context if its out of scope.
+        if (dot_lex && (*cur == ';'))
+          {
+             dot_lex = EINA_FALSE;
+             memset(stack[depth], 0x0, MAX_KEYWORD_LENGTH);
+             if (depth > 0) depth--;
+          }
+
+        //End of a context. Reset the previous context if its out of scope.
+        if (*cur == '}')
+          {
+             memset(stack[depth], 0x0, MAX_KEYWORD_LENGTH);
+             if (depth > 0) depth--;
+          }
+        cur++;
+     }
+
+   if (inside_quot)
+     {
+        td->result = NULL;
+        return;
+     }
+
+   // Find current context where a cursor is inside of among the stack.
+   for (i = 0; i < depth; i++)
+     {
+        find_flag = EINA_FALSE;
+        EINA_LIST_FOREACH(nodes, l, td->result)
+          {
+             for (k = 0; k < td->result->name_count; k++)
+               {
+                  //Ok, We go through this context.
+                  //FIXME: Need to compare elaborately?
+                  if (!strncmp(stack[i], td->result->name[k],
+                               strlen(td->result->name[k])))
+                    {
+                       nodes = td->result->nodes;
+                       find_flag = EINA_TRUE;
+                       break;
+                    }
+               }
+             if (find_flag) break;
+          }
+        if (!find_flag)
+          {
+             td->result = NULL;
+             return;
+          }
+     }
+}
+
+static void
+context_lexem_thread_end_cb(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   ctx_lexem_td *td = (ctx_lexem_td *)data;
+
+   if (!td->ad || (td->ad->cltd != td)) return;
+
+   td->ad->lexem_ptr = td->result;
+
+   if (td->list_show ||
+       (td->result && td->result->dot && td->ad->dot_candidate))
+     {
+        candidate_list_show(td->ad);
+     }
+   td->ad->dot_candidate = EINA_FALSE;
+   td->ad->cltd = NULL;
+
+   free(td->utf8);
+   free(td);
+}
+
+static void
+context_lexem_get(autocomp_data *ad, Evas_Object *entry, Eina_Bool list_show)
+{
+   const char *text = elm_entry_entry_get(entry);
+   if (!text)
+     {
+        ad->lexem_ptr = (lexem *)ad->lexem_root;
+        return;
+     }
+
+   if (ad->cltd)
+     {
+        ecore_thread_cancel(ad->cltd->thread);
+        ad->cltd->ad = NULL;
+     }
+
+   ad->cltd = (ctx_lexem_td *)malloc(sizeof(ctx_lexem_td));
+   ad->cltd->utf8 = elm_entry_markup_to_utf8(text);
+   ad->cltd->cur_pos = elm_entry_cursor_pos_get(entry);
+   ad->cltd->ad = ad;
+   ad->cltd->ed = ad->ed;
+   ad->cltd->result = NULL;
+   ad->cltd->list_show = list_show;
+
+   ad->cltd->thread =  ecore_thread_run(context_lexem_thread_cb,
+                                        context_lexem_thread_end_cb,
+                                        context_lexem_thread_end_cb,
+                                        ad->cltd);
+}
+
+static void
+context_changed(autocomp_data *ad, Evas_Object *edit)
+{
+   if ((!ad->enabled) || (!ad->initialized)) return;
+
+   int cursor_position = elm_entry_cursor_pos_get(edit);
+
+   if (!cursor_position)
+     {
+        ad->lexem_ptr = (lexem *)ad->lexem_root;
+        return;
+     }
+
+   context_lexem_get(ad, edit, EINA_FALSE);
+}
+
+static void
+init_thread_cancel_cb(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   autocomp_data *ad = data;
+   ad->init_thread = NULL;
+   if (ad->term) autocomp_term();
+   //Tizen Only : Support autocomp eet path set
+   else if (ad->need_reinstall)
+     {
+        ad->need_reinstall = EINA_FALSE;
+
+        //Uninstall
+        if (ad->lexem_root) lexem_tree_free((lexem **)&ad->lexem_root);
+        if (lex_desc) eet_data_descriptor_free(lex_desc);
+        if (ad->source_file) eet_close(ad->source_file);
+
+        //Reinstall
+        ad->init_thread = ecore_thread_run(init_thread_cb, init_thread_end_cb,
+                                           init_thread_cancel_cb, ad);
+     }
+   //
+}
+
+static void
+init_thread_end_cb(void *data, Ecore_Thread *thread)
+{
+   autocomp_data *ad = data;
+   ad->initialized = EINA_TRUE;
+   init_thread_cancel_cb(data, thread);
+}
+
+static void
+key_grab_add(Evas_Object *keygrabber, const char *key)
+{
+   if (!evas_object_key_grab(keygrabber, key, 0, 0, EINA_TRUE))
+     EINA_LOG_ERR(_("Failed to grab key - %s"), key);
+}
+
+static void
+key_grab_del(Evas_Object *keygrabber, const char *key)
+{
+   evas_object_key_ungrab(keygrabber, key, 0, 0);
+}
+
+static void
+anchor_keygrab_set(autocomp_data *ad, Eina_Bool grab)
+{
+   Evas_Object *anchor = ad->anchor;
+
+   if (grab)
+     {
+        if (ad->on_keygrab) return;
+        key_grab_add(anchor, "BackSpace");
+        key_grab_add(anchor, "Return");
+        key_grab_add(anchor, "Tab");
+        key_grab_add(anchor, "Up");
+        key_grab_add(anchor, "Down");
+        ad->on_keygrab = EINA_TRUE;
+     }
+   else
+     {
+        if (!ad->on_keygrab) return;
+        key_grab_del(anchor, "BackSpace");
+        key_grab_del(anchor, "Return");
+        key_grab_del(anchor, "Tab");
+        key_grab_del(anchor, "Up");
+        key_grab_del(anchor, "Down");
+        ad->on_keygrab = EINA_FALSE;
+     }
+}
+
+static void
+entry_anchor_off(autocomp_data *ad)
+{
+   if (ad->anchor_visible)
+     {
+        elm_object_tooltip_hide(ad->anchor);
+        /* Reset content_cb to have guarantee the callback call. If anchor is
+           changed faster than tooltip hide, the callback won't be called
+           since tooltip regards the content callback is same with before. */
+        elm_object_tooltip_content_cb_set(ad->anchor, NULL, NULL, NULL);
+     }
+   anchor_keygrab_set(ad, EINA_FALSE);
+   ad->anchor_visible = EINA_FALSE;
+}
+
+
+static void
+anchor_unfocused_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                    void *event_info EINA_UNUSED)
+{
+   autocomp_data *ad = data;
+   if (!ad) return;
+   entry_anchor_off(ad);
+}
+
+static void
+queue_reset(autocomp_data *ad)
+{
+   if ((ad->queue_pos == 0) && (!ad->anchor_visible)) return;
+   ad->queue_pos = 0;
+   memset(ad->queue, 0x0, sizeof(ad->queue));
+   entry_anchor_off(ad);
+}
+
+static void
+push_char(autocomp_data *ad, char c)
+{
+   if (ad->queue_pos == QUEUE_SIZE)
+     {
+        memset(ad->queue, 0x0, sizeof(ad->queue));
+        ad->queue_pos = 0;
+     }
+   ad->queue[ad->queue_pos] = c;
+   ad->queue_pos++;
+}
+
+static void
+pop_char(autocomp_data *ad, int cnt)
+{
+   if (ad->queue_pos == -1) return;
+
+   int i;
+   for (i = 0; i < cnt; i++)
+     {
+        ad->queue[ad->queue_pos] = 0x0;
+        if (ad->queue_pos == 0) break;
+        ad->queue_pos--;
+     }
+}
+
+static void
+insert_completed_text(autocomp_data *ad)
+{
+   if (!ad->lexem_ptr) return;
+   Elm_Object_Item *it = elm_list_selected_item_get(ad->list);
+
+   lexem *candidate =  elm_object_item_data_get(it);
+   char **txt = candidate->txt;
+   Evas_Object *entry = edit_entry_get(ad->ed);
+
+   int space = edit_cur_indent_depth_get(ad->ed);
+   int cursor_pos = elm_entry_cursor_pos_get(entry);
+
+   //Insert the first line.
+   const char *first_line = eina_stringshare_printf(txt[0], elm_object_item_part_text_get(it, NULL));
+   elm_entry_entry_insert(entry,  first_line + (ad->queue_pos));
+   eina_stringshare_del(first_line);
+
+   //Insert last lines
+   if (candidate->txt_count > 1)
+     {
+        //Alloc Empty spaces
+        char *p = alloca(space + 1);
+        memset(p, ' ', space);
+        p[space] = '\0';
+
+        int i;
+        for (i = 1; i < (candidate->txt_count - 1); i++)
+          {
+             elm_entry_entry_insert(entry, p);
+             elm_entry_entry_insert(entry, txt[i]);
+          }
+        elm_entry_entry_insert(entry, p);
+        elm_entry_entry_insert(entry, txt[i]);
+     }
+
+   int cursor_pos2 = elm_entry_cursor_pos_get(entry);
+   redoundo_data *rd = edit_redoundo_get(ad->ed);
+   redoundo_entry_region_push(rd, cursor_pos, cursor_pos2);
+
+   entry_anchor_off(ad);
+
+   cursor_pos2 -= (candidate->cursor_offset + (candidate->line_back * space));
+   elm_entry_cursor_pos_set(entry, cursor_pos2);
+   edit_line_increase(ad->ed, (candidate->txt_count - 1));
+}
+
+static void
+list_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   autocomp_data *ad = data;
+   ad->list = NULL;
+}
+
+
+static int
+list_item_compare(const void *data1, const void *data2)
+{
+   Elm_Object_Item *it1 = (Elm_Object_Item *) data1;
+   Elm_Object_Item *it2 = (Elm_Object_Item *) data2;
+   const char *name1 = NULL, *name2 = NULL;
+   if (!it1) return -1;
+   if (!it2) return 1;
+
+   name1 = elm_object_item_part_text_get(it1, NULL);
+   if (!name1) return -1;
+   name2 = elm_object_item_part_text_get(it2, NULL);
+   if (!name2) return 1;
+
+   return strcmp(name1, name2);
+}
+
+static Evas_Object *
+entry_tooltip_content_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         Evas_Object *tt EINA_UNUSED)
+{
+   autocomp_data *ad = data;
+   Eina_Bool found = EINA_FALSE;
+
+   if (!ad->lexem_ptr) return NULL;
+
+   ad->list = elm_list_add(obj);
+   elm_object_focus_allow_set(ad->list, EINA_FALSE);
+   elm_list_mode_set(ad->list, ELM_LIST_EXPAND);
+
+   //compute list size to prevent over-sizing than enventor window.
+   Evas_Coord y, y2, h;
+   evas_object_geometry_get(edit_obj_get(ad->ed), NULL, &y, NULL, &h);
+   evas_object_geometry_get(ad->anchor, NULL, &y2, NULL, NULL);
+   Elm_Tooltip_Orient tooltip_orient =
+      elm_object_tooltip_orient_get(ad->anchor);
+   Evas_Coord mh;
+   if (tooltip_orient == ELM_TOOLTIP_ORIENT_BOTTOM) mh = (h - y2);
+   else mh = (y2 - y);
+   evas_object_size_hint_max_set(ad->list, 999999, mh);
+
+   //add keywords
+   Eina_List *l;
+   lexem *lexem_data;
+   int k = 0;
+   EINA_LIST_FOREACH(ad->lexem_ptr->nodes, l, lexem_data)
+     {
+       for (k = 0; k < lexem_data->name_count; k++)
+         if (!strncmp(lexem_data->name[k], ad->queue, ad->queue_pos))
+          {
+             elm_list_item_sorted_insert(ad->list, lexem_data->name[k],
+                                         NULL, NULL, NULL, lexem_data,
+                                         list_item_compare);
+             found = EINA_TRUE;
+          }
+     }
+
+   //select first item in default.
+   Elm_Object_Item *it = elm_list_first_item_get(ad->list);
+   if (it) elm_list_item_selected_set(it, EINA_TRUE);
+
+   evas_object_event_callback_add(ad->list, EVAS_CALLBACK_DEL, list_del_cb, ad);
+   if (!found)
+     {
+        entry_anchor_off(ad);
+        return NULL;
+     }
+   elm_list_go(ad->list);
+   evas_object_show(ad->list);
+
+   return ad->list;
+}
+
+static void
+anchor_list_update(autocomp_data *ad)
+{
+   lexem *data;
+   Eina_List *l;
+   Elm_Object_Item *it;
+   Eina_Bool found = EINA_FALSE;
+
+   elm_list_clear(ad->list);
+   //Append new candidates
+   int k = 0;
+   EINA_LIST_FOREACH(ad->lexem_ptr->nodes, l, data)
+   {
+       for (k = 0; k < data->name_count; k++)
+         if (!strncmp(data->name[k], ad->queue, ad->queue_pos))
+           {
+              elm_list_item_sorted_insert(ad->list, data->name[k],
+                                   NULL, NULL, NULL, data, list_item_compare);
+              found = EINA_TRUE;
+          }
+   }
+   if (!found)
+     {
+        entry_anchor_off(ad);
+        return;
+     }
+   it = elm_list_first_item_get(ad->list);
+   elm_list_item_selected_set(it, EINA_TRUE);
+   elm_list_go(ad->list);
+}
+
+static void
+candidate_list_show(autocomp_data *ad)
+{
+   if (!ad->lexem_ptr)
+     {
+        entry_anchor_off(ad);
+        return;
+     }
+
+   Evas_Object *entry = edit_entry_get(ad->ed);
+
+   //Update anchor position
+   Evas_Coord x, y, h;
+   Evas_Coord cx, cy, cw, ch;
+   evas_object_geometry_get(entry, &x, &y, NULL, NULL);
+   elm_entry_cursor_geometry_get(entry, &cx, &cy, &cw, &ch);
+   evas_object_move(ad->anchor, cx + x, cy + y);
+   evas_object_resize(ad->anchor, cw, ch);
+
+   //Show the tooltip
+   if (!ad->anchor_visible)
+     {
+        //Decide the Tooltip direction
+        Elm_Tooltip_Orient tooltip_orient = ELM_TOOLTIP_ORIENT_BOTTOM;
+        evas_object_geometry_get(edit_obj_get(ad->ed), NULL, NULL, NULL, &h);
+        if ((cy + y) > (h / 2)) tooltip_orient = ELM_TOOLTIP_ORIENT_TOP;
+
+        //Tooltip set
+        elm_object_tooltip_content_cb_set(ad->anchor,
+                                          entry_tooltip_content_cb, ad, NULL);
+        elm_object_tooltip_orient_set(ad->anchor, tooltip_orient);
+        elm_object_tooltip_show(ad->anchor);
+        anchor_keygrab_set(ad, EINA_TRUE);
+        ad->anchor_visible = EINA_TRUE;
+     }
+   //Already tooltip is visible, just update the list item
+   else anchor_list_update(ad);
+}
+
+static void
+entry_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                 void *event_info)
+{
+   autocomp_data *ad = data;
+   if ((!ad) || (!ad->enabled)) return;
+
+   Elm_Entry_Change_Info *info = event_info;
+
+   if (info->insert)
+     {
+        if ((strlen(info->change.insert.content) > 1) ||
+            (info->change.insert.content[0] == ' ') ||
+            (info->change.insert.content[0] == '.'))
+          {
+             if (info->change.insert.content[0] == '.' && ad->queue_pos > 2)
+               {
+                  ad->dot_candidate = EINA_TRUE;
+                  context_lexem_get(ad, obj, EINA_FALSE);
+               }
+             queue_reset(ad);
+          }
+        else
+          {
+             push_char(ad, info->change.insert.content[0]);
+             candidate_list_show(ad);
+          }
+     }
+   else
+     {
+        if (info->change.del.content[0] != ' ')
+          {
+             entry_anchor_off(ad);
+             /* FIXME: abs() shouldn't be used here (size_t is unsigned) */
+             int cnt = abs(info->change.del.end - info->change.del.start);
+             pop_char(ad, cnt);
+          }
+     }
+}
+
+static void
+entry_cursor_changed_manual_cb(void *data,
+                               Evas_Object *obj EINA_UNUSED,
+                               void *event_info EINA_UNUSED)
+{
+   autocomp_data *ad = data;
+   if (!ad) return;
+   if (ad->anchor_visible) entry_anchor_off(ad);
+}
+
+static void
+entry_cursor_changed_cb(void *data, Evas_Object *obj,
+                        void *event_info EINA_UNUSED)
+{
+   autocomp_data *ad = data;
+   if (!ad) return;
+
+   //Update anchor position
+   Evas_Coord x, y, cx, cy, cw, ch;
+   evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+   elm_entry_cursor_geometry_get(obj, &cx, &cy, &cw, &ch);
+   evas_object_move(ad->anchor, cx + x, cy + y);
+   evas_object_resize(ad->anchor, cw, ch);
+   context_changed(ad, edit_entry_get(ad->ed));
+}
+
+static void
+entry_press_cb(void *data, Evas_Object *obj EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   autocomp_data *ad = data;
+   if (!ad) return;
+   if (ad->anchor_visible) entry_anchor_off(ad);
+}
+
+static void
+entry_move_cb(void *data, Evas *e EINA_UNUSED,
+              Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   autocomp_data *ad = data;
+   if (!ad) return;
+   if (ad->anchor_visible) entry_anchor_off(ad);
+}
+
+static void
+event_rect_mouse_down_cb(void *data, Evas *e EINA_UNUSED,
+                         Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   autocomp_data *ad = data;
+   if (!ad) return;
+   if (ad->anchor_visible) entry_anchor_off(ad);
+}
+
+static void
+list_item_move(autocomp_data *ad, Eina_Bool up)
+{
+   Evas_Object *entry = edit_entry_get(ad->ed);
+   evas_object_smart_callback_del(entry, "unfocused", anchor_unfocused_cb);
+
+   Elm_Object_Item *it = elm_list_selected_item_get(ad->list);
+   if (up) it = elm_list_item_prev(it);
+   else it = elm_list_item_next(it);
+   if (it)
+     {
+        elm_list_item_selected_set(it, EINA_TRUE);
+        elm_list_item_bring_in(it);
+     }
+
+   evas_object_smart_callback_add(entry, "unfocused", anchor_unfocused_cb,
+                                  ad);
+}
+
+static void
+anchor_key_down_cb(void *data, Evas *evas EINA_UNUSED,
+                   Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   autocomp_data *ad = data;
+   if (!ad->anchor_visible) return;
+
+   Evas_Event_Key_Down *ev = event_info;
+
+   //Cancel the auto complete.
+   if (!strcmp(ev->key, "BackSpace"))
+     {
+        entry_anchor_off(ad);
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+        return;
+     }
+   if (!strcmp(ev->key, "Return") || !strcmp(ev->key, "Tab"))
+     {
+        insert_completed_text(ad);
+        queue_reset(ad);
+        edit_syntax_color_partial_apply(ad->ed, -1);
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+        return;
+     }
+   if (!strcmp(ev->key, "Up"))
+     {
+        list_item_move(ad, EINA_TRUE);
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+        return;
+     }
+   if (!strcmp(ev->key, "Down"))
+     {
+        list_item_move(ad, EINA_FALSE);
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+        return;
+     }
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+autocomp_list_show(void)
+{
+   Evas_Object *entry;
+   autocomp_data *ad = g_ad;
+   if (!g_ad || !g_ad->enabled) return;
+
+   entry = edit_entry_get(ad->ed);
+   context_lexem_get(ad, entry, EINA_TRUE);
+}
+
+void
+autocomp_reset(void)
+{
+   autocomp_data *ad = g_ad;
+   if (!ad) return;
+   queue_reset(ad);
+}
+
+void
+autocomp_target_set(edit_data *ed)
+{
+   autocomp_data *ad = g_ad;
+   if (!ad) return;
+
+   if (ad->cltd)
+     {
+        ecore_thread_cancel(ad->cltd->thread);
+        ad->cltd->ad = NULL;
+        ad->cltd = NULL;
+     }
+
+   Evas_Object *entry;
+
+   queue_reset(ad);
+
+   //Unset previous target
+   if (ad->ed)
+     {
+        entry = edit_entry_get(ad->ed);
+        evas_object_smart_callback_del(entry, "changed,user", entry_changed_cb);
+        evas_object_smart_callback_del(entry, "cursor,changed",
+                                       entry_cursor_changed_cb);
+        evas_object_smart_callback_del(entry, "cursor,changed,manual",
+                                               entry_cursor_changed_manual_cb);
+        evas_object_smart_callback_del(entry, "unfocused", anchor_unfocused_cb);
+        evas_object_smart_callback_del(entry, "press", entry_press_cb);
+        evas_object_event_callback_del(entry, EVAS_CALLBACK_MOVE,
+                                       entry_move_cb);
+        evas_object_del(ad->anchor);
+        ad->anchor = NULL;
+        ad->ed = NULL;
+     }
+
+   if (!ed) return;
+
+   entry = edit_entry_get(ed);
+   evas_object_smart_callback_add(entry, "changed,user", entry_changed_cb, ad);
+   evas_object_smart_callback_add(entry, "cursor,changed,manual",
+                                          entry_cursor_changed_manual_cb, ad);
+   evas_object_smart_callback_add(entry, "cursor,changed",
+                                  entry_cursor_changed_cb, ad);
+   evas_object_smart_callback_add(entry, "unfocused", anchor_unfocused_cb, ad);
+   evas_object_smart_callback_add(entry, "press", entry_press_cb, ad);
+   evas_object_event_callback_add(entry, EVAS_CALLBACK_MOVE, entry_move_cb, ad);
+
+   ad->anchor = elm_button_add(edit_obj_get(ed));
+   evas_object_event_callback_add(ad->anchor, EVAS_CALLBACK_KEY_DOWN,
+                                  anchor_key_down_cb, ad);
+
+   //event_rect catches mouse down event, which makes anchor off.
+   if (!ad->event_rect)
+     {
+        Evas_Object *win = elm_object_top_widget_get(edit_obj_get(ed));
+        Evas *e = evas_object_evas_get(win);
+        Evas_Object *rect = evas_object_rectangle_add(e);
+        evas_object_repeat_events_set(rect, EINA_TRUE);
+        evas_object_color_set(rect, 0, 0, 0, 0);
+
+        evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_DOWN,
+                                       event_rect_mouse_down_cb, ad);
+        evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND,
+                                         EVAS_HINT_EXPAND);
+        elm_win_resize_object_add(win, rect);
+        evas_object_show(rect);
+
+        ad->event_rect = rect;
+     }
+
+   ad->ed = ed;
+}
+
+Eina_Bool
+autocomp_event_dispatch(const char *key)
+{
+   autocomp_data *ad = g_ad;
+   if (!ad) return EINA_FALSE;
+   if (ad->anchor_visible) return EINA_FALSE;
+
+   //Reset queue.
+   if (!strcmp(key, "Up") || !strcmp(key, "Down") ||
+       !strcmp(key, "Left") || !strcmp(key, "Right"))
+     queue_reset(ad);
+
+   return EINA_FALSE;
+}
+
+void
+autocomp_init(void)
+{
+   autocomp_data *ad = calloc(1, sizeof(autocomp_data));
+   if (!ad)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return;
+     }
+
+   ad->init_thread = ecore_thread_run(init_thread_cb, init_thread_end_cb,
+                                      init_thread_cancel_cb, ad);
+   ad->queue_pos = 0;
+   g_ad = ad;
+}
+
+void
+autocomp_term(void)
+{
+   autocomp_data *ad = g_ad;
+   autocomp_target_set(NULL);
+
+   if (ad->init_thread)
+     {
+        ecore_thread_cancel(ad->init_thread);
+        ad->term = EINA_TRUE;
+        return;
+     }
+
+   if (ad->cltd)
+     {
+        ecore_thread_cancel(ad->cltd->thread);
+        ad->cltd->ad = NULL;
+     }
+
+   evas_object_del(ad->event_rect);
+   evas_object_del(ad->anchor);
+
+   lexem_tree_free((lexem **)&ad->lexem_root);
+
+   eet_data_descriptor_free(lex_desc);
+   eet_close(ad->source_file);
+
+   //Tizen Only : Support autocomp eet path set
+   if (ad->eet_path)
+     {
+        eina_stringshare_del(ad->eet_path);
+        ad->eet_path = NULL;
+     }
+   //
+
+   free(ad);
+   g_ad = NULL;
+}
+
+void
+autocomp_enabled_set(Eina_Bool enabled)
+{
+   autocomp_data *ad = g_ad;
+   enabled = !!enabled;
+   ad->enabled = enabled;
+}
+
+Eina_Bool
+autocomp_enabled_get(void)
+{
+   autocomp_data *ad = g_ad;
+   return ad->enabled;
+}
+
+const char **
+autocomp_current_context_get(int *name_count)
+{
+   autocomp_data *ad = g_ad;
+
+   if (!ad->lexem_ptr || !ad->lexem_ptr->name)
+     return NULL;
+
+   *name_count = ad->lexem_ptr->name_count;
+   return (const char **)ad->lexem_ptr->name;
+}
+
+//Tizen Only : Support autocomp eet path set
+Eina_Bool
+autocomp_eet_path_set(const char *eet_path)
+{
+   autocomp_data *ad = g_ad;
+
+   if (!eet_path || !eet_path[0] || !ecore_file_exists(eet_path))
+     return EINA_FALSE;
+
+   if (ad->eet_path) eina_stringshare_del(ad->eet_path);
+   ad->eet_path = eina_stringshare_add(eet_path);
+
+   if (ad->cltd)
+     {
+        ecore_thread_cancel(ad->cltd->thread);
+        ad->cltd->ad = NULL;
+     }
+
+   if (ad->initialized)
+     {
+        //Uninstall
+        if (ad->lexem_root) lexem_tree_free((lexem **)&ad->lexem_root);
+        if (lex_desc) eet_data_descriptor_free(lex_desc);
+        if (ad->source_file) eet_close(ad->source_file);
+
+        //Reinstall
+        ad->init_thread = ecore_thread_run(init_thread_cb, init_thread_end_cb,
+                                           init_thread_cancel_cb, ad);
+     }
+   else
+     {
+        //Uninstall and Reinstall will be done in init_thread_cancel_cb
+        ad->need_reinstall = EINA_TRUE;
+        ecore_thread_cancel(ad->init_thread);
+     }
+   return EINA_TRUE;
+}
+//
diff --git a/src/lib/build.c b/src/lib/build.c
new file mode 100644 (file)
index 0000000..a9d6d23
--- /dev/null
@@ -0,0 +1,338 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+typedef struct builder_s
+{
+   Eina_Strbuf *strbuf;
+   char *build_cmd;
+   void (*noti_cb)(void *data, const char *msg);
+   void *noti_data;
+   Eina_Stringshare *edc_path;
+   //Tizen Only : Support edje_cc path set
+   Eina_Stringshare *edje_cc_path;
+   Eina_Stringshare *edje_cc_lib;
+   //
+   Eina_List *pathes_list[5];
+   Ecore_Event_Handler *event_data_handler;
+   Ecore_Event_Handler *event_err_handler;
+
+   Eina_Bool build_cmd_changed : 1;
+
+} build_data;
+
+static build_data *g_bd = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static Eina_Bool
+exe_event_error_cb(void *data, int type EINA_UNUSED, void *event_info)
+{
+   build_data *bd = data;
+   Ecore_Exe_Event_Data *ev = event_info;
+   Ecore_Exe_Event_Data_Line *el;
+
+   eina_strbuf_reset(bd->strbuf);
+
+   for (el = ev->lines; el && el->line; el++)
+     {
+        eina_strbuf_append(bd->strbuf, el->line);
+        eina_strbuf_append(bd->strbuf, "<br/>");
+     }
+
+   bd->noti_cb(bd->noti_data, eina_strbuf_string_get(bd->strbuf));
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Strbuf *
+strbuf_path_get(build_data *bd, Enventor_Path_Type type, const char *syntax)
+{
+   Eina_Strbuf *strbuf = eina_strbuf_new();
+   if (!strbuf)
+     {
+        EINA_LOG_ERR("Failed to new strbuf");
+        return NULL;
+     }
+
+   Eina_List *l;
+   Eina_Stringshare *path;
+   EINA_LIST_FOREACH(bd->pathes_list[type], l, path)
+     {
+        eina_strbuf_append(strbuf, syntax);
+        eina_strbuf_append(strbuf, "\"");
+        eina_strbuf_append(strbuf, path);
+        eina_strbuf_append(strbuf, "\"");
+     }
+   return strbuf;
+}
+
+static void
+build_cmd_set(build_data *bd)
+{
+   if (!bd->build_cmd_changed) return;
+   free(bd->build_cmd);
+   bd->build_cmd = NULL;
+
+   Eina_Strbuf *strbuf_img = NULL;
+   Eina_Strbuf *strbuf_snd = NULL;
+   Eina_Strbuf *strbuf_fnt = NULL;
+   Eina_Strbuf *strbuf_dat = NULL;
+   Eina_Strbuf *strbuf = NULL;
+   //Image
+   strbuf_img = strbuf_path_get(bd, ENVENTOR_PATH_TYPE_IMAGE, " -id ");
+   if (!strbuf_img) goto err;
+
+   strbuf_snd = strbuf_path_get(bd, ENVENTOR_PATH_TYPE_SOUND, " -sd ");
+   if (!strbuf_snd) goto err;
+
+   strbuf_fnt = strbuf_path_get(bd, ENVENTOR_PATH_TYPE_FONT, " -fd ");
+   if (!strbuf_fnt) goto err;
+
+   strbuf_dat = strbuf_path_get(bd, ENVENTOR_PATH_TYPE_DATA, " -dd ");
+   if (!strbuf_dat) goto err;
+
+   strbuf = eina_strbuf_new();
+   if (!strbuf)
+     {
+        EINA_LOG_ERR("Failed to new strbuf");
+        goto err;
+     }
+
+   //Tizen Only : Support edje_cc path set
+   /*
+   eina_strbuf_append_printf(strbuf,
+      "edje_cc -fastcomp \"%s\" \"%s\" -id \"%s/images\" -sd \"%s/sounds\" -fd \"%s/fonts\" -dd \"%s/data\" %s %s %s %s",
+   */
+#ifdef _WIN32
+   if (eina_stringshare_strlen(bd->edje_cc_lib) > 0)
+     SetEnvironmentVariable("path", TEXT(bd->edje_cc_lib));
+
+   /* On Windows, if command begins with double quotation marks, then the first
+    * and the last double quotation marks may be either deleted or not.
+    * (See "help cmd" on Windows.)
+    *
+    * Therefore, to preserve the string between the first and the last double
+    * quotation marks, "cmd /S /C" and additional outer double quotation marks
+    * are added.
+    */
+   eina_strbuf_append_printf(strbuf,
+      "cmd /S /C \"\"%s\" -fastcomp \"%s\" \"%s\" -id \"%s/images\" -sd \"%s/sounds\" -fd \"%s/fonts\" -dd \"%s/data\" %s %s %s %s\"",
+      bd->edje_cc_path,
+#else
+   if (bd->edje_cc_lib && (eina_stringshare_strlen(bd->edje_cc_lib) != 0))
+     eina_strbuf_append_printf(strbuf, "%s ", bd->edje_cc_lib);
+
+   eina_strbuf_append_printf(strbuf,
+      "\"%s\" -fastcomp \"%s\" \"%s\" -id \"%s/images\" -sd \"%s/sounds\" -fd \"%s/fonts\" -dd \"%s/data\" %s %s %s %s",
+      bd->edje_cc_path,
+#endif
+   //
+      bd->edc_path,
+      (char *) eina_list_data_get(bd->pathes_list[ENVENTOR_PATH_TYPE_EDJ]),
+      elm_app_data_dir_get(),
+      elm_app_data_dir_get(),
+      elm_app_data_dir_get(),
+      elm_app_data_dir_get(),
+      eina_strbuf_string_get(strbuf_img),
+      eina_strbuf_string_get(strbuf_snd),
+      eina_strbuf_string_get(strbuf_fnt),
+      eina_strbuf_string_get(strbuf_dat));
+   bd->build_cmd = eina_strbuf_string_steal(strbuf);
+   bd->build_cmd_changed = EINA_FALSE;
+
+err:
+   eina_strbuf_free(strbuf);
+   eina_strbuf_free(strbuf_img);
+   eina_strbuf_free(strbuf_snd);
+   eina_strbuf_free(strbuf_fnt);
+   eina_strbuf_free(strbuf_dat);
+}
+
+void
+build_edc(void)
+{
+   build_data *bd = g_bd;
+   bd->noti_cb(bd->noti_data, NULL);
+
+   build_cmd_set(bd);
+
+   if (!bd->build_cmd)
+     {
+        EINA_LOG_ERR("Build Command is not set!");
+        return;
+     }
+   Ecore_Exe_Flags flags =
+      (ECORE_EXE_PIPE_READ_LINE_BUFFERED | ECORE_EXE_PIPE_READ |
+       ECORE_EXE_PIPE_ERROR_LINE_BUFFERED | ECORE_EXE_PIPE_ERROR);
+   ecore_exe_pipe_run(bd->build_cmd, flags, NULL);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+build_init(void)
+{
+   build_data *bd = g_bd;
+   if (bd) return;
+
+   bd = calloc(1, sizeof(build_data));
+   if (!bd)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return;
+     }
+   g_bd = bd;
+
+   bd->event_data_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DATA,
+                                                    exe_event_error_cb, bd);
+   bd->event_err_handler = ecore_event_handler_add(ECORE_EXE_EVENT_ERROR,
+                                                   exe_event_error_cb, bd);
+   bd->strbuf = eina_strbuf_new();
+
+   //Tizen Only : Support edje_cc path set
+   bd->edje_cc_path = eina_stringshare_add("edje_cc");
+   bd->edje_cc_lib = eina_stringshare_add("");
+   //
+}
+
+void
+build_term(void)
+{
+   build_data *bd = g_bd;
+   eina_stringshare_del(bd->edc_path);
+   //Tizen Only : Support edje_cc path set
+   eina_stringshare_del(bd->edje_cc_path);
+   eina_stringshare_del(bd->edje_cc_lib);
+   //
+
+   int i;
+   for (i = 0; i < (int)(sizeof(bd->pathes_list) / sizeof(Eina_List *)); i++)
+     {
+        Eina_Stringshare *path;
+        EINA_LIST_FREE(bd->pathes_list[i], path)
+          eina_stringshare_del(path);
+     }
+
+   ecore_event_handler_del(bd->event_data_handler);
+   ecore_event_handler_del(bd->event_err_handler);
+   eina_strbuf_free(bd->strbuf);
+   free(bd->build_cmd);
+   free(bd);
+   g_bd = NULL;
+}
+
+void
+build_err_noti_cb_set(void (*cb)(void *data, const char *msg), void *data)
+{
+   build_data *bd = g_bd;
+   bd->noti_cb = cb;
+   bd->noti_data = data;
+}
+
+Eina_List *
+build_path_get(Enventor_Path_Type type)
+{
+   build_data *bd = g_bd;
+   return bd->pathes_list[type];
+}
+
+Eina_Bool
+build_path_set(Enventor_Path_Type type, const Eina_List *pathes)
+{
+   if (type >= ENVENTOR_PATH_TYPE_LAST) return EINA_FALSE;
+
+   build_data *bd = g_bd;
+   Eina_Stringshare *path;
+   Eina_List *l;
+
+   //don't allow null edj path
+   if (!pathes && (type == ENVENTOR_PATH_TYPE_EDJ)) return EINA_FALSE;
+
+   EINA_LIST_FREE(bd->pathes_list[type], path)
+     eina_stringshare_del(path);
+
+   EINA_LIST_FOREACH((Eina_List *)pathes, l, path)
+     bd->pathes_list[type] = eina_list_append(bd->pathes_list[type],
+                                              eina_stringshare_add(path));
+   bd->build_cmd_changed = EINA_TRUE;
+
+   return EINA_TRUE;
+}
+
+const char *
+build_edj_path_get(void)
+{
+   build_data *bd = g_bd;
+   return eina_list_data_get(bd->pathes_list[ENVENTOR_PATH_TYPE_EDJ]);
+}
+
+const char *
+build_edc_path_get(void)
+{
+   build_data *bd = g_bd;
+   return bd->edc_path;
+}
+
+void
+build_edc_path_set(const char *edc_path)
+{
+   build_data *bd = g_bd;
+   if (bd->edc_path == edc_path) return;
+   eina_stringshare_del(bd->edc_path);
+   bd->edc_path = eina_stringshare_add(edc_path);
+   bd->build_cmd_changed = EINA_TRUE;
+}
+
+//Tizen Only : Support edje_cc path set
+Eina_Bool
+build_edje_cc_path_set(const char *edje_cc_path)
+{
+   build_data *bd = g_bd;
+
+   if (edje_cc_path && !strstr(edje_cc_path, "edje_cc")) return EINA_FALSE;
+   if (bd->edje_cc_path == edje_cc_path) return EINA_TRUE;
+
+   eina_stringshare_del(bd->edje_cc_path);
+   eina_stringshare_del(bd->edje_cc_lib);
+
+   if (!edje_cc_path)
+     {
+        bd->edje_cc_path = eina_stringshare_add("edje_cc");
+        bd->edje_cc_lib = eina_stringshare_add("");
+     }
+   else
+     {
+        char *real_path = ecore_file_realpath(edje_cc_path);
+        unsigned int efl_path_len
+           = strstr(real_path, "edje_cc") - real_path - strlen("/bin/");
+
+        Eina_Stringshare *efl_path =
+           eina_stringshare_add_length(real_path, efl_path_len);
+
+#if defined(_WIN32)
+        bd->edje_cc_lib = eina_stringshare_printf("set path=\"%s/bin\";%%path &&",
+                                                  efl_path);
+#elif defined(__MACH__)
+        bd->edje_cc_lib = eina_stringshare_printf("DYLD_LIBRARY_PATH=\"%s/lib\"",
+                                                  efl_path);
+#else
+        bd->edje_cc_lib = eina_stringshare_printf("LD_LIBRARY_PATH=\"%s/lib\"",
+                                                  efl_path);
+#endif
+        eina_stringshare_del(efl_path);
+
+        bd->edje_cc_path = eina_stringshare_add(edje_cc_path);
+     }
+   bd->build_cmd_changed = EINA_TRUE;
+
+   return EINA_TRUE;
+}
+//
diff --git a/src/lib/ctxpopup.c b/src/lib/ctxpopup.c
new file mode 100644 (file)
index 0000000..4c0c25a
--- /dev/null
@@ -0,0 +1,1093 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+#define CTXPOPUP_BORDER_SIZE 10
+#define COLORSELECTOR_PRESET_CNT 9
+
+typedef struct ctxpopup_data_s {
+   Evas_Smart_Cb changed_cb;
+   Evas_Smart_Cb relay_cb;
+   void *data;
+   Evas_Object *ctxpopup;
+   attr_value *attr;
+   char candidate[256];
+
+   Eina_List *toggles;
+   Eina_List *sliders;
+
+   //colorselector properties
+   Evas_Object *colorselector;
+   Evas_Object *color_view;
+   Evas_Object *input_colors[4];
+   Eina_Bool color_changed : 1;
+
+   Ecore_Animator *animator;
+
+   Eina_Bool integer : 1;
+} ctxpopup_data;
+
+typedef struct rgba_value_s
+{
+   int r, g, b, a;
+} rgba_value;
+
+typedef struct preset_colors_data_s
+{
+  Eina_Bool is_created;
+  rgba_value rgba[9];
+} preset_colors_data;
+
+static rgba_value preset_cur_color;
+static preset_colors_data preset_colors =
+       { EINA_FALSE,
+         {{255, 0, 0, 255},
+          {0, 255, 0, 255},
+          {0, 0, 255, 255},
+          {255, 255, 0, 255},
+          {255, 0, 255, 255},
+          {0, 255, 255, 255},
+          {0, 0, 0, 255},
+          {255, 255, 255, 255},
+          {128, 128, 128, 255}}};
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static Eina_Bool
+is_colorselector_type(ctxpopup_data *ctxdata);
+
+static void
+update_preset_colors(Eina_Bool update)
+{
+   if (update)
+     {
+        int i, index;
+        index = -1;
+
+        for (i=0; i < COLORSELECTOR_PRESET_CNT; ++i)
+          if (preset_colors.rgba[i].r == preset_cur_color.r &&
+              preset_colors.rgba[i].g == preset_cur_color.g &&
+              preset_colors.rgba[i].b == preset_cur_color.b &&
+              preset_colors.rgba[i].a == preset_cur_color.a)
+            index = i;
+
+        if (index == -1)
+          {
+             for (i = COLORSELECTOR_PRESET_CNT-1; i > 0; --i)
+                preset_colors.rgba[i] = preset_colors.rgba[i-1];
+             preset_colors.rgba[0] = preset_cur_color;
+          }
+        else
+          {
+             for (i = index; i > 0; --i)
+                preset_colors.rgba[i] = preset_colors.rgba[i-1];
+             preset_colors.rgba[0] = preset_cur_color;
+          }
+     }
+}
+
+static int
+array_data_idx(const Eina_Array *array, void *data)
+{
+   Eina_Stringshare *array_data;
+   Eina_Array_Iterator itr;
+   int idx;
+
+   if (!array) return -1;
+
+   EINA_ARRAY_ITER_NEXT(array, idx, array_data, itr)
+     {
+        if (array_data == data)
+          return idx;
+     }
+
+   return -1;
+}
+
+static void
+ctxpopup_it_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   ctxpopup_data *ctxdata = data;
+   Elm_Object_Item *it = event_info;
+   const char *text = elm_object_item_text_get(it);
+   const Eina_Stringshare *append_str = NULL;
+
+   //Append different string to each candidate list.
+   if (ctxdata->attr->use_append_str_array)
+     {
+        int idx = array_data_idx(ctxdata->attr->strs, (void *)text);
+        if (idx != -1)
+          {
+             append_str = (const Eina_Stringshare *)
+                eina_array_data_get(ctxdata->attr->append_str_array, idx);
+          }
+     }
+   //Append same string to all candidate lists.
+   else
+     {
+        append_str = ctxdata->attr->append_str;
+     }
+   snprintf(ctxdata->candidate, sizeof(ctxdata->candidate), "%s %s%s",
+            ctxdata->attr->prepend_str, text, append_str);
+
+   ctxdata->changed_cb(ctxdata->data, obj, ctxdata->candidate);
+   elm_ctxpopup_dismiss(obj);
+}
+
+static void
+ctxpopup_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
+{
+   elm_config_focus_autoscroll_mode_set(ELM_FOCUS_AUTOSCROLL_MODE_SHOW);
+   ctxpopup_data *ctxdata = data;
+   eina_list_free(ctxdata->toggles);
+   eina_list_free(ctxdata->sliders);
+   ecore_animator_del(ctxdata->animator);
+   free(ctxdata);
+}
+
+static void
+colorselector_ctxpopup_dismiss_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                                  void *event_info EINA_UNUSED)
+{
+   ctxpopup_data *ctxdata = data;
+   update_preset_colors(ctxdata->color_changed);
+}
+
+static Eina_Bool
+changed_animator_cb(void *data)
+{
+   ctxpopup_data *ctxdata = data;
+   ctxdata->changed_cb(ctxdata->data, ctxdata->ctxpopup, ctxdata->candidate);
+   ctxdata->animator = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   ctxpopup_data *ctxdata = data;
+   double val = elm_slider_value_get(obj);
+   char buf[128];
+
+   Eina_List *l;
+   Evas_Object *slider;
+
+   snprintf(ctxdata->candidate, sizeof(ctxdata->candidate), "%s",
+            ctxdata->attr->prepend_str);
+
+   EINA_LIST_FOREACH(ctxdata->sliders, l, slider)
+     {
+        if (ctxdata->attr->type & ATTR_VALUE_INTEGER)
+          {
+             snprintf(buf, sizeof(buf), " %d",
+                      (int) roundf(elm_slider_value_get(slider)));
+          }
+        else
+          {
+             //if the last digit number is 0 then round up.
+             val = elm_slider_value_get(slider);
+             snprintf(buf, sizeof(buf), " %0.2f", val);
+             double round_down = atof(buf);
+             snprintf(buf, sizeof(buf), " %0.1f", val);
+             double round_down2 = atof(buf);
+             if (fabs(round_down - round_down2) < 0.0005)
+               snprintf(buf, sizeof(buf), " %0.1f", val);
+             else
+               snprintf(buf, sizeof(buf), " %0.2f", val);
+          }
+        strncat(ctxdata->candidate, buf, strlen(buf));
+     }
+   strncat(ctxdata->candidate, ctxdata->attr->append_str,
+           strlen(ctxdata->attr->append_str));
+   ecore_animator_del(ctxdata->animator);
+   ctxdata->animator = ecore_animator_add(changed_animator_cb, ctxdata);
+}
+
+static void
+toggle_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                  void *event_info EINA_UNUSED)
+{
+   ctxpopup_data *ctxdata = data;
+   Evas_Object *toggle;
+   Eina_List *l;
+   char buf[128];
+
+   snprintf(ctxdata->candidate, sizeof(ctxdata->candidate), " %s",
+            ctxdata->attr->prepend_str);
+
+   EINA_LIST_FOREACH(ctxdata->toggles, l, toggle)
+     {
+        snprintf(buf, sizeof(buf), " %d", (int) elm_check_state_get(toggle));
+        strncat(ctxdata->candidate, buf, strlen(buf));
+     }
+   strncat(ctxdata->candidate, ctxdata->attr->append_str,
+           strlen(ctxdata->attr->append_str));
+   ctxdata->changed_cb(ctxdata->data, ctxdata->ctxpopup, ctxdata->candidate);
+}
+
+static Evas_Object *
+toggle_layout_create(Evas_Object *parent, ctxpopup_data *ctxdata,
+                     const char *type, Eina_Bool toggle_val)
+{
+   //Layout
+   Evas_Object *layout = elm_layout_add(parent);
+   elm_layout_file_set(layout, EDJE_PATH, "toggle_layout");
+   evas_object_show(layout);
+
+   //Type
+   if (type) elm_object_part_text_set(layout, "elm.text.type", type);
+
+   //Toggle
+   Evas_Object *toggle = elm_check_add(layout);
+   elm_object_style_set(toggle, "toggle");
+   evas_object_smart_callback_add(toggle, "changed",
+                                  toggle_changed_cb,  ctxdata);
+   elm_object_part_text_set(toggle, "on", "On");
+   elm_object_part_text_set(toggle, "off", "Off");
+   elm_check_state_set(toggle, toggle_val);
+   evas_object_data_set(toggle, "ctxdata", ctxdata);
+   elm_object_part_content_set(layout, "elm.swallow.toggle", toggle);
+
+   ctxdata->toggles = eina_list_append(ctxdata->toggles, toggle);
+
+   return layout;
+}
+
+static void
+toggle_layout_set(Evas_Object *ctxpopup, ctxpopup_data *ctxdata)
+{
+   Eina_Stringshare *type;
+   Eina_Array_Iterator itr;
+   unsigned int i;
+   Evas_Coord layout_w = 0, edit_w = 0;
+
+   Evas_Object *edit = elm_object_parent_widget_get(ctxpopup);
+   evas_object_geometry_get(edit, NULL, NULL, &edit_w, NULL);
+
+   //Box
+   Evas_Object *box = elm_box_add(ctxpopup);
+   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);
+
+   //Layout
+   Evas_Object *layout = NULL;
+   EINA_ARRAY_ITER_NEXT(ctxdata->attr->strs, i, type, itr)
+     {
+        //Tizen Only
+        if (i > 0)
+          {
+             Evas_Object *separator =
+                evas_object_rectangle_add(evas_object_evas_get(box));
+
+             evas_object_size_hint_weight_set(separator, EVAS_HINT_EXPAND, 0);
+             evas_object_size_hint_align_set(separator, EVAS_HINT_FILL, 0);
+             evas_object_size_hint_min_set(separator, 0, ELM_SCALE_SIZE(1));
+             evas_object_size_hint_max_set(separator, -1, ELM_SCALE_SIZE(1));
+             evas_object_color_set(separator, 204, 204, 204, 255);
+             evas_object_show(separator);
+             elm_box_pack_end(box, separator);
+          }
+        //
+        layout = toggle_layout_create(box, ctxdata, type,
+                                      (Eina_Bool) roundf(ctxdata->attr->val[i]));
+        //Tizen Only
+        //if (i % 2) elm_object_signal_emit(layout, "odd,item,set", "");
+        elm_box_pack_end(box, layout);
+     }
+
+   elm_object_content_set(ctxpopup, box);
+
+   Evas_Object *edje = elm_layout_edje_get(layout);
+   edje_object_size_min_calc(edje, &layout_w, NULL);
+
+   if (edit_w <= layout_w + CTXPOPUP_BORDER_SIZE)
+     evas_object_del(ctxpopup);
+}
+
+static Evas_Object *
+slider_layout_create(Evas_Object *parent, ctxpopup_data *ctxdata,
+                     const char *type, double slider_val)
+{
+   attr_value *attr = ctxdata->attr;
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(parent);
+   elm_layout_file_set(layout, EDJE_PATH, "slider_layout");
+   evas_object_show(layout);
+
+   //Type
+   if (type) elm_object_part_text_set(layout, "elm.text.type", type);
+
+   //Slider
+   Evas_Object *slider = elm_slider_add(layout);
+   //Tizen Only
+   elm_object_style_set(slider, "pop");
+   //Tizen Only
+   elm_slider_span_size_set(slider, 199);
+   //elm_slider_span_size_set(slider, 120);
+   elm_slider_indicator_show_set(slider, EINA_FALSE);
+   elm_slider_min_max_set(slider, attr->min, attr->max);
+   elm_slider_value_set(slider, slider_val);
+   evas_object_smart_callback_add(slider, "changed", slider_changed_cb,
+                                  ctxdata);
+   char slider_min[16];
+   char slider_max[16];
+   double step_size;
+
+   if (ctxdata->integer)
+     {
+        snprintf(slider_min, sizeof(slider_min), "%1.0f", attr->min);
+        snprintf(slider_max, sizeof(slider_max), "%1.0f", attr->max);
+        step_size = 1 / (double) (attr->max - attr->min);
+        elm_slider_step_set(slider, step_size);
+     }
+   else
+     {
+        snprintf(slider_min, sizeof(slider_min), "%1.2f", attr->min);
+        snprintf(slider_max, sizeof(slider_max), "%1.2f", attr->max);
+        step_size = 1 / (double) (attr->max * 100 - attr->min);
+        elm_slider_step_set(slider, step_size);
+     }
+
+   elm_object_part_text_set(layout, "elm.text.slider_min", slider_min);
+   elm_object_part_text_set(layout, "elm.text.slider_max", slider_max);
+   elm_object_part_content_set(layout, "elm.swallow.slider", slider);
+
+   ctxdata->sliders = eina_list_append(ctxdata->sliders, slider);
+
+   return layout;
+}
+
+static void
+slider_layout_set(Evas_Object *ctxpopup, ctxpopup_data *ctxdata)
+{
+   Eina_Stringshare *type;
+   Eina_Array_Iterator itr;
+   unsigned int i;
+   Evas_Coord layout_w = 0, edit_w = 0;
+
+   Evas_Object *edit = elm_object_parent_widget_get(ctxpopup);
+   evas_object_geometry_get(edit, NULL, NULL, &edit_w, NULL);
+
+   //Box
+   Evas_Object *box = elm_box_add(ctxpopup);
+   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);
+
+   //Layout
+   Evas_Object *layout = NULL;
+   EINA_ARRAY_ITER_NEXT(ctxdata->attr->strs, i, type, itr)
+     {
+        //Tizen Only
+        if (i > 0)
+          {
+             Evas_Object *separator =
+                evas_object_rectangle_add(evas_object_evas_get(box));
+
+             evas_object_size_hint_weight_set(separator, EVAS_HINT_EXPAND, 0);
+             evas_object_size_hint_align_set(separator, EVAS_HINT_FILL, 0);
+             evas_object_size_hint_min_set(separator, 0, ELM_SCALE_SIZE(1));
+             evas_object_size_hint_max_set(separator, -1, ELM_SCALE_SIZE(1));
+             evas_object_color_set(separator, 204, 204, 204, 255);
+             evas_object_show(separator);
+             elm_box_pack_end(box, separator);
+          }
+        //
+        layout = slider_layout_create(box, ctxdata, type,
+                                      ctxdata->attr->val[i]);
+        //Tizen Only
+        //if (i % 2) elm_object_signal_emit(layout, "odd,item,set", "");
+        elm_box_pack_end(box, layout);
+     }
+
+   elm_object_content_set(ctxpopup, box);
+   Evas_Object *edje = elm_layout_edje_get(layout);
+   edje_object_size_min_calc(edje, &layout_w, NULL);
+
+   //Check if the ctxpopup is useless due to it's space.
+   if (edit_w <= layout_w + CTXPOPUP_BORDER_SIZE)
+     evas_object_del(ctxpopup);
+}
+
+static void
+colorselector_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   ctxpopup_data *ctxdata = data;
+   int r,g,b,a;
+
+   elm_colorselector_color_get(ctxdata->colorselector, &r, &g, &b, &a);
+
+   elm_spinner_value_set(ctxdata->input_colors[0], r);
+   elm_spinner_value_set(ctxdata->input_colors[1], g);
+   elm_spinner_value_set(ctxdata->input_colors[2], b);
+   elm_spinner_value_set(ctxdata->input_colors[3], a);
+
+   evas_object_color_set(ctxdata->color_view, (r * a) / 255 ,
+                         (g * a) / 255, (b * a) / 255, a);
+
+   ecore_animator_del(ctxdata->animator);
+   snprintf(ctxdata->candidate, sizeof(ctxdata->candidate), ": %d %d %d %d;",
+            r, g, b, a);
+   ctxdata->animator = ecore_animator_add(changed_animator_cb, ctxdata);
+
+   preset_cur_color.r = r;
+   preset_cur_color.g = g;
+   preset_cur_color.b = b;
+   preset_cur_color.a = a;
+
+   ctxdata->color_changed = EINA_TRUE;
+}
+
+static void
+colorselector_inputs_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                  void *event_info EINA_UNUSED)
+{
+   ctxpopup_data *ctxdata = data;
+   int r,g,b,a;
+
+   r = elm_spinner_value_get(ctxdata->input_colors[0]);
+   g = elm_spinner_value_get(ctxdata->input_colors[1]);
+   b = elm_spinner_value_get(ctxdata->input_colors[2]);
+   a = elm_spinner_value_get(ctxdata->input_colors[3]);
+
+   evas_object_color_set(ctxdata->color_view, (r * a) /255 , (g * a)/255,
+                         (b * a)/255, a);
+   elm_colorselector_color_set(ctxdata->colorselector, r, g, b, a);
+
+   ecore_animator_del(ctxdata->animator);
+   snprintf(ctxdata->candidate, sizeof(ctxdata->candidate), ": %d %d %d %d;",
+            r, g, b, a);
+   ctxdata->animator = ecore_animator_add(changed_animator_cb, ctxdata);
+
+   preset_cur_color.r = r;
+   preset_cur_color.g = g;
+   preset_cur_color.b = b;
+   preset_cur_color.a = a;
+
+   ctxdata->color_changed = EINA_TRUE;
+}
+
+static void
+colorselector_preset_clicked_cb(void *data,  Evas *e EINA_UNUSED, Evas_Object *obj,
+                           void *event_info EINA_UNUSED)
+{
+   ctxpopup_data *ctxdata = data;
+
+   int r,g,b,a;
+
+   int index = (int)(uintptr_t)evas_object_data_get(obj, "index");
+   r = preset_colors.rgba[index].r;
+   g = preset_colors.rgba[index].g;
+   b = preset_colors.rgba[index].b;
+   a = preset_colors.rgba[index].a;
+
+   evas_object_color_set(ctxdata->color_view, (r * a)/255 , (g * a)/255,
+                         (b * a)/255, a);
+   elm_colorselector_color_set(ctxdata->colorselector, r, g, b, a);
+
+   elm_spinner_value_set(ctxdata->input_colors[0], r);
+   elm_spinner_value_set(ctxdata->input_colors[1], g);
+   elm_spinner_value_set(ctxdata->input_colors[2], b);
+   elm_spinner_value_set(ctxdata->input_colors[3], a);
+
+   ecore_animator_del(ctxdata->animator);
+   snprintf(ctxdata->candidate, sizeof(ctxdata->candidate), ": %d %d %d %d;",
+            r, g, b, a);
+   ctxdata->animator = ecore_animator_add(changed_animator_cb, ctxdata);
+
+   preset_cur_color.r = r;
+   preset_cur_color.g = g;
+   preset_cur_color.b = b;
+   preset_cur_color.a = a;
+
+   ctxdata->color_changed = EINA_TRUE;
+}
+
+static Evas_Object *
+colorselector_layout_create(Evas_Object *ctxpopup, ctxpopup_data *ctxdata)
+{
+   Eina_Stringshare *type;
+   Eina_Array_Iterator itr;
+   unsigned int i;
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(ctxpopup);
+   elm_layout_file_set(layout, EDJE_PATH, "colorselector_layout");
+   evas_object_show(layout);
+
+   int r,g,b,a;
+   r = ctxdata->attr->val[0];
+   g = ctxdata->attr->val[1];
+   b = ctxdata->attr->val[2];
+   a = ctxdata->attr->val[3];
+
+   //Colorselector
+   ctxdata->colorselector = elm_colorselector_add(layout);
+   elm_colorselector_color_set(ctxdata->colorselector, r, g, b, a);
+   elm_colorselector_mode_set(ctxdata->colorselector,
+                              ELM_COLORSELECTOR_COMPONENTS);
+   evas_object_size_hint_weight_set(ctxdata->colorselector,
+                                    EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(ctxdata->colorselector,
+                                   EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_object_part_content_set(layout, "elm.swallow.colorselector",
+                               ctxdata->colorselector);
+   evas_object_smart_callback_add(ctxdata->colorselector, "changed",
+                                  colorselector_changed_cb, ctxdata);
+
+   //Color View
+   ctxdata->color_view = evas_object_rectangle_add(evas_object_evas_get(layout));
+   evas_object_color_set(ctxdata->color_view, (r * a) / 255 , (g * a) / 255,
+                         (b * a) / 255, a);
+   evas_object_show(ctxdata->color_view);
+   elm_object_part_content_set(layout, "elm.swallow.color_view", ctxdata->color_view);
+
+   //Color Inputs Text
+   elm_object_part_text_set(layout, "elm.text.red", "R:");
+   elm_object_part_text_set(layout, "elm.text.green", "G:");
+   elm_object_part_text_set(layout, "elm.text.blue", "B:");
+   elm_object_part_text_set(layout, "elm.text.alpha", "A:");
+
+   //Color Inputs
+   Evas_Object *inputs_box = elm_box_add(layout);
+   evas_object_size_hint_weight_set(inputs_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(inputs_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+   EINA_ARRAY_ITER_NEXT(ctxdata->attr->strs, i, type, itr)
+     {
+        ctxdata->input_colors[i] = elm_spinner_add(inputs_box);
+        //Tizen_Only: apply colorselector ux
+        elm_object_style_set(ctxdata->input_colors[i], "color_input");
+        //
+        elm_spinner_editable_set(ctxdata->input_colors[i], EINA_TRUE);
+        elm_spinner_step_set(ctxdata->input_colors[i], 1.0);
+        elm_spinner_min_max_set(ctxdata->input_colors[i], 0, 255);
+        elm_spinner_value_set(ctxdata->input_colors[i], ctxdata->attr->val[i]);
+        evas_object_size_hint_align_set(ctxdata->input_colors[i],
+                                        EVAS_HINT_FILL, 0.5);
+        evas_object_size_hint_weight_set(ctxdata->input_colors[i],
+                                         EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+        evas_object_show(ctxdata->input_colors[i]);
+        evas_object_smart_callback_add(ctxdata->input_colors[i], "changed",
+                                       colorselector_inputs_changed_cb, ctxdata);
+     }
+
+   elm_object_part_content_set(layout, "elm.swallow.input_red", ctxdata->input_colors[0]);
+   elm_object_part_content_set(layout, "elm.swallow.input_green", ctxdata->input_colors[1]);
+   elm_object_part_content_set(layout, "elm.swallow.input_blue", ctxdata->input_colors[2]);
+   elm_object_part_content_set(layout, "elm.swallow.input_alpha", ctxdata->input_colors[3]);
+
+   //Preset Colors
+   Evas_Object *colors_box = elm_box_add(layout);
+   elm_box_horizontal_set(colors_box, EINA_TRUE);
+   elm_box_padding_set(colors_box, ELM_SCALE_SIZE(8), 0);
+   evas_object_size_hint_weight_set(colors_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(colors_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(colors_box);
+
+   for (i = 0; i < COLORSELECTOR_PRESET_CNT; i++)
+     {
+        Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(layout));
+        evas_object_color_set(rect,
+                              preset_colors.rgba[i].r * preset_colors.rgba[i].a / 255,
+                              preset_colors.rgba[i].g * preset_colors.rgba[i].a / 255,
+                              preset_colors.rgba[i].b * preset_colors.rgba[i].a / 255,
+                              preset_colors.rgba[i].a);
+        evas_object_data_set(rect, "index", (void*)(uintptr_t)i);
+        //Tizen_Only: apply colorselector ux
+        evas_object_size_hint_min_set(rect, ELM_SCALE_SIZE(32), ELM_SCALE_SIZE(32));
+        //
+        evas_object_show(rect);
+        elm_box_pack_end(colors_box, rect);
+        evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_DOWN ,
+                                       colorselector_preset_clicked_cb, ctxdata);
+     }
+   elm_object_part_content_set(layout, "elm.swallow.preset_colors", colors_box);
+
+   return layout;
+}
+
+static void
+colorselector_layout_set(Evas_Object *ctxpopup, ctxpopup_data *ctxdata)
+{
+   Evas_Coord layout_w = 0, edit_w = 0;
+   Evas_Object *edit = elm_object_parent_widget_get(ctxpopup);
+   evas_object_geometry_get(edit, NULL, NULL, &edit_w, NULL);
+   evas_object_smart_callback_add(ctxpopup, "dismissed", colorselector_ctxpopup_dismiss_cb,
+                                  ctxdata);
+   //Box
+   Evas_Object *box = elm_box_add(ctxpopup);
+   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 *layout = NULL;
+   layout = colorselector_layout_create(box, ctxdata);
+
+   elm_box_pack_end(box, layout);
+
+   elm_object_content_set(ctxpopup, box);
+   Evas_Object *edje = elm_layout_edje_get(layout);
+   edje_object_size_min_calc(edje, &layout_w, NULL);
+
+   //Check if the ctxpopup is useless due to it's space.
+   if (edit_w <= layout_w + CTXPOPUP_BORDER_SIZE)
+     evas_object_del(ctxpopup);
+}
+
+static void
+constant_candidate_set(Evas_Object *ctxpopup, ctxpopup_data *ctxdata)
+{
+   Eina_Stringshare *candidate;
+   Eina_Array_Iterator itr;
+   unsigned int i;
+   //Tizen Only
+   Elm_Object_Item *it;
+
+   EINA_ARRAY_ITER_NEXT(ctxdata->attr->strs, i, candidate, itr)
+     {
+        it = elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb,
+                                      ctxdata);
+        //Tizen Only
+        if (i % 2)
+          elm_object_item_signal_emit(it, "elm,state,odd,item,set", "");
+     }
+}
+
+static Eina_Bool
+part_candidate_set(Evas_Object *ctxpopup, ctxpopup_data *ctxdata)
+{
+   view_data *vd = edj_mgr_view_get(NULL);
+   if (!vd) return EINA_FALSE;
+   Eina_List *parts = view_parts_list_get(vd);
+   if (!parts) return EINA_FALSE;
+   Eina_List *l;
+   char *part;
+   //Tizen Only
+   Elm_Object_Item *it;
+   int i = 0;
+
+   EINA_LIST_FOREACH(parts, l, part)
+     {
+        snprintf(ctxdata->candidate, sizeof(ctxdata->candidate), "\"%s\"",
+                 part);
+        it = elm_ctxpopup_item_append(ctxpopup, ctxdata->candidate, NULL,
+                                      ctxpopup_it_cb, ctxdata);
+        //Tizen Only
+        if (i % 2)
+          elm_object_item_signal_emit(it, "elm,state,odd,item,set", "");
+        i++;
+     }
+   view_string_list_free(parts);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+image_candidate_set(Evas_Object *ctxpopup, ctxpopup_data *ctxdata)
+{
+   view_data *vd = edj_mgr_view_get(NULL);
+   if (!vd) return EINA_FALSE;
+   Eina_List *parts = view_images_list_get(vd);
+   if (!parts) return EINA_FALSE;
+   Eina_List *l;
+   char *part;
+   //Tizen Only
+   Elm_Object_Item *it;
+   int i = 0;
+
+   EINA_LIST_FOREACH(parts, l, part)
+     {
+        it = elm_ctxpopup_item_append(ctxpopup, part, NULL, ctxpopup_it_cb,
+                                      ctxdata);
+        //Tizen Only
+        if (i % 2)
+          elm_object_item_signal_emit(it, "elm,state,odd,item,set", "");
+        i++;
+     }
+   view_string_list_free(parts);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+program_candidate_set(Evas_Object *ctxpopup, ctxpopup_data *ctxdata)
+{
+   const char *PROGRAM_GEN = "program_0x";
+   int PROGRAM_GEN_LEN = 10;
+   int candidate_cntr = 0;
+   view_data *vd = edj_mgr_view_get(NULL);
+   if (!vd) return EINA_FALSE;
+   Eina_List *parts = view_programs_list_get(vd);
+   if (!parts) return EINA_FALSE;
+   Eina_List *l;
+   char *part;
+   //Tizen Only
+   Elm_Object_Item *it;
+   int i = 0;
+
+   EINA_LIST_FOREACH(parts, l, part)
+     {
+        if (!strncmp(part, PROGRAM_GEN, PROGRAM_GEN_LEN))
+           continue;
+        snprintf(ctxdata->candidate, sizeof(ctxdata->candidate), "\"%s\"",
+                 part);
+        it = elm_ctxpopup_item_append(ctxpopup, ctxdata->candidate, NULL,
+                                      ctxpopup_it_cb, ctxdata);
+        //Tizen Only
+        if (i % 2)
+          elm_object_item_signal_emit(it, "elm,state,odd,item,set", "");
+        i++;
+
+        candidate_cntr++;
+     }
+   view_string_list_free(parts);
+   return candidate_cntr ? EINA_TRUE : EINA_FALSE;
+}
+
+static Eina_Bool
+state_candidate_set(Evas_Object *ctxpopup, ctxpopup_data *ctxdata,
+                    edit_data *ed)
+{
+   view_data *vd = edj_mgr_view_get(NULL);
+   if (!vd) return EINA_FALSE;
+
+   Eina_Stringshare *program = NULL;
+   Eina_List *targets = NULL;
+   Eina_Stringshare *target = NULL;
+   Eina_Bool ret = EINA_FALSE;
+
+   //Trace the part name from the program.
+   if (ctxdata->attr->program)
+     {
+        program = edit_cur_prog_name_get(ed);
+        if (!program) return EINA_FALSE;
+        targets = view_program_targets_get(vd, program);
+        if (!targets) goto end;
+        target = eina_list_data_get(targets);
+        if (!target) goto end;
+     }
+   //Trace the part name from the part.
+   else
+     {
+        target = edit_cur_part_name_get(ed);
+        if (!target) goto end;
+     }
+
+   Eina_List *states = view_part_states_list_get(vd, target);
+   if (!states) goto end;
+
+   /* Since the states have the name + float values, it needs to filterout the
+      values. */
+   Eina_List *converted = parser_states_filtered_name_get(states);
+
+   char *state;
+   //Tizen Only
+   Elm_Object_Item *it;
+   int i = 0;
+
+   EINA_LIST_FREE(converted, state)
+     {
+        snprintf(ctxdata->candidate, sizeof(ctxdata->candidate), "\"%s\"",
+                 state);
+        it = elm_ctxpopup_item_append(ctxpopup, ctxdata->candidate, NULL,
+                                      ctxpopup_it_cb, ctxdata);
+        //Tizen Only
+        if (i % 2)
+          elm_object_item_signal_emit(it, "elm,state,odd,item,set", "");
+        i++;
+
+        free(state);
+     }
+   view_string_list_free(states);
+   ret = EINA_TRUE;
+end:
+   eina_stringshare_del(program);
+   view_string_list_free(targets);
+   if (!ctxdata->attr->program && target) eina_stringshare_del(target);
+   return ret;
+}
+
+static void
+image_relay(ctxpopup_data *ctxdata, Eina_Bool up)
+{
+   if (!ctxdata->relay_cb) return;
+
+   if (up)
+     ctxdata->relay_cb(ctxdata->data, ctxdata->ctxpopup, (void *) 0);
+   else
+     ctxdata->relay_cb(ctxdata->data, ctxdata->ctxpopup, (void *) 1);
+}
+
+static void
+candidate_reset(ctxpopup_data *ctxdata)
+{
+   attr_value *attr = ctxdata->attr;
+   if (!attr) return;
+
+   //Colorselector Candidate
+   if (is_colorselector_type(ctxdata))
+     {
+        elm_colorselector_color_set(ctxdata->colorselector, attr->val[0],
+                                    attr->val[1], attr->val[2], attr->val[3]);
+        colorselector_changed_cb(ctxdata, ctxdata->colorselector, NULL);
+     }
+   //Toggle Candidate
+   else if (attr->type == ATTR_VALUE_BOOLEAN)
+     {
+        Eina_List *l;
+        Evas_Object *toggle;
+        int i = 0;
+        EINA_LIST_FOREACH(ctxdata->toggles, l, toggle)
+          {
+             elm_check_state_set(toggle, (Eina_Bool) roundf(attr->val[i]));
+             toggle_changed_cb(ctxdata, toggle, NULL);
+             i++;
+          }
+     }
+   //Slider Candidate
+   else if ((attr->type == ATTR_VALUE_INTEGER) ||
+            (attr->type == ATTR_VALUE_FLOAT))
+     {
+        Eina_List *l;
+        Evas_Object *slider;
+        int i = 0;
+        EINA_LIST_FOREACH(ctxdata->sliders, l, slider)
+          {
+             elm_slider_value_set(slider, attr->val[i]);
+             slider_changed_cb(ctxdata, slider, NULL);
+             i++;
+          }
+     }
+}
+
+static void
+ctxpopup_mouse_wheel_cb(void *data, Evas *e EINA_UNUSED,
+                        Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   Evas_Event_Mouse_Wheel *ev = event_info;
+   ctxpopup_data *ctxdata = data;
+
+   if (ev->z > 0) image_relay(ctxdata, EINA_FALSE);
+   else if (ev->z < 0) image_relay(ctxdata, EINA_TRUE);
+}
+
+static void
+ctxpopup_key_down_cb(void *data, Evas *e EINA_UNUSED,
+                     Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   Evas_Event_Key_Down *ev = event_info;
+   ctxpopup_data *ctxdata = data;
+
+   if (!strcmp(ev->key, "Down")) image_relay(ctxdata, EINA_FALSE);
+   else if (!strcmp(ev->key, "Up")) image_relay(ctxdata, EINA_TRUE);
+   else if (!strcmp(ev->key, "BackSpace")) candidate_reset(ctxdata);
+}
+
+static void
+key_grab_add(Evas_Object *keygrabber, const char *key)
+{
+   if (!evas_object_key_grab(keygrabber, key, 0, 0, EINA_TRUE))
+     EINA_LOG_ERR(_("Failed to grab key - %s"), key);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+ctxpopup_img_preview_reload(Evas_Object *ctxpopup, const char *imgpath)
+{
+   if (!ctxpopup) return;
+
+   Evas_Object *layout = elm_object_content_get(ctxpopup);
+   Evas_Object *img = elm_object_part_content_get(layout, "elm.swallow.img");
+   evas_object_image_file_set(img, imgpath, NULL);
+}
+
+Evas_Object *
+ctxpopup_img_preview_create(edit_data *ed,
+                            const char *imgpath,
+                            Evas_Smart_Cb ctxpopup_dismiss_cb,
+                            Evas_Smart_Cb ctxpopup_relay_cb)
+{
+   //create ctxpopup
+   Evas_Object *win = elm_object_top_widget_get(edit_obj_get(ed));
+   Evas_Object *ctxpopup = elm_ctxpopup_add(win);
+   if (!ctxpopup) return NULL;
+
+   elm_config_focus_autoscroll_mode_set(ELM_FOCUS_AUTOSCROLL_MODE_NONE);
+
+   elm_object_style_set(ctxpopup, "enventor");
+   elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_UP,
+                                       ELM_CTXPOPUP_DIRECTION_DOWN,
+                                       ELM_CTXPOPUP_DIRECTION_RIGHT,
+                                       ELM_CTXPOPUP_DIRECTION_LEFT);
+   //ctxpopup data
+   ctxpopup_data *ctxdata = calloc(1, sizeof(ctxpopup_data));
+   if (!ctxdata)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return NULL;
+     }
+   ctxdata->relay_cb = ctxpopup_relay_cb;
+   ctxdata->data = ed;
+   ctxdata->ctxpopup = ctxpopup;
+   evas_object_data_set(ctxpopup, "ctxpopup_data", ctxdata);
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(ctxpopup);
+   elm_layout_file_set(layout, EDJE_PATH, "preview_layout");
+   elm_object_content_set(ctxpopup, layout);
+
+   Evas *e = evas_object_evas_get(ctxpopup);
+   Evas_Object *img = evas_object_image_filled_add(e);
+   evas_object_image_file_set(img, imgpath, NULL);
+   Evas_Coord w, h;
+   evas_object_image_size_get(img, &w, &h);
+   evas_object_size_hint_aspect_set(img, EVAS_ASPECT_CONTROL_BOTH, w, h);
+   elm_object_part_content_set(layout, "elm.swallow.img", img);
+
+   evas_object_smart_callback_add(ctxpopup, "dismissed", ctxpopup_dismiss_cb,
+                                  ed);
+   evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, ctxpopup_del_cb,
+                                  ctxdata);
+   evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_KEY_DOWN,
+                                  ctxpopup_key_down_cb, ctxdata);
+   evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_MOUSE_WHEEL,
+                                  ctxpopup_mouse_wheel_cb, ctxdata);
+   evas_object_focus_set(ctxpopup, EINA_TRUE);
+
+   key_grab_add(ctxpopup, "Up");
+   key_grab_add(ctxpopup, "Down");
+   key_grab_add(ctxpopup, "BackSpace");
+
+   return ctxpopup;
+}
+
+static Eina_Bool
+is_colorselector_type(ctxpopup_data *ctxdata)
+{
+   ctxdata->integer = EINA_TRUE;
+   const char* integer_type = eina_array_data_get(ctxdata->attr->strs, 0);
+   if (!strcmp(integer_type, "R:"))
+     {
+       if (preset_colors.is_created == EINA_FALSE)
+         preset_colors.is_created = EINA_TRUE;
+
+        return EINA_TRUE;
+     }
+    return EINA_FALSE;
+}
+
+Evas_Object *
+ctxpopup_candidate_list_create(edit_data *ed, attr_value *attr,
+                               Evas_Smart_Cb ctxpopup_dismiss_cb,
+                               Evas_Smart_Cb ctxpopup_changed_cb,
+                               Enventor_Ctxpopup_Type *type)
+{
+   //create ctxpopup
+   Evas_Object *win = elm_object_top_widget_get(edit_obj_get(ed));
+   Evas_Object *ctxpopup = elm_ctxpopup_add(win);
+   if (!ctxpopup) return NULL;
+
+   elm_config_focus_autoscroll_mode_set(ELM_FOCUS_AUTOSCROLL_MODE_NONE);
+
+   elm_object_style_set(ctxpopup, "enventor");
+   elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_UP,
+                                       ELM_CTXPOPUP_DIRECTION_DOWN,
+                                       ELM_CTXPOPUP_DIRECTION_RIGHT,
+                                       ELM_CTXPOPUP_DIRECTION_LEFT);
+   //ctxpopup data
+   ctxpopup_data *ctxdata = calloc(1, sizeof(ctxpopup_data));
+   if (!ctxdata)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        goto err;
+     }
+   ctxdata->changed_cb = ctxpopup_changed_cb;
+   ctxdata->ctxpopup = ctxpopup;
+   ctxdata->attr = attr;
+   ctxdata->data = ed;
+
+   switch (attr->type)
+     {
+        case ATTR_VALUE_BOOLEAN:
+          {
+             toggle_layout_set(ctxpopup, ctxdata);
+             *type = ENVENTOR_CTXPOPUP_TYPE_TOGGLE;
+             break;
+          }
+        case ATTR_VALUE_INTEGER:
+          {
+             ctxdata->integer = EINA_TRUE;
+             if (is_colorselector_type(ctxdata))
+               colorselector_layout_set(ctxpopup, ctxdata);
+             else
+               slider_layout_set(ctxpopup, ctxdata);
+             *type = ENVENTOR_CTXPOPUP_TYPE_SLIDER;
+             break;
+          }
+        case ATTR_VALUE_FLOAT:
+          {
+             ctxdata->integer = EINA_FALSE;
+             slider_layout_set(ctxpopup, ctxdata);
+             *type = ENVENTOR_CTXPOPUP_TYPE_SLIDER;
+             break;
+          }
+        case ATTR_VALUE_CONSTANT:
+          {
+             constant_candidate_set(ctxpopup, ctxdata);
+             *type = ENVENTOR_CTXPOPUP_TYPE_LIST;
+             break;
+          }
+        case ATTR_VALUE_PART:
+          {
+             if (!part_candidate_set(ctxpopup, ctxdata)) goto err;
+             *type = ENVENTOR_CTXPOPUP_TYPE_LIST;
+             break;
+          }
+        case ATTR_VALUE_STATE:
+          {
+             if (!state_candidate_set(ctxpopup, ctxdata, ed)) goto err;
+             *type = ENVENTOR_CTXPOPUP_TYPE_LIST;
+             break;
+          }
+        case ATTR_VALUE_IMAGE:
+          {
+             if (!image_candidate_set(ctxpopup, ctxdata)) goto err;
+             *type = ENVENTOR_CTXPOPUP_TYPE_IMAGE;
+             break;
+          }
+        case ATTR_VALUE_PROGRAM:
+          {
+             if (!program_candidate_set(ctxpopup, ctxdata)) goto err;
+             *type = ENVENTOR_CTXPOPUP_TYPE_LIST;
+             break;
+          }
+   }
+   evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_KEY_DOWN,
+                                  ctxpopup_key_down_cb, ctxdata);
+   evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, ctxpopup_del_cb,
+                                  ctxdata);
+   evas_object_smart_callback_add(ctxpopup, "dismissed", ctxpopup_dismiss_cb,
+                                  ed);
+
+   key_grab_add(ctxpopup, "Up");
+   key_grab_add(ctxpopup, "Down");
+   key_grab_add(ctxpopup, "BackSpace");
+
+   return ctxpopup;
+
+err:
+   free(ctxdata);
+   evas_object_del(ctxpopup);
+
+   return NULL;
+}
diff --git a/src/lib/dummy_obj.c b/src/lib/dummy_obj.c
new file mode 100644 (file)
index 0000000..c30685b
--- /dev/null
@@ -0,0 +1,290 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#define EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT 1
+
+#include <Enventor.h>
+#include <Edje_Edit.h>
+#include "enventor_private.h"
+
+typedef struct part_obj_s
+{
+   Evas_Object *obj;
+   Eina_Stringshare *name;
+} part_obj;
+
+typedef struct dummy_obj_s
+{
+   Evas_Object *layout;
+   Eina_List *swallows;
+   Eina_List *spacers;
+   Ecore_Animator *animator;
+} dummy_obj;
+
+const char *DUMMYOBJ = "dummy_obj";
+const char *EDIT_LAYOUT_KEY = "edit_layout";
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+static void
+edje_part_clicked(void *data, Evas *e EINA_UNUSED,
+                  Evas_Object *obj, void *ei EINA_UNUSED)
+{
+   part_obj *po = (part_obj *)data;
+   Evas_Object *layout = evas_object_data_get(obj, EDIT_LAYOUT_KEY);
+   evas_object_smart_callback_call(layout, "dummy,clicked", (char *)(po->name));
+}
+
+static void
+dummy_objs_update(dummy_obj *dummy)
+{
+   Eina_List *parts = edje_edit_parts_list_get(dummy->layout);
+   Eina_List *l, *l_next, *l2;
+   char *part_name;
+   Edje_Part_Type type = EDJE_PART_TYPE_NONE;
+   part_obj *po;
+   Evas *evas = evas_object_evas_get(dummy->layout);
+   Eina_Bool removed;
+
+   //Remove the fake swallow objects that parts are removed.
+   EINA_LIST_FOREACH_SAFE(dummy->swallows, l, l_next, po)
+     {
+        removed = EINA_TRUE;
+
+        EINA_LIST_FOREACH(parts, l2, part_name)
+          {
+             if (!part_name || !po->name[0]) continue;
+             if (po->name[0] != part_name[0]) continue;
+             if ((strlen(po->name) != strlen(part_name))) continue;
+             if (!strcmp(po->name, part_name))
+               {
+                  type = edje_edit_part_type_get(dummy->layout, part_name);
+                  if (type == EDJE_PART_TYPE_SWALLOW)
+                    removed = EINA_FALSE;
+                  break;
+               }
+          }
+        if (removed)
+          {
+             evas_object_del(po->obj);
+             eina_stringshare_del(po->name);
+             dummy->swallows = eina_list_remove_list(dummy->swallows, l);
+             free(po);
+          }
+     }
+
+   //Remove the fake swallow objects that parts are removed.
+   EINA_LIST_FOREACH_SAFE(dummy->spacers, l, l_next, po)
+     {
+        removed = EINA_TRUE;
+
+        EINA_LIST_FOREACH(parts, l2, part_name)
+          {
+             if (po->name[0] != part_name[0]) continue;
+             if ((strlen(po->name) != strlen(part_name))) continue;
+             if (!strcmp(po->name, part_name))
+               {
+                  type = edje_edit_part_type_get(dummy->layout, part_name);
+                  if (type == EDJE_PART_TYPE_SPACER)
+                    removed = EINA_FALSE;
+                  break;
+               }
+          }
+        if (removed)
+          {
+             evas_object_del(po->obj);
+             eina_stringshare_del(po->name);
+             dummy->spacers = eina_list_remove_list(dummy->spacers, l);
+             free(po);
+          }
+     }
+
+   //Trick!. set smart members of actual live view object.
+   Evas_Object *scroller = view_obj_get(VIEW_DATA);
+   if (!scroller) goto end;
+   Evas_Object *o = elm_object_content_get(scroller);
+   if (!o) goto end;
+   Evas_Object *o2 =
+      elm_object_part_content_get(o, "elm.swallow.content");
+   if (!o2) goto end;
+
+   //Add new part object or Update changed part.
+   EINA_LIST_FOREACH(parts, l, part_name)
+     {
+        type = edje_edit_part_type_get(dummy->layout, part_name);
+
+        if (type == EDJE_PART_TYPE_SWALLOW)
+          {
+             //Check this part is exist
+             if (edje_object_part_swallow_get(dummy->layout, part_name))
+               continue;
+
+             po = malloc(sizeof(part_obj));
+             if (!po)
+               {
+                  EINA_LOG_ERR("Failed to allocate Memory!");
+                  continue;
+               }
+
+             //New part. Add fake object.
+             Evas_Object *obj = edje_object_add(evas);
+             if (!edje_object_file_set(obj, EDJE_PATH, "swallow"))
+               EINA_LOG_ERR("Failed to set File to Edje Object!");
+             edje_object_part_swallow(dummy->layout, part_name, obj);
+
+             po->obj = obj;
+             evas_object_data_set(po->obj, EDIT_LAYOUT_KEY, dummy->layout);
+             po->name = eina_stringshare_add(part_name);
+             dummy->swallows = eina_list_append(dummy->swallows, po);
+             evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
+                                            edje_part_clicked, po);
+          }
+        else if (type == EDJE_PART_TYPE_SPACER)
+          {
+             Eina_List *spacer_l;
+             Evas_Object *obj = NULL;
+             int x = 0, y = 0, w = 0, h = 0, lx = 0, ly = 0;
+
+             EINA_LIST_FOREACH(dummy->spacers, spacer_l, po)
+                if (po->name == part_name)
+                  {
+                     obj = po->obj;
+                     break;
+                  }
+             if (!obj)
+               {
+                  obj = edje_object_add(evas);
+                  edje_object_file_set(obj, EDJE_PATH, "spacer");
+                  evas_object_smart_member_add(obj, o2);
+
+                  po = malloc(sizeof(part_obj));
+                  po->obj = obj;
+                  po->name = eina_stringshare_add(part_name);
+                  dummy->spacers = eina_list_append(dummy->spacers, po);
+                  evas_object_show(obj);
+                  evas_object_data_set(obj, EDIT_LAYOUT_KEY, dummy->layout);
+
+                  evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
+                                                 edje_part_clicked, po);
+               }
+             evas_object_geometry_get(dummy->layout, &lx, &ly, NULL, NULL);
+             edje_object_part_geometry_get(dummy->layout, part_name, &x, &y, &w, &h);
+             evas_object_resize(obj, w, h);
+             evas_object_move(obj, lx + x, ly + y);
+          }
+     }
+end:
+   edje_edit_string_list_free(parts);
+}
+
+static void
+layout_geom_changed_cb(void *data, Evas *evas EINA_UNUSED,
+                       Evas_Object *obj, void *ei EINA_UNUSED)
+{
+   dummy_obj *dummy = (dummy_obj *)data;
+
+   Eina_List *spacer_l;
+   part_obj *po;
+   int x = 0, y = 0, w = 0, h = 0, lx = 0, ly = 0;
+
+   evas_object_geometry_get(obj, &lx, &ly, NULL, NULL);
+
+   EINA_LIST_FOREACH(dummy->spacers, spacer_l, po)
+     if (edje_object_part_exists(obj, po->name))
+       {
+          edje_object_part_geometry_get(obj, po->name, &x, &y, &w, &h);
+          evas_object_resize(po->obj, w, h);
+          evas_object_move(po->obj, lx + x, ly + y);
+       }
+}
+static Eina_Bool
+animator_cb(void *data)
+{
+   dummy_obj *dummy = data;
+   dummy_objs_update(dummy);
+   dummy->animator = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+layout_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
+              void *event_info EINA_UNUSED)
+{
+   dummy_obj_del(obj);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+dummy_obj_update(Evas_Object *layout)
+{
+   dummy_obj *dummy = evas_object_data_get(layout, DUMMYOBJ);
+   if (!dummy) return;
+   dummy_objs_update(dummy);
+}
+
+void
+dummy_obj_new(Evas_Object *layout)
+{
+   if (!layout) return;
+
+   dummy_obj *dummy = evas_object_data_get(layout, DUMMYOBJ);
+   if (dummy) return;
+
+   dummy = calloc(1, sizeof(dummy_obj));
+   if (!dummy)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return;
+     }
+
+   Ecore_Animator *animator = ecore_animator_add(animator_cb, dummy);
+   evas_object_data_set(layout, DUMMYOBJ, dummy);
+
+   evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, layout_del_cb,
+                                  dummy);
+
+   evas_object_event_callback_add(layout, EVAS_CALLBACK_RESIZE,
+                                  layout_geom_changed_cb, dummy);
+   evas_object_event_callback_add(layout, EVAS_CALLBACK_MOVE,
+                                  layout_geom_changed_cb, dummy);
+   dummy->layout = layout;
+   dummy->animator = animator;
+}
+
+void
+dummy_obj_del(Evas_Object *layout)
+{
+   dummy_obj *dummy = evas_object_data_get(layout, DUMMYOBJ);
+   if (!dummy) return;
+
+   evas_object_event_callback_del_full(layout, EVAS_CALLBACK_RESIZE,
+                                  layout_geom_changed_cb, dummy);
+   evas_object_event_callback_del_full(layout, EVAS_CALLBACK_MOVE,
+                                  layout_geom_changed_cb, dummy);
+
+   part_obj *po;
+   EINA_LIST_FREE(dummy->swallows, po)
+     {
+        evas_object_del(po->obj);
+        eina_stringshare_del(po->name);
+        free(po);
+     }
+
+   EINA_LIST_FREE(dummy->spacers, po)
+     {
+        evas_object_del(po->obj);
+        eina_stringshare_del(po->name);
+        free(po);
+     }
+
+   ecore_animator_del(dummy->animator);
+   free(dummy);
+
+   evas_object_data_set(layout, DUMMYOBJ, NULL);
+   evas_object_event_callback_del(layout, EVAS_CALLBACK_DEL, layout_del_cb);
+}
diff --git a/src/lib/edc_editor.c b/src/lib/edc_editor.c
new file mode 100644 (file)
index 0000000..23331d8
--- /dev/null
@@ -0,0 +1,2113 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#define ENVENTOR_BETA_API_SUPPORT 1
+
+#include <Enventor.h>
+#include <Eio.h>
+#include "enventor_private.h"
+
+//FIXME: Make flexible
+const int MAX_LINE_DIGIT_CNT = 10;
+const int SYNTAX_COLOR_SPARE_LINES = 42;
+const double SYNTAX_COLOR_DEFAULT_TIME = 0.25;
+const double SYNTAX_COLOR_SHORT_TIME = 0.025;
+
+typedef struct syntax_color_thread_data_s
+{
+   Ecore_Thread *thread;
+   edit_data *ed;
+   char *text;
+   const char *translated;
+} syntax_color_td;
+
+struct editor_s
+{
+   Evas_Object *en_edit;
+   Evas_Object *en_line;
+   Evas_Object *scroller;
+   Evas_Object *layout;
+   Evas_Object *ctxpopup;
+   Enventor_Object *enventor;
+   Enventor_Item *it;
+   Eina_Stringshare *filepath;
+
+   syntax_helper *sh;
+   parser_data *pd;
+   redoundo_data *rd;
+
+   int cur_line;
+   int line_max;
+   int error_line;
+   int syntax_color_lock;
+   int cursor_pos;
+   int ctxpopup_cursor_pos;
+   Evas_Coord scroller_h;
+
+   struct {
+      int prev_left;
+      int prev_right;
+      int left;
+      int right;
+   } bracket;
+
+   Ecore_Timer *syntax_color_timer;
+   syntax_color_td *sctd;
+
+   void (*view_sync_cb)(void *data, Eina_Stringshare *state_name, double state_value,
+                        Eina_Stringshare *part_name, Eina_Stringshare *group_name);
+   void *view_sync_cb_data;
+   int select_pos;
+   const char *error_target;
+
+   Eina_Bool edit_changed : 1;
+   Eina_Bool ctrl_pressed : 1;
+   Eina_Bool on_select_recover : 1;
+   Eina_Bool on_save : 1;
+   Eina_Bool main : 1;
+   Eina_Bool disabled : 1;
+};
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static Eina_Bool
+image_preview_show(edit_data *ed, char *cur, Evas_Coord x, Evas_Coord y);
+static void
+error_line_num_highlight(edit_data *ed);
+
+static void
+line_init(edit_data *ed)
+{
+   char buf[MAX_LINE_DIGIT_CNT];
+
+   ed->line_max = 1;
+   snprintf(buf, sizeof(buf), "%d", ed->line_max);
+   elm_entry_entry_set(ed->en_line, buf);
+}
+
+static void
+visible_text_region_get(edit_data *ed, int *from_line, int *to_line)
+{
+   Evas_Coord region_y, region_h;
+   Evas_Coord cursor_h;
+
+   elm_scroller_region_get(ed->scroller, NULL, &region_y, NULL, &region_h);
+   elm_entry_cursor_geometry_get(ed->en_edit, NULL, NULL, NULL, &cursor_h);
+
+   int from = (region_y / cursor_h);
+   int to = from + (region_h / cursor_h);
+   from -= SYNTAX_COLOR_SPARE_LINES;
+   to += SYNTAX_COLOR_SPARE_LINES;
+
+   if (from < 1) from = 1;
+   if (to > ed->line_max) to = ed->line_max;
+
+   *from_line = from;
+   *to_line = to;
+}
+
+static void
+entry_recover_param_get(edit_data *ed,
+                        int *cursor_pos,
+                        int *sel_cur_begin,
+                        int *sel_cur_end)
+{
+   if (cursor_pos)
+     *cursor_pos = elm_entry_cursor_pos_get(ed->en_edit);
+
+   Edje_Object *en_edje;
+   if (sel_cur_begin || sel_cur_end)
+     {
+        en_edje = elm_layout_edje_get(ed->en_edit);
+        if (elm_entry_scrollable_get(ed->en_edit))
+          en_edje = edje_object_part_swallow_get(en_edje, "elm.swallow.content");
+     }
+
+   if (sel_cur_begin)
+     *sel_cur_begin = edje_object_part_text_cursor_pos_get
+                      (en_edje, "elm.text", EDJE_CURSOR_SELECTION_BEGIN);
+   if (sel_cur_end)
+     *sel_cur_end = edje_object_part_text_cursor_pos_get
+                    (en_edje, "elm.text", EDJE_CURSOR_SELECTION_END);
+}
+
+static void
+entry_recover(edit_data *ed, int cursor_pos, int sel_cur_begin, int sel_cur_end)
+{
+   elm_entry_calc_force(ed->en_edit);
+   //recover cursor position??
+   elm_entry_cursor_pos_set(ed->en_edit, 0);
+   elm_entry_cursor_pos_set(ed->en_edit, cursor_pos);
+
+   Edje_Object *en_edje = elm_layout_edje_get(ed->en_edit);
+   if (elm_entry_scrollable_get(ed->en_edit))
+     en_edje = edje_object_part_swallow_get(en_edje, "elm.swallow.content");
+
+   //recover selection cursor
+   edje_object_part_text_cursor_pos_set(en_edje, "elm.text",
+                            EDJE_CURSOR_SELECTION_BEGIN, sel_cur_begin);
+   edje_object_part_text_cursor_pos_set(en_edje, "elm.text",
+                            EDJE_CURSOR_SELECTION_END, sel_cur_end);
+
+   ed->on_select_recover = EINA_FALSE;
+}
+
+void
+edit_font_update(edit_data *ed)
+{
+  if (!ed) return;
+
+   elm_entry_calc_force(ed->en_line);
+   elm_entry_calc_force(ed->en_edit);
+}
+
+static void
+error_highlight(edit_data *ed, Evas_Object *tb)
+{
+   Evas_Textblock_Cursor *cur1 = evas_object_textblock_cursor_new(tb);
+   error_line_num_highlight(ed);
+   char *p;
+   if (ed->error_line != -1)
+     {
+        evas_textblock_cursor_line_set(cur1, ed->error_line);
+        evas_textblock_cursor_line_char_first(cur1);
+        while((p = evas_textblock_cursor_content_get(cur1)) && (*p == ' '))
+          {
+             evas_textblock_cursor_char_next(cur1);
+             free(p);
+          }
+        free(p);
+        evas_object_textblock_text_markup_prepend(cur1, "<error>");
+        evas_textblock_cursor_line_char_last(cur1);
+        evas_object_textblock_text_markup_prepend(cur1, "</error>");
+     }
+   else if (ed->error_target)
+     {
+        const char *ptr = NULL;
+        const char *par = NULL;
+        while (evas_textblock_cursor_paragraph_next(cur1))
+          {
+             par = evas_textblock_cursor_paragraph_text_get(cur1);
+             if (par && (ptr = strstr(par, ed->error_target)))
+                break;
+          }
+        evas_textblock_cursor_paragraph_char_first(cur1);
+        while((p = evas_textblock_cursor_content_get(cur1)) && (*p == ' '))
+          {
+             evas_textblock_cursor_char_next(cur1);
+             free(p);
+          }
+        free(p);
+        evas_object_textblock_text_markup_prepend(cur1, "<error>");
+        evas_textblock_cursor_paragraph_char_last(cur1);
+        evas_object_textblock_text_markup_prepend(cur1, "</error>");
+     }
+   evas_textblock_cursor_free(cur1);
+}
+
+static void
+bracket_highlight(edit_data *ed, Evas_Object *tb)
+{
+   Evas_Textblock_Cursor *cur1 = evas_object_textblock_cursor_new(tb);
+
+   evas_textblock_cursor_pos_set(cur1, ed->bracket.left);
+   evas_object_textblock_text_markup_prepend(cur1, "<hilight>");
+   evas_textblock_cursor_pos_set(cur1, ed->bracket.left + 1);
+   evas_object_textblock_text_markup_prepend(cur1, "</hilight>");
+
+   evas_textblock_cursor_pos_set(cur1, ed->bracket.right);
+   evas_object_textblock_text_markup_prepend(cur1, "<hilight>");
+   evas_textblock_cursor_pos_set(cur1, ed->bracket.right + 1);
+   evas_object_textblock_text_markup_prepend(cur1, "</hilight>");
+
+   evas_textblock_cursor_free(cur1);
+}
+
+static void
+syntax_color_apply(edit_data *ed, Eina_Bool partial)
+{
+   Evas_Object *tb = elm_entry_textblock_get(ed->en_edit);
+   char *text = (char *) evas_object_textblock_text_markup_get(tb);
+
+   int from_line = 1;
+   int to_line = -1;
+   if (partial) visible_text_region_get(ed, &from_line, &to_line);
+
+   char *from = NULL;
+   char *to = NULL;
+   char *utf8 = (char *) color_cancel(NULL, syntax_color_data_get(ed->sh), text,
+                                      strlen(text), from_line, to_line, &from,
+                                      &to);
+   if (!utf8) return;
+
+   const char *translated = color_apply(NULL, syntax_color_data_get(ed->sh),
+                                        utf8, strlen(utf8), from, to);
+   if (!translated) return;
+
+   /* I'm not sure this will be problem.
+      But it can avoid entry_object_text_escaped_set() in Edje.
+      Logically that's unnecessary in this case. */
+   int cursor_pos, sel_cur_begin, sel_cur_end;
+   entry_recover_param_get(ed, &cursor_pos, &sel_cur_begin, &sel_cur_end);
+   evas_object_textblock_text_markup_set(tb, translated);
+   error_highlight(ed, tb);
+   bracket_highlight(ed, tb);
+   entry_recover(ed, cursor_pos, sel_cur_begin, sel_cur_end);
+}
+
+static Eina_Bool
+syntax_color_timer_cb(void *data)
+{
+   edit_data *ed = data;
+   syntax_color_apply(ed, EINA_TRUE);
+   ed->syntax_color_timer = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+syntax_color_partial_update(edit_data *ed, double interval)
+{
+   /* If the syntax_color_full_update is requested forcely, lock would be -1
+      in this case, it should avoid partial updation by entry changed. */
+   if (ed->syntax_color_lock != 0) return;
+   if (ed->sctd)
+     {
+        ecore_thread_cancel(ed->sctd->thread);
+        ed->sctd->ed = NULL;
+        ed->sctd = NULL;
+     }
+   ecore_timer_del(ed->syntax_color_timer);
+   ed->syntax_color_timer = ecore_timer_add(interval, syntax_color_timer_cb,
+                                            ed);
+}
+
+static void
+syntax_color_thread_cb(void *data, Ecore_Thread *thread)
+{
+   syntax_color_td *td = data;
+   char *utf8 = (char *) color_cancel(thread, syntax_color_data_get(td->ed->sh),
+                                      td->text, strlen(td->text), -1, -1, NULL,
+                                      NULL);
+   if (!utf8) return;
+   td->translated = color_apply(thread, syntax_color_data_get(td->ed->sh), utf8,
+                                strlen(utf8), NULL, NULL);
+}
+
+static void
+syntax_color_thread_cancel_cb(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   syntax_color_td *td = data;
+   if (td->ed && td->ed->sctd == td) td->ed->sctd = NULL;
+   free(td);
+}
+
+static void
+syntax_color_thread_end_cb(void *data, Ecore_Thread *thread)
+{
+   syntax_color_td *td = data;
+   if (!td->translated) goto end;
+
+   Evas_Object *tb = elm_entry_textblock_get(td->ed->en_edit);
+
+   /* I'm not sure this will be problem.
+      But it can avoid entry_object_text_escaped_set() in Edje.
+      Logically that's unnecessary in this case. */
+   int cursor_pos, sel_cur_begin, sel_cur_end;
+   entry_recover_param_get(td->ed, &cursor_pos, &sel_cur_begin, &sel_cur_end);
+   evas_object_textblock_text_markup_set(tb, td->translated);
+   error_highlight(td->ed, tb);
+   bracket_highlight(td->ed, tb);
+   entry_recover(td->ed, cursor_pos, sel_cur_begin, sel_cur_end);
+
+end:
+   syntax_color_thread_cancel_cb(data, thread);
+}
+
+static void
+bracket_changed_cb(void *data, int left, int right)
+{
+   edit_data *ed = data;
+
+   ed->bracket.left = left;
+   ed->bracket.right = right;
+
+   if ((left != -1) && (right != -1))
+     {
+        if ((ed->bracket.prev_left != left) &&
+            (ed->bracket.prev_right != right))
+          {
+             syntax_color_partial_update(ed, SYNTAX_COLOR_SHORT_TIME);
+
+             ed->bracket.prev_left = left;
+             ed->bracket.prev_right = right;
+          }
+     }
+   else if((ed->bracket.prev_left != -1) && (ed->bracket.prev_right != -1))
+     {
+        syntax_color_partial_update(ed, SYNTAX_COLOR_SHORT_TIME);
+
+        ed->bracket.prev_left = -1;
+        ed->bracket.prev_right = -1;
+     }
+}
+
+static void
+bracket_update(edit_data *ed)
+{
+   int pos = elm_entry_cursor_pos_get(ed->en_edit);
+   if (pos == 0)
+     {
+        ed->cursor_pos = 0;
+        return;
+     }
+   if (pos == ed->cursor_pos) return;
+
+   ed->cursor_pos = pos;
+   Evas_Object *tb = elm_entry_textblock_get(ed->en_edit);
+   Evas_Textblock_Cursor *cur1 = evas_object_textblock_cursor_get(tb);
+
+   char *ch1 = NULL;
+   char *ch2 = NULL;
+
+   ch1 = evas_textblock_cursor_content_get(cur1);
+   Eina_Bool is_exist = evas_textblock_cursor_char_prev(cur1);
+   if (is_exist)
+     ch2 = evas_textblock_cursor_content_get(cur1);
+   evas_textblock_cursor_char_next(cur1);
+
+   if (is_exist && (*ch1 != '{') && (*ch1 != '}') && (*ch2 != '{')
+       && (*ch2 != '}'))
+     {
+        if (ed->bracket.prev_left != -1 && ed->bracket.prev_right != -1)
+          {
+             //initialize bracket
+             ed->bracket.left = -1;
+             ed->bracket.right = -1;
+             ed->bracket.prev_left = -1;
+             ed->bracket.prev_right = -1;
+
+             syntax_color_partial_update(ed, SYNTAX_COLOR_SHORT_TIME);
+          }
+        free(ch1);
+        free(ch2);
+        return;
+     }
+   parser_bracket_find(ed->pd, ed->en_edit, bracket_changed_cb, ed);
+   free(ch1);
+   free(ch2);
+}
+
+static void
+edit_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   Elm_Entry_Change_Info *info = event_info;
+   edit_data *ed = data;
+   edit_changed_set(ed, EINA_TRUE);
+
+   Eina_Bool syntax_color = EINA_TRUE;
+   ed->error_line = -1;
+   eina_stringshare_del(ed->error_target);
+   ed->error_target = NULL;
+
+   Eina_Bool ret;
+
+   if (info->insert)
+     {
+        int increase = 0;
+        if ((info->change.insert.plain_length == 1)&&
+            (info->change.insert.content[0] == ' ')) return;
+
+        if (!strcmp(info->change.insert.content, EOL))
+          {
+             increase++;
+             syntax_color = EINA_FALSE;
+          }
+        else
+          {
+             increase =
+                parser_line_cnt_get(ed->pd, info->change.insert.content);
+          }
+
+        if (eo_do_ret(ed->enventor, ret, enventor_obj_auto_indent_get()))
+          {
+             increase =
+                indent_insert_apply(syntax_indent_data_get(ed->sh),
+                                    info->change.insert.content, ed->cur_line);
+          }
+        edit_line_increase(ed, increase);
+
+     }
+   else
+     {
+        if (eo_do_ret(ed->enventor, ret, enventor_obj_auto_indent_get()))
+          {
+             indent_delete_apply(syntax_indent_data_get(ed->sh),
+                                 info->change.del.content, ed->cur_line);
+          }
+
+        int decrease = parser_line_cnt_get(ed->pd, info->change.del.content);
+        edit_line_decrease(ed, decrease);
+        if (info->change.del.content[0] == ' ') return;
+     }
+
+
+   if (!syntax_color) return;
+   syntax_color_partial_update(ed, SYNTAX_COLOR_DEFAULT_TIME);
+
+   parser_bracket_cancel(ed->pd);
+}
+
+static void
+ctxpopup_candidate_dismiss_cb(void *data, Evas_Object *obj,
+                              void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+
+   int cur_pos = elm_entry_cursor_pos_get(ed->en_edit);
+   elm_entry_cursor_line_end_set(ed->en_edit);
+   int end_pos = elm_entry_cursor_pos_get(ed->en_edit);
+   int i = 0;
+   char *ch = NULL;
+
+   for (i = cur_pos; i <= end_pos; i++)
+     {
+        elm_entry_cursor_pos_set(ed->en_edit, i);
+        ch = elm_entry_cursor_content_get(ed->en_edit);
+        if (*ch == ';')
+          {
+             elm_entry_cursor_pos_set(ed->en_edit, i + 1);
+             free(ch);
+             break;
+          }
+        free(ch);
+     }
+
+   evas_object_del(obj);
+   elm_object_tree_focus_allow_set(ed->layout, EINA_TRUE);
+   elm_object_focus_set(ed->en_edit, EINA_TRUE);
+   evas_object_smart_callback_call(ed->enventor, SIG_CTXPOPUP_DISMISSED, NULL);
+}
+
+static void
+ctxpopup_candidate_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                              void *event_info)
+{
+   edit_data *ed = data;
+   const char *text = event_info;
+   char *ch = NULL;
+   int cur_pos, end_pos;
+   int i;
+
+   cur_pos = ed->ctxpopup_cursor_pos;
+   elm_entry_cursor_pos_set(ed->en_edit, cur_pos);
+   elm_entry_cursor_line_end_set(ed->en_edit);
+   end_pos = elm_entry_cursor_pos_get(ed->en_edit);
+
+   for (i = cur_pos; i <= end_pos; i++)
+     {
+        elm_entry_cursor_pos_set(ed->en_edit, i);
+        ch = elm_entry_cursor_content_get(ed->en_edit);
+        if (!strcmp(ch, ";"))
+          {
+             //1 more space for end_pos to replace until ';'.
+             end_pos = elm_entry_cursor_pos_get(ed->en_edit) + 1;
+             free(ch);
+             break;
+          }
+        free(ch);
+     }
+
+   elm_entry_select_region_set(ed->en_edit, cur_pos, end_pos);
+
+   if (!ed->ctxpopup) return;
+
+   redoundo_text_relative_push(ed->rd, text);
+   elm_entry_entry_insert(ed->en_edit, text);
+   elm_entry_calc_force(ed->en_edit);
+
+   elm_entry_cursor_pos_set(ed->en_edit, cur_pos);
+
+   edit_changed_set(ed, EINA_TRUE);
+   evas_object_smart_callback_call(ed->enventor, SIG_CTXPOPUP_CHANGED,
+                                   ed->it);
+}
+
+static void
+ctxpopup_preview_dismiss_cb(void *data, Evas_Object *obj,
+                            void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+
+   //Since the ctxpopup will be shown again, Don't revert the focus.
+   elm_object_tree_focus_allow_set(ed->layout, EINA_TRUE);
+   elm_object_focus_set(ed->en_edit, EINA_TRUE);
+   evas_object_smart_callback_call(ed->enventor, SIG_CTXPOPUP_DISMISSED,
+                                   ed->it);
+   evas_object_del(obj);
+}
+
+static void
+ctxpopup_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   ed->ctxpopup = NULL;
+}
+
+//This function is called when user press up/down key or mouse wheel up/down
+static void
+preview_img_relay_show(edit_data *ed, Evas_Object *ctxpopup, Eina_Bool next)
+{
+   if (next) elm_entry_cursor_down(ed->en_edit);
+   else elm_entry_cursor_up(ed->en_edit);
+
+   Evas_Object *textblock = elm_entry_textblock_get(ed->en_edit);
+   Evas_Textblock_Cursor *cursor = evas_object_textblock_cursor_get(textblock);
+   const char *str = evas_textblock_cursor_paragraph_text_get(cursor);
+   char *text = elm_entry_markup_to_utf8(str);
+
+   //Compute current ctxpopup position.
+   Evas_Coord x, y, h;
+   evas_object_geometry_get(ctxpopup, &x, &y, NULL, NULL);
+   elm_entry_cursor_geometry_get(ed->en_edit, NULL, NULL, NULL, &h);
+
+   if (next) y += h;
+   else y -= h;
+
+   //Limit the ctxpopup position in the scroller vertical zone.
+   Evas_Coord scrl_y, scrl_h;
+   evas_object_geometry_get(ed->scroller, NULL, &scrl_y, NULL, &scrl_h);
+
+   if (y > (scrl_y + scrl_h)) y = (scrl_y + scrl_h);
+   else if (y < scrl_y) y = scrl_y;
+
+   if (image_preview_show(ed, text, x, y))
+     {
+        //Set the entry selection region to next image.
+        const char *colon = strstr(text, ":");
+        if (!colon) goto end;
+
+        const char *image = strstr(text, "image");
+        if (!image) goto end;
+
+        //Check validation
+        if (0 >= (colon - image)) goto end;
+
+        //Compute new selection region.
+        elm_entry_cursor_line_begin_set(ed->en_edit);
+        int cur_pos = elm_entry_cursor_pos_get(ed->en_edit);
+        int begin = cur_pos + (image - text);
+        elm_entry_select_region_set(ed->en_edit, begin,
+                                    (begin + (int) (colon - image)));
+        free(text);
+        return;
+     }
+end:
+   elm_ctxpopup_dismiss(ctxpopup);
+   free(text);
+}
+
+static void
+ctxpopup_preview_relay_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   edit_data *ed = data;
+   int next = (int)(uintptr_t) event_info;
+   preview_img_relay_show(ed, obj, (Eina_Bool) next);
+}
+
+static Eina_Bool
+image_preview_show(edit_data *ed, char *cur, Evas_Coord x, Evas_Coord y)
+{
+   char *filename = parser_name_get(ed->pd, cur);
+   if (!filename) return EINA_FALSE;
+
+   char fullpath[PATH_MAX];
+
+   //1.Find the image path.
+   Eina_List *list = build_path_get(ENVENTOR_PATH_TYPE_IMAGE);
+   Eina_List *l;
+   char *path;
+   Eina_Bool found = EINA_FALSE;
+
+   EINA_LIST_FOREACH(list, l, path)
+     {
+        snprintf(fullpath, sizeof(fullpath), "%s/%s", path, filename);
+        if (!ecore_file_exists(fullpath)) continue;
+        found = EINA_TRUE;
+        break;
+     }
+
+   //2. Find in the default fault.
+   if (!found)
+   {
+      snprintf(fullpath, sizeof(fullpath), "%s/images/%s",
+               elm_app_data_dir_get(), filename);
+      if (ecore_file_exists(fullpath)) found = EINA_TRUE;
+   }
+
+   Eina_Bool succeed;
+
+   //Create Ctxpopup with the image pathes.
+   if (found)
+     {
+        /*In case if ctxpopup already created, then just reload image. */
+        if (ed->ctxpopup)
+          ctxpopup_img_preview_reload(ed->ctxpopup, fullpath);
+        else
+          {
+            ed->ctxpopup =
+                ctxpopup_img_preview_create(ed, fullpath,
+                                            ctxpopup_preview_dismiss_cb,
+                                            ctxpopup_preview_relay_cb);
+             evas_object_event_callback_add(ed->ctxpopup, EVAS_CALLBACK_DEL,
+                                            ctxpopup_del_cb, ed);
+          }
+
+        if (!ed->ctxpopup)
+          {
+             free(filename);
+             return EINA_FALSE;
+          }
+
+        evas_object_move(ed->ctxpopup, x, y);
+        evas_object_show(ed->ctxpopup);
+        Enventor_Ctxpopup_Type type = ENVENTOR_CTXPOPUP_TYPE_IMAGE;
+        evas_object_smart_callback_call(ed->enventor, SIG_CTXPOPUP_ACTIVATED,
+                                        (void *) type);
+        elm_object_tree_focus_allow_set(ed->layout, EINA_FALSE);
+        succeed = EINA_TRUE;
+     }
+   else
+     {
+        succeed = EINA_FALSE;
+     }
+
+   free(filename);
+
+   return succeed;
+}
+
+static void
+candidate_list_show(edit_data *ed, char *text, char *cur, char *selected)
+{
+   attr_value * attr = parser_attribute_get(ed->pd, text, cur, selected);
+   if (!attr) return;
+
+   parser_attribute_value_set(attr, cur);
+
+   ed->ctxpopup_cursor_pos = elm_entry_cursor_pos_get(ed->en_edit);
+
+   //Show up the list of the types
+   Enventor_Ctxpopup_Type type;
+   Evas_Object *ctxpopup =
+      ctxpopup_candidate_list_create(ed, attr,
+                                     ctxpopup_candidate_dismiss_cb,
+                                     ctxpopup_candidate_changed_cb,
+                                     &type);
+   if (!ctxpopup) return;
+
+   int x, y;
+   evas_pointer_output_xy_get(evas_object_evas_get(ed->en_edit), &x, &y);
+   evas_object_move(ctxpopup, x, y);
+   evas_object_show(ctxpopup);
+   evas_object_smart_callback_call(ed->enventor, SIG_CTXPOPUP_ACTIVATED,
+                                   (void *) type);
+
+   evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, ctxpopup_del_cb, ed);
+   ed->ctxpopup = ctxpopup;
+   elm_object_tree_focus_allow_set(ed->layout, EINA_FALSE);
+}
+
+static void
+edit_cursor_double_clicked_cb(void *data, Evas_Object *obj,
+                              void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   Eina_Bool ret;
+
+   if (ed->ctrl_pressed) return;
+   if (!eo_do_ret(ed->enventor, ret, enventor_obj_ctxpopup_get())) return;
+
+   char *selected = (char *) elm_entry_selection_get(obj);
+   if (!selected) return;
+
+   selected = elm_entry_markup_to_utf8(selected);
+   if (!selected) return;
+
+   if (selected[0] == '\"')
+     {
+        free(selected);
+        return;
+     }
+
+   const char *str = elm_entry_entry_get(obj);
+   char *text = elm_entry_markup_to_utf8(str);
+   int cur_pos = elm_entry_cursor_pos_get(obj);
+   char *cur = text + (cur_pos - strlen(selected));
+
+  /* TODO: improve parser_name_get, for recognize cases when name is absent.
+   * Because right now any text inside quotes that placed after selection is
+   * recognized as name.
+   */
+   if ((!strcmp(selected, "image") && (strlen(selected) == 5)) ||
+       (!strcmp(selected, "normal") && (strlen(selected) == 6)) ||
+       (!strcmp(selected, "tween") && (strlen(selected) == 5)) ||
+       (!strcmp(selected, "image.normal") && (strlen(selected) == 12)) ||
+       (!strcmp(selected, "image.tween") && (strlen(selected) == 11)) ||
+       (!strcmp(selected, "images.image") && (strlen(selected) == 12)))
+     {
+        int x, y;
+        evas_pointer_output_xy_get(evas_object_evas_get(ed->en_edit), &x, &y);
+        image_preview_show(ed, cur, x, y);
+     }
+   else
+     candidate_list_show(ed, text, cur, selected);
+
+   free(selected);
+   free(text);
+}
+
+static void
+cur_context_name_get_cb(void *data, Eina_Stringshare *state_name,
+                        double state_value, Eina_Stringshare *part_name,
+                        Eina_Stringshare *group_name)
+{
+   edit_data *ed = data;
+
+   if (ed->view_sync_cb)
+     ed->view_sync_cb(ed->view_sync_cb_data, state_name, state_value,
+                      part_name, group_name);
+}
+
+static void
+cur_line_pos_set(edit_data *ed, Eina_Bool force)
+{
+   Evas_Coord y, h;
+   elm_entry_cursor_geometry_get(ed->en_edit, NULL, &y, NULL, &h);
+   int line = (y / h) + 1;
+
+   if (line < 0) line = 1;
+   if (!force && (ed->cur_line == line)) return;
+   ed->cur_line = line;
+
+   Enventor_Cursor_Line cur_line;
+   cur_line.cur_line = line;
+   cur_line.max_line = ed->line_max;
+   evas_object_smart_callback_call(ed->enventor, SIG_CURSOR_LINE_CHANGED,
+                                   &cur_line);
+}
+
+void
+edit_selection_clear(edit_data *ed)
+{
+   if (ed->on_select_recover) return;
+   cur_line_pos_set(ed, EINA_TRUE);
+   ed->select_pos = -1;
+}
+
+static void
+edit_selection_cleared_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                          void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   edit_selection_clear(ed);
+}
+
+static void
+edit_selection_start_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                        void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   if (ed->select_pos != -1) return;
+   ed->select_pos = elm_entry_cursor_pos_get(ed->en_edit);
+}
+
+void
+edit_text_insert(edit_data *ed, const char *text)
+{
+   const char *selection = elm_entry_selection_get(ed->en_edit);
+   char *selection_utf8 = elm_entry_markup_to_utf8(selection);
+   if (!selection_utf8)
+     {
+        elm_entry_entry_set(ed->en_edit, text);
+        return;
+     }
+   int lenght = strlen(selection_utf8);
+   int pos_from = elm_entry_cursor_pos_get(ed->en_edit) - lenght;
+
+   Evas_Object *tb = elm_entry_textblock_get(ed->en_edit);
+   Evas_Textblock_Cursor *cur = evas_object_textblock_cursor_get(tb);
+   int old_pos = evas_textblock_cursor_pos_get(cur);
+   evas_textblock_cursor_pos_set(cur, pos_from + lenght);
+
+   /* append replacement text, and add relative diff into redoundo module */
+   evas_textblock_cursor_pos_set(cur, pos_from + lenght);
+   evas_textblock_cursor_text_append(cur, text);
+   redoundo_text_relative_push(ed->rd, text);
+
+   Evas_Textblock_Cursor *c_1 = evas_object_textblock_cursor_new(tb);
+   evas_textblock_cursor_pos_set(c_1, pos_from);
+
+   Evas_Textblock_Cursor *c_2 = evas_object_textblock_cursor_new(tb);
+   evas_textblock_cursor_pos_set(c_2, pos_from + lenght);
+   /* delete replaced text, and make diff into redoundo module */
+   redoundo_text_push(ed->rd, selection_utf8, pos_from, lenght, EINA_FALSE);
+   evas_textblock_cursor_range_delete(c_1, c_2);
+
+   evas_textblock_cursor_free(c_1);
+   evas_textblock_cursor_free(c_2);
+   evas_textblock_cursor_pos_set(cur, old_pos);
+
+   elm_entry_calc_force(ed->en_edit);
+
+   edit_changed_set(ed, EINA_TRUE);
+   free(selection_utf8);
+}
+
+static void
+edit_cursor_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   cur_line_pos_set(ed, EINA_FALSE);
+   edit_view_sync(ed);
+   bracket_update(ed);
+}
+
+static void
+syntax_color_full_update(edit_data *ed, Eina_Bool thread)
+{
+   if (ed->syntax_color_lock > 0) return;
+
+   ecore_timer_del(ed->syntax_color_timer);
+   ed->syntax_color_timer = NULL;
+
+   if (thread)
+     {
+        if (ed->sctd) ecore_thread_cancel(ed->sctd->thread);
+
+        ed->sctd = calloc(1, sizeof(syntax_color_td));
+        if (!ed->sctd)
+          {
+             EINA_LOG_ERR("Failed to allocate Memory!");
+             return;
+          }
+        ed->sctd->ed = ed;
+        Evas_Object *tb = elm_entry_textblock_get(ed->en_edit);
+        ed->sctd->text = (char *) evas_object_textblock_text_markup_get(tb);
+        ed->sctd->thread =
+           ecore_thread_run(syntax_color_thread_cb,
+                            syntax_color_thread_end_cb,
+                            syntax_color_thread_cancel_cb,
+                            ed->sctd);
+     }
+   else
+     {
+        syntax_color_apply(ed, EINA_FALSE);
+     }
+}
+
+static void
+scroller_scroll_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                   void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   syntax_color_partial_update(ed, SYNTAX_COLOR_SHORT_TIME);
+}
+
+static void
+scroller_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+                   void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   Evas_Coord h;
+   evas_object_geometry_get(obj, NULL, NULL, NULL, &h);
+
+   if (h == ed->scroller_h) return;
+   syntax_color_partial_update(ed, SYNTAX_COLOR_DEFAULT_TIME);
+   ed->scroller_h = h;
+}
+
+static void
+scroller_vbar_press_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   syntax_color_full_update(ed, EINA_TRUE);
+   ed->syntax_color_lock++;
+}
+
+static void
+scroller_vbar_unpress_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   ed->syntax_color_lock--;
+   syntax_color_partial_update(ed, SYNTAX_COLOR_SHORT_TIME);
+}
+
+static void
+edit_quick_jump(edit_data *ed)
+{
+   Evas_Object *textblock = elm_entry_textblock_get(ed->en_edit);
+
+   int line1 = ed->cur_line - 1;
+   int line2 = ed->cur_line;
+
+   //min position case
+   if (line1 < 0)
+     {
+        line1 = 0;
+        line2 = 1;
+     }
+
+   //Max position case
+   Eina_Bool max = EINA_FALSE;
+   if (line2 >= ed->line_max)
+     {
+        line1 = (ed->line_max - 2);
+        line2 = (ed->line_max - 1);
+        max = EINA_TRUE;
+     }
+
+   Evas_Textblock_Cursor *cur1 = evas_object_textblock_cursor_new(textblock);
+   evas_textblock_cursor_line_set(cur1, line1);
+   if (max) evas_textblock_cursor_line_char_last(cur1);
+
+   Evas_Textblock_Cursor *cur2 = evas_object_textblock_cursor_new(textblock);
+   evas_textblock_cursor_line_set(cur2, line2);
+   if (max) evas_textblock_cursor_line_char_last(cur2);
+   char *content = evas_textblock_cursor_range_text_get(cur1, cur2,
+                                                    EVAS_TEXTBLOCK_TEXT_MARKUP);
+   char *utf8 = elm_entry_markup_to_utf8(content);
+   free(content);
+
+   //Case 1. File Link?
+   char *file_link = utf8;
+   if ((file_link = strstr(utf8, "#include ")) != NULL)
+     {
+        file_link += 9; //strlen("#include "))
+        char *name_begin = strstr(utf8, "\"");
+        if (!name_begin) goto end;
+        name_begin++;
+        char *name_end = strstr(name_begin, "\"");
+        if (!name_end) goto end;
+        file_link = strndup(name_begin, name_end - name_begin);
+        if (file_link)
+          {
+             //Compose the absolute file path.
+             const char *file_name = ecore_file_file_get(ed->filepath);
+             if (!file_name) goto end;
+
+             char *file_path =
+                strndup(ed->filepath, (file_name - ed->filepath));
+             if (!file_path) goto end;
+
+             char buf[PATH_MAX];
+             snprintf(buf, sizeof(buf), "%s%s", file_path, file_link);
+             evas_object_smart_callback_call(ed->enventor,
+                                             SIG_FILE_OPEN_REQUESTED,
+                                             (void*)buf);
+             free(file_path);
+             free(file_link);
+          }
+     }
+
+   //TODO: Case 2. Part Link?
+
+end:
+   free(utf8);
+}
+
+static Eina_Bool
+edit_edc_load(edit_data *ed, const char *file_path)
+{
+   char buf[MAX_LINE_DIGIT_CNT];
+   Eina_File *file = NULL;
+   Eina_Strbuf *strbuf_line = NULL;
+   char *utf8_edit = NULL;
+   char *markup_edit = NULL;
+   char *markup_line = NULL;
+   int line_num = 1;
+   Eina_Bool ret = EINA_FALSE;
+
+   ed->line_max = 0;
+
+   file = eina_file_open(file_path, EINA_FALSE);
+   if (!file) goto err;
+
+   strbuf_line = eina_strbuf_new();
+   if (!strbuf_line) goto err;
+
+   eina_stringshare_del(ed->filepath);
+   ed->filepath = eina_stringshare_add(file_path);
+
+   utf8_edit = eina_file_map_all(file, EINA_FILE_POPULATE);
+   if (!utf8_edit)
+     {
+        ed->line_max = 0;
+        ret = EINA_TRUE;
+        goto err;
+     }
+
+   //Check indentation.
+   indent_data *id = syntax_indent_data_get(ed->sh);
+   Eina_Bool indent_correct
+      = indent_text_check(id, (const char *)utf8_edit);
+
+   //Set edc text to entry.
+   if (eo_do_ret(ed->enventor, ret, enventor_obj_auto_indent_get()) && !indent_correct)
+     //Create indented markup text from utf8 text of EDC file.
+     markup_edit = indent_text_create(id, (const char *)utf8_edit,
+                                      &line_num);
+   else
+     markup_edit = elm_entry_utf8_to_markup(utf8_edit);
+   if (!markup_edit) goto err;
+   elm_entry_entry_set(ed->en_edit, markup_edit);
+   if (eo_do_ret(ed->enventor, ret, enventor_obj_auto_indent_get()) && !indent_correct)
+     edit_changed_set(ed, EINA_TRUE);
+   free(markup_edit);
+
+   //Append line numbers.
+   if (!eina_strbuf_append_char(strbuf_line, '1')) goto err;
+   if (eo_do_ret(ed->enventor, ret, enventor_obj_auto_indent_get()) && !indent_correct)
+     {
+        int num = 2;
+        //Use line_num given by indent_text_create().
+        while (num <= line_num)
+          {
+             snprintf(buf, sizeof(buf), "\n%d", num);
+             if (!eina_strbuf_append(strbuf_line, buf)) goto err;
+             num++;
+          }
+     }
+   else
+     {
+        char *p = utf8_edit;
+        int len = strlen(p);
+        while ((p = strchr(p, '\n')) && p < (utf8_edit + len))
+          {
+             line_num++;
+             ++p;
+             snprintf(buf, sizeof(buf), "\n%d", line_num);
+             if (!eina_strbuf_append(strbuf_line, buf)) goto err;
+          }
+     }
+
+   markup_line = elm_entry_utf8_to_markup(eina_strbuf_string_get(strbuf_line));
+   if (!markup_line) goto err;
+   elm_entry_entry_append(ed->en_line, markup_line);
+   free(markup_line);
+
+   ed->cur_line = 1;
+   ed->line_max = line_num;
+
+   syntax_color_timer_cb(ed);
+
+   ret = EINA_TRUE;
+
+err:
+   //Even any text is not inserted, line number should start with 1
+   if (ed->line_max == 0) line_init(ed);
+   if (strbuf_line) eina_strbuf_free(strbuf_line);
+   if (utf8_edit) eina_file_map_free(file, utf8_edit);
+   if (file) eina_file_close(file);
+
+   Enventor_Cursor_Line cursor_line;
+   cursor_line.cur_line = ed->cur_line;
+   cursor_line.max_line = ed->line_max;
+   evas_object_smart_callback_call(ed->enventor, SIG_MAX_LINE_CHANGED,
+                                   &cursor_line);
+
+   elm_entry_cursor_pos_set(ed->en_edit, 0);
+
+   return ret;
+}
+
+static void
+edit_focused_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   evas_object_smart_callback_call(ed->enventor, SIG_FOCUSED, NULL);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+edit_part_cursor_set(edit_data *ed,
+                     const char *group_name,
+                     const char *part_name)
+{
+#define PART_SYNTAX_CNT 13
+   if (!group_name || !part_name) return;
+   const char *text = elm_entry_entry_get(ed->en_edit);
+   char *utf8 = elm_entry_markup_to_utf8(text);
+
+   int part_name_size = strlen(part_name) + 3; // 2 - is quotes.
+   char *part_name_search = alloca(part_name_size);
+   snprintf(part_name_search, part_name_size, "\"%s\"", part_name);
+
+   int group_name_size = strlen(group_name) + 3; // 2 - is quotes.
+   char *group_name_search = alloca(group_name_size);
+   snprintf(group_name_search, group_name_size, "\"%s\"", group_name);
+   const char *group_pos = strstr(utf8, group_name_search);
+   if (!group_pos) return;
+   char *itr = strstr(group_pos, part_name_search);
+   const char *part_pos = itr;
+
+   /* Possible keywords for a parts*/
+   const char *PART[PART_SYNTAX_CNT] = { "part", "image", "textblock",
+        "swallow", "rect", "group", "spacer", "proxy", "text", "gradient",
+        "box", "table", "external" };
+
+   Eina_Bool word_present = EINA_FALSE; /* Indicate is present any word between part name and open brace '{' */
+   Eina_Bool found_part = EINA_FALSE;
+   Eina_Bool found_brace = EINA_FALSE;
+
+   /* TODO: limit the region of search by 'group { }' block. It is necessary for avoiding situations when part can be
+    * find inside another group. */
+
+   /* Search patterns:  'PART { "part_name" ' or  'PART { name: "part_name"'*/
+   for (; (itr != NULL) && (itr > group_pos) && (part_pos != NULL); itr--)
+     {
+        if ((!found_brace) && (*itr == '{'))
+          {
+             found_brace = EINA_TRUE;
+             if (word_present)
+               {
+                  /* Check word between the part name and  brace.
+                   * This word should be a "name". In case if found
+                   * other keyword, the search process should be
+                   * restarted from another position. */
+                  char *name_keyword = strstr(itr, "name");
+                  if (!name_keyword || name_keyword > part_pos)
+                    {
+                       itr = strstr(part_pos + 1, part_name_search);
+                       part_pos = itr;
+                       found_brace = EINA_FALSE;
+                       word_present = EINA_FALSE;
+                    }
+               }
+          }
+        else if (isalpha(*itr))
+          {
+             word_present = EINA_TRUE;
+          }
+
+
+        /* If found the opening brace '{', need to parse
+         * the keyword, that describe this block.
+         * And compare this keyword with possible part keywords. */
+        if (found_brace)
+          {
+             char *keyword_end = NULL;
+
+             for (; (itr != NULL) && (itr > group_pos); itr--)
+               {
+                  if (!keyword_end && isalpha(*itr))
+                    {
+                       keyword_end = itr;
+                    }
+                  else if (keyword_end && !isalpha(*itr))
+                    {
+                       /* Compare parsed keyword with possible part names. */
+                       int i;
+                       for ( i = 0; i < PART_SYNTAX_CNT; i++)
+                         {
+                            if (!strncmp(itr + 1, PART[i], strlen(PART[i])))
+                              {
+                                 found_part = EINA_TRUE;
+                              }
+                         }
+                       if (found_part)
+                         goto finish;
+                       else
+                         {
+                           itr = strstr(part_pos + 1, part_name_search);
+                           part_pos = itr;
+                           found_brace = EINA_FALSE;
+                           word_present = EINA_FALSE;
+                           break;
+                         }
+                    }
+               }
+          }
+     }
+
+finish:
+
+   if (found_part)
+     {
+        int cur_pos = part_pos - utf8 + 1;
+        elm_entry_select_none(ed->en_edit);
+        edit_selection_region_center_set(ed, cur_pos, cur_pos + strlen(part_name));
+     }
+
+   free(utf8);
+}
+
+void
+edit_view_sync_cb_set(edit_data *ed,
+                      void (*cb)(void *data, Eina_Stringshare *state_name,
+                                 double state_value,
+                                 Eina_Stringshare *part_name,
+                                 Eina_Stringshare *group_name), void *data)
+{
+   ed->view_sync_cb = cb;
+   ed->view_sync_cb_data = data;
+
+   if (!cb) return;
+
+   Eina_Stringshare *group_name =
+      parser_first_group_name_get(ed->pd, ed->en_edit);
+
+   cb(data, NULL, 0.0, NULL, group_name);
+
+   eina_stringshare_del(group_name);
+}
+
+Eina_Bool
+edit_saved_get(edit_data *ed)
+{
+   return ed->on_save;
+}
+
+void
+edit_saved_set(edit_data *ed, Eina_Bool saved)
+{
+   ed->on_save = saved;
+}
+
+Eina_Bool
+edit_save(edit_data *ed, const char *file)
+{
+   if (!ed->edit_changed) return EINA_FALSE;
+
+   const char *text = elm_entry_entry_get(ed->en_edit);
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   FILE *fp = fopen(file, "w");
+   if (!fp)
+     {
+        EINA_LOG_ERR("Failed to open file \"%s\"", file);
+        return EINA_FALSE;
+     }
+
+   fputs(utf8, fp);
+   fclose(fp);
+   free(utf8);
+
+   edit_view_sync(ed);
+
+   edit_changed_set(ed, EINA_FALSE);
+   edit_saved_set(ed, EINA_TRUE);
+
+   Enventor_EDC_Modified modified;
+   modified.self_changed = EINA_TRUE;
+   evas_object_smart_callback_call(ed->enventor, SIG_EDC_MODIFIED, &modified);
+
+   return EINA_TRUE;
+}
+
+void
+edit_syntax_color_set(edit_data *ed, Enventor_Syntax_Color_Type color_type,
+                      const char *val)
+{
+   if (!ed) return;
+   color_set(syntax_color_data_get(ed->sh), color_type, val);
+}
+
+void
+edit_syntax_color_full_apply(edit_data *ed, Eina_Bool force)
+{
+   int lock;
+
+   if (force)
+     {
+        lock = ed->syntax_color_lock;
+        ed->syntax_color_lock = -1;
+     }
+   syntax_color_full_update(ed, EINA_FALSE);
+
+   if (force) ed->syntax_color_lock = lock;
+   else ed->syntax_color_lock++;
+}
+
+void
+edit_syntax_color_partial_apply(edit_data *ed, double interval)
+{
+   if (ed->syntax_color_lock > 0) ed->syntax_color_lock = 0;
+   if (interval < 0) syntax_color_partial_update(ed, SYNTAX_COLOR_DEFAULT_TIME);
+   else syntax_color_partial_update(ed, interval);
+}
+
+void
+edit_view_sync(edit_data *ed)
+{
+   parser_cur_context_get(ed->pd, ed->en_edit, cur_context_name_get_cb, ed,
+                          ed->main);
+}
+
+void
+edit_line_delete(edit_data *ed)
+{
+   if (!elm_object_focus_get(ed->en_edit)) return;
+
+   Evas_Object *textblock = elm_entry_textblock_get(ed->en_edit);
+
+   int line1 = ed->cur_line - 1;
+   int line2 = ed->cur_line;
+
+   //min position case
+   if (line1 < 0)
+     {
+        line1 = 0;
+        line2 = 1;
+     }
+
+   //Max position case
+   Eina_Bool max = EINA_FALSE;
+   if (line2 >= ed->line_max)
+     {
+        line1 = (ed->line_max - 2);
+        line2 = (ed->line_max - 1);
+        max = EINA_TRUE;
+     }
+
+   //only one line remain. clear it.
+   if (ed->line_max == 1)
+     {
+        redoundo_text_push(ed->rd, elm_entry_entry_get(ed->en_edit), 0, 0,
+                           EINA_FALSE);
+        elm_entry_entry_set(ed->en_edit, "");
+        line_init(ed);
+        return;
+     }
+
+   Evas_Textblock_Cursor *cur1 = evas_object_textblock_cursor_new(textblock);
+   evas_textblock_cursor_line_set(cur1, line1);
+   if (max) evas_textblock_cursor_line_char_last(cur1);
+
+   Evas_Textblock_Cursor *cur2 = evas_object_textblock_cursor_new(textblock);
+   evas_textblock_cursor_line_set(cur2, line2);
+   if (max) evas_textblock_cursor_line_char_last(cur2);
+   int cur1_pos, cur2_pos;
+
+   cur1_pos = evas_textblock_cursor_pos_get(cur1);
+   cur2_pos = evas_textblock_cursor_pos_get(cur2);
+   char *content = evas_textblock_cursor_range_text_get(cur1, cur2,
+                                                    EVAS_TEXTBLOCK_TEXT_MARKUP);
+
+   evas_textblock_cursor_range_delete(cur1, cur2);
+   evas_textblock_cursor_free(cur1);
+   evas_textblock_cursor_free(cur2);
+   redoundo_text_push(ed->rd, content, cur1_pos, abs(cur2_pos - cur1_pos),
+                      EINA_FALSE);
+   elm_entry_calc_force(ed->en_edit);
+   free(content);
+
+   edit_line_decrease(ed, 1);
+
+   cur_line_pos_set(ed, EINA_TRUE);
+   edit_changed_set(ed, EINA_TRUE);
+
+   syntax_color_partial_update(ed, SYNTAX_COLOR_DEFAULT_TIME);
+}
+
+int
+edit_cur_indent_depth_get(edit_data *ed)
+{
+   return indent_space_get(syntax_indent_data_get(ed->sh));
+}
+
+edit_data *
+edit_init(Enventor_Object *enventor, Enventor_Item *it)
+{
+   edit_data *ed = calloc(1, sizeof(edit_data));
+   if (!ed)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return NULL;
+     }
+   ed->error_line = -1;
+   ed->bracket.prev_left = -1;
+   ed->bracket.prev_right = -1;
+   ed->bracket.left = -1;
+   ed->bracket.right = -1;
+
+   //Scroller
+   Evas_Object *scroller = elm_scroller_add(enventor);
+   evas_object_smart_member_add(scroller, enventor);
+   elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_AUTO,
+                           ELM_SCROLLER_POLICY_AUTO);
+   elm_object_focus_allow_set(scroller, EINA_FALSE);
+   evas_object_smart_callback_add(scroller, "scroll,up", scroller_scroll_cb,
+                                  ed);
+   evas_object_smart_callback_add(scroller, "scroll,down", scroller_scroll_cb,
+                                  ed);
+   evas_object_smart_callback_add(scroller, "vbar,press",
+                                  scroller_vbar_press_cb, ed);
+   evas_object_smart_callback_add(scroller, "vbar,unpress",
+                                  scroller_vbar_unpress_cb, ed);
+   evas_object_event_callback_add(scroller, EVAS_CALLBACK_RESIZE,
+                                  scroller_resize_cb, ed);
+   evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+   //This is hackish call to not change scroller color by widget.
+   evas_object_data_set(scroller, "_elm_leaveme", (void *)1);
+
+   //Layout
+   Evas_Object *layout = elm_layout_add(scroller);
+   elm_layout_file_set(layout, EDJE_PATH,  "edit_layout");
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_object_content_set(scroller, layout);
+
+   //Line Number Entry
+   Evas_Object *en_line = elm_entry_add(layout);
+   //Tizen Only: use entry style from elm theme.
+   //elm_object_style_set(en_line, "enventor");
+   //Tizen Only: evas_object_color_set has an effect on the whole entry colors.
+   //evas_object_color_set(en_line, 101, 101, 101, 255);
+   elm_entry_editable_set(en_line, EINA_FALSE);
+   elm_entry_line_wrap_set(en_line, ELM_WRAP_NONE);
+   elm_object_focus_allow_set(en_line, EINA_FALSE);
+   evas_object_size_hint_weight_set(en_line, 0, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(en_line, 0, EVAS_HINT_FILL);
+   elm_object_part_content_set(layout, "elm.swallow.linenumber", en_line);
+
+   //EDC Editor Entry
+   Evas_Object *en_edit = elm_entry_add(layout);
+   //Tizen Only: use entry style from elm theme.
+   //elm_object_style_set(en_edit, "enventor");
+   elm_object_focus_highlight_style_set(en_edit, "blank");
+   elm_entry_cnp_mode_set(en_edit, ELM_CNP_MODE_PLAINTEXT);
+   elm_entry_context_menu_disabled_set(en_edit, EINA_TRUE);
+   elm_entry_line_wrap_set(en_edit, ELM_WRAP_NONE);
+   evas_object_smart_callback_add(en_edit, "focused", edit_focused_cb, ed);
+   evas_object_smart_callback_add(en_edit, "changed,user", edit_changed_cb, ed);
+   evas_object_smart_callback_add(en_edit, "cursor,changed",
+                                  edit_cursor_changed_cb, ed);
+   evas_object_smart_callback_add(en_edit, "clicked,double",
+                                  edit_cursor_double_clicked_cb, ed);
+   evas_object_smart_callback_add(en_edit, "selection,cleared",
+                                  edit_selection_cleared_cb, ed);
+   evas_object_smart_callback_add(en_edit, "selection,start",
+                                  edit_selection_start_cb, ed);
+   evas_object_size_hint_weight_set(en_edit, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(en_edit, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_object_focus_set(en_edit, EINA_TRUE);
+   elm_object_part_content_set(layout, "elm.swallow.edit", en_edit);
+
+   /* FIXME: This is a temporary patch to remove focus highlight on template
+      selection button of new file open. (enventor -t)
+      Without calling evas_object_show() here, en_edit cannot get focus because
+      its visibility is set with false. */
+   evas_object_show(en_edit);
+
+   ed->scroller = scroller;
+   ed->en_line = en_line;
+   ed->en_edit = en_edit;
+   ed->layout = layout;
+   ed->enventor = enventor;
+   ed->it = it;
+   ed->cur_line = -1;
+   ed->select_pos = -1;
+   //Tizen Only : Support Tizen version
+   //ed->pd = parser_init();
+   ed->pd = parser_init(enventor_object_tizen_version_get(enventor));
+   //
+   ed->rd = redoundo_init(ed, enventor);
+   ed->sh = syntax_init(ed);
+   ed->main = (enventor_object_main_item_get(ed->enventor) == ed->it);
+
+   return ed;
+}
+
+redoundo_data *
+edit_redoundo_get(edit_data *ed)
+{
+   return ed->rd;
+}
+
+Evas_Object *
+edit_obj_get(edit_data *ed)
+{
+   if (!ed) return NULL;
+   return ed->scroller;
+}
+
+void
+edit_term(edit_data *ed)
+{
+   if (!ed) return;
+
+   syntax_helper *sh = ed->sh;
+   parser_data *pd = ed->pd;
+   redoundo_data *rd = ed->rd;
+
+   if (ed->sctd)
+     {
+        ecore_thread_cancel(ed->sctd->thread);
+        ed->sctd->ed = NULL;
+     }
+   ecore_timer_del(ed->syntax_color_timer);
+   evas_object_del(ed->scroller);
+   eina_stringshare_del(ed->filepath);
+
+   free(ed);
+
+   redoundo_term(rd);
+   syntax_term(sh);
+   parser_term(pd);
+}
+
+Eina_Bool
+edit_changed_get(edit_data *ed)
+{
+   return ed->edit_changed;
+}
+
+void
+edit_changed_set(edit_data *ed, Eina_Bool changed)
+{
+   ed->edit_changed = changed;
+}
+
+void
+edit_linenumber_set(edit_data *ed, Eina_Bool linenumber)
+{
+   if (linenumber)
+     elm_object_signal_emit(ed->layout, "elm,state,linenumber,show", "");
+   else
+     elm_object_signal_emit(ed->layout, "elm,state,linenumber,hide", "");
+}
+
+void
+edit_font_scale_set(edit_data *ed, double font_scale)
+{
+   if (!ed) return;
+
+   elm_object_scale_set(ed->layout, font_scale);
+   syntax_color_partial_update(ed, 0);
+}
+
+Eina_Bool
+edit_load(edit_data *ed, const char *edc_path)
+{
+   parser_cancel(ed->pd);
+   elm_entry_entry_set(ed->en_edit, "");
+   elm_entry_entry_set(ed->en_line, "");
+   Eina_Bool ret = edit_edc_load(ed, edc_path);
+   if (ret) edit_changed_set(ed, EINA_TRUE);
+   edj_mgr_reload_need_set(EINA_TRUE);
+   redoundo_clear(ed->rd);
+
+   return ret;
+}
+
+Eina_Stringshare *
+edit_cur_paragh_get(edit_data *ed)
+{
+   return parser_paragh_name_get(ed->pd, ed->en_edit);
+}
+
+Eina_Stringshare *
+edit_cur_prog_name_get(edit_data *ed)
+{
+   return parser_cur_context_fast_get(ed->en_edit, "program");
+}
+
+Eina_Stringshare *
+edit_cur_part_name_get(edit_data *ed)
+{
+   return parser_cur_context_fast_get(ed->en_edit, "part");
+}
+
+int
+edit_max_line_get(edit_data *ed)
+{
+   return ed->line_max;
+}
+
+void
+edit_goto(edit_data *ed, int line)
+{
+   elm_entry_select_none(ed->en_edit);
+   Evas_Object *tb = elm_entry_textblock_get(ed->en_edit);
+   Evas_Textblock_Cursor *cur = evas_object_textblock_cursor_get(tb);
+   evas_textblock_cursor_line_set(cur, (line - 1));
+   elm_entry_calc_force(ed->en_edit);
+   elm_object_focus_set(ed->en_edit, EINA_TRUE);
+}
+
+Evas_Object *
+edit_entry_get(edit_data *ed)
+{
+   return ed->en_edit;
+}
+
+/*TODO: this function should be more flexible.
+ * Will be better to change prototype like:
+ * line_num_highlight(edit_data *, int line_num, char *color);
+ * And make this function public.
+ */
+static void
+error_line_num_highlight(edit_data *ed)
+{
+#define LINE_NUM_SIZE 5
+   Evas_Object *tb = elm_entry_textblock_get(ed->en_line);
+   char *text = (char *) evas_object_textblock_text_markup_get(tb);
+
+   int from_line = 1;
+   int to_line = -1;
+
+   char *from EINA_UNUSED = NULL;
+   char *to EINA_UNUSED = NULL;
+
+   char *utf8 = (char *)color_cancel(NULL, syntax_color_data_get(ed->sh), text,
+                                     strlen(text), from_line, to_line, &from,
+                                     &to);
+
+   if (!utf8) return;
+
+   if (ed->error_line == -1)
+     {
+        evas_object_textblock_text_markup_set(tb, utf8);
+        return;
+     }
+
+   char line_str[LINE_NUM_SIZE];
+   snprintf(line_str, LINE_NUM_SIZE, "%d", ed->error_line + 1);
+   char *ptr = strstr(utf8, line_str);
+   if (!ptr) return;
+
+   Eina_Strbuf *strbuf = eina_strbuf_new();
+   eina_strbuf_append_length(strbuf, utf8, ptr - utf8);
+   //Tizen Only
+   eina_strbuf_append(strbuf, "<backing=on><backing_color=#ff1212><color=#f6f6f6>");
+   //eina_strbuf_append(strbuf, "<backing=on><backing_color=#ff0000>");
+   eina_strbuf_append_length(strbuf, utf8 + (ptr - utf8), strlen(line_str));
+   //Tizen Only
+   eina_strbuf_append(strbuf, "</color></backing_color></backing=off>");
+   //eina_strbuf_append(strbuf, "</backing_color><backing=off>");
+   eina_strbuf_append(strbuf, utf8 +((ptr - utf8) + strlen(line_str)));
+   evas_object_textblock_text_markup_set(tb, eina_strbuf_string_get(strbuf));
+
+   eina_strbuf_free(strbuf);
+   elm_entry_calc_force(ed->en_line);
+#undef LINE_NUM_SIZE
+}
+
+void
+edit_line_increase(edit_data *ed, int cnt)
+{
+   char buf[MAX_LINE_DIGIT_CNT];
+   int i;
+
+   for (i = 0; i < cnt; i++)
+     {
+        ed->line_max++;
+        snprintf(buf, sizeof(buf), "<br/>%d", ed->line_max);
+        elm_entry_entry_append(ed->en_line, buf);
+     }
+   elm_entry_calc_force(ed->en_line);
+
+   Enventor_Cursor_Line cur_line;
+   cur_line.cur_line = ed->cur_line;
+   cur_line.max_line = ed->line_max;
+   evas_object_smart_callback_call(ed->enventor, SIG_MAX_LINE_CHANGED,
+                                   &cur_line);
+}
+
+void
+edit_line_decrease(edit_data *ed, int cnt)
+{
+   if (cnt < 1) return;
+
+   Evas_Object *textblock = elm_entry_textblock_get(ed->en_line);
+   Evas_Textblock_Cursor *cur1 = evas_object_textblock_cursor_new(textblock);
+   Evas_Textblock_Cursor *cur2 = evas_object_textblock_cursor_new(textblock);
+
+   int i = cnt;
+   while (i)
+     {
+        evas_textblock_cursor_paragraph_last(cur1);
+        evas_textblock_cursor_paragraph_prev(cur1);
+        evas_textblock_cursor_paragraph_last(cur2);
+        evas_textblock_cursor_range_delete(cur1, cur2);
+        i--;
+     }
+
+   evas_textblock_cursor_free(cur1);
+   evas_textblock_cursor_free(cur2);
+
+   elm_entry_calc_force(ed->en_line);
+
+   ed->line_max -= cnt;
+
+   if (ed->line_max < 1) line_init(ed);
+
+   Enventor_Cursor_Line cur_line;
+   cur_line.cur_line = ed->cur_line;
+   cur_line.max_line = ed->line_max;
+   evas_object_smart_callback_call(ed->enventor, SIG_MAX_LINE_CHANGED,
+                                   &cur_line);
+}
+
+void
+edit_redoundo_region_push(edit_data *ed, int cursor_pos1, int cursor_pos2)
+{
+   redoundo_entry_region_push(ed->rd, cursor_pos1, cursor_pos2);
+}
+
+void
+edit_disabled_set(edit_data *ed, Eina_Bool disabled)
+{
+   elm_object_tree_focus_allow_set(ed->layout, !disabled);
+
+   if (disabled)
+     {
+        elm_object_signal_emit(ed->layout, "elm,state,disabled", "");
+        elm_entry_select_none(ed->en_edit);
+     }
+   else
+     {
+        elm_object_signal_emit(ed->layout, "elm,state,enabled", "");
+        elm_object_focus_set(ed->en_edit, EINA_TRUE);
+     }
+
+   //Turn off the part highlight in case of disable.
+   if (disabled) view_part_highlight_set(VIEW_DATA, NULL);
+
+   //Reset whatever ctrl pressed is on.
+   ed->ctrl_pressed = EINA_FALSE;
+   ed->disabled = disabled;
+}
+
+void
+edit_error_set(edit_data *ed, int line, const char *target)
+{
+   ed->error_line = line;
+   ed->error_target = target;
+}
+
+Eina_Bool
+edit_ctxpopup_visible_get(edit_data *ed)
+{
+   if (!ed) return EINA_FALSE;
+   return (ed->ctxpopup ? EINA_TRUE : EINA_FALSE);
+}
+
+void
+edit_ctxpopup_dismiss(edit_data *ed)
+{
+   if (ed && ed->ctxpopup) elm_ctxpopup_dismiss(ed->ctxpopup);
+}
+
+Eina_Bool
+edit_redoundo(edit_data *ed, Eina_Bool undo)
+{
+   int lines;
+   Eina_Bool changed;
+
+   if (undo) lines = redoundo_undo(ed->rd, &changed);
+   else lines = redoundo_redo(ed->rd, &changed);
+   if (!changed) return EINA_FALSE;
+
+   if (lines > 0) edit_line_increase(ed, lines);
+   else edit_line_decrease(ed, abs(lines));
+
+   edit_changed_set(ed, EINA_TRUE);
+   syntax_color_full_update(ed, EINA_TRUE);
+
+   return EINA_TRUE;
+}
+
+Eina_Bool
+edit_key_down_event_dispatch(edit_data *ed, const char *key)
+{
+   if (ed->disabled) return EINA_FALSE;
+   //Control Key
+   if (!strcmp("Control_L", key))
+     {
+        ed->ctrl_pressed = EINA_TRUE;
+        return EINA_FALSE;
+     }
+
+   if (ed->ctrl_pressed)
+     {
+        //Undo
+        if (!strcmp(key, "z") || !strcmp(key, "Z"))
+          {
+             edit_redoundo(ed, EINA_TRUE);
+             return EINA_TRUE;
+          }
+        //Redo
+        if (!strcmp(key, "r") || !strcmp(key, "R"))
+          {
+             edit_redoundo(ed, EINA_FALSE);
+             return EINA_TRUE;
+          }
+     }
+
+   return EINA_FALSE;
+}
+
+static char*
+cursor_part_name_get(edit_data *ed)
+{
+   int part_begin, part_end;
+   part_begin = part_end = -1;
+
+   Evas_Object *tb = elm_entry_textblock_get(ed->en_edit);
+   Evas_Textblock_Cursor *cur = evas_object_textblock_cursor_get(tb);
+   Evas_Textblock_Cursor *cur_l = evas_object_textblock_cursor_new(tb);
+   Evas_Textblock_Cursor *cur_r = evas_object_textblock_cursor_new(tb);
+
+   int cur_pos = evas_textblock_cursor_pos_get(cur);
+   evas_textblock_cursor_pos_set(cur_l, cur_pos);
+   evas_textblock_cursor_pos_set(cur_r, cur_pos);
+
+   //Search the end character to the left
+   Eina_Bool is_prev = EINA_TRUE;
+   char *ch_l = NULL;
+   ch_l = evas_textblock_cursor_content_get(cur_l);
+   if (!ch_l) goto end;
+   /* If current character is ", move cursor to the previous character
+      to find part name correctly */
+   if (*ch_l == '\"')
+     is_prev = evas_textblock_cursor_char_prev(cur_l);
+
+   while (is_prev)
+     {
+        ch_l = evas_textblock_cursor_content_get(cur_l);
+        if (!ch_l || (*ch_l == '\n') || (*ch_l == ';') || (*ch_l == '\0'))
+          break;
+        if (*ch_l == '\"')
+          {
+             evas_textblock_cursor_char_next(cur_l);
+             part_begin = evas_textblock_cursor_pos_get(cur_l);
+             break;
+          }
+        is_prev = evas_textblock_cursor_char_prev(cur_l);
+     }
+   if (part_begin == -1) goto end;
+
+   //Search the end character to the right
+   Eina_Bool is_next = EINA_TRUE;
+   char *ch_r = NULL;
+   while (is_next)
+     {
+        ch_r = evas_textblock_cursor_content_get(cur_r);
+        if (!ch_r || (*ch_r == '\n') || (*ch_r == ';') || (*ch_r == '\0'))
+          break;
+        if (*ch_r == '\"')
+          {
+             part_end = evas_textblock_cursor_pos_get(cur_r);
+             break;
+          }
+        is_next = evas_textblock_cursor_char_next(cur_r);
+     }
+   if (part_end == -1) goto end;
+
+   //Verify the part name
+   if (part_begin != part_end)
+     {
+        char *cur_part_name =
+           evas_textblock_cursor_range_text_get(cur_l, cur_r,
+                                                EVAS_TEXTBLOCK_TEXT_PLAIN);
+        if (!cur_part_name) goto end;
+
+        Eina_List *l;
+        char *part_name;
+        Eina_List *parts = view_parts_list_get(edj_mgr_view_get(NULL));
+        EINA_LIST_FOREACH(parts, l, part_name)
+          {
+             //If part is detected
+             if (!strcmp(part_name, cur_part_name))
+               return cur_part_name;
+          }
+        free(cur_part_name);
+     }
+
+end:
+   evas_textblock_cursor_free(cur_l);
+   evas_textblock_cursor_free(cur_r);
+   return NULL;
+}
+
+static void
+goto_part_name(edit_data *ed, const char *part_name)
+{
+   //Find current group name for searching part
+   Eina_Stringshare *group_name =
+      parser_cur_context_group_name_get(ed->pd, ed->en_edit, ed->main);
+   if (!group_name) return;
+
+   const char *text = elm_entry_entry_get(ed->en_edit);
+   char *utf8 = elm_entry_markup_to_utf8(text);
+
+   //Find part name in current group
+   const char *part_type =
+      part_type_str_convert(view_part_type_get(edj_mgr_view_get(NULL),
+                            part_name));
+   if (!part_type) goto end;
+
+   const char *start_pos =
+      parser_part_pos_get(utf8,
+                          (utf8 + strlen(utf8)),
+                          group_name,
+                          part_name,
+                          part_type);
+   if (!start_pos) goto end;
+
+   //Select part name
+   edit_selection_region_center_set(ed,
+                                    (start_pos - utf8),
+                                    (start_pos - utf8 + strlen(part_name)));
+
+end:
+   eina_stringshare_del(group_name);
+   free(utf8);
+}
+
+Eina_Bool
+edit_key_up_event_dispatch(edit_data *ed, const char *key)
+{
+   if (ed->disabled) return EINA_FALSE;
+
+   //Control Key
+   if (!strcmp("Control_L", key))
+     ed->ctrl_pressed = EINA_FALSE;
+
+   //Quick Jump
+   if (!strcmp("F3", key))
+     {
+        char *part_name = cursor_part_name_get(ed);
+        //Case 1: cursor on part name
+        if (part_name)
+          {
+             goto_part_name(ed, part_name);
+             free(part_name);
+          }
+        //Case 2: cursor on filepath
+        else
+          edit_quick_jump(ed);
+     }
+
+   return EINA_FALSE;
+}
+
+
+const char *
+edit_file_get(edit_data *ed)
+{
+   return ed->filepath;
+}
+
+void
+edit_selection_region_center_set(edit_data *ed, int start, int end)
+{
+   Evas_Coord region_y, region_h;
+   Evas_Coord cursor_y, cursor_h;
+
+   //Calculate line of selection region
+   elm_entry_cursor_pos_set(ed->en_edit, start);
+   elm_entry_cursor_geometry_get(ed->en_edit, NULL, &cursor_y, NULL, &cursor_h);
+   int cur_line = (cursor_y / cursor_h) + 1;
+
+   //Calculate current region of scroller
+   elm_scroller_region_get(ed->scroller, NULL, &region_y, NULL, &region_h);
+
+
+   int line;
+   //Case 1: selection region is above the centor of scroller region
+   if (((region_y + (region_h / 2))) > cursor_y)
+     {
+        line = cur_line - (int)((region_h / cursor_h) / 2);
+        if (line < 1) line = 1;
+     }
+   //Case 2: selection region is below the center of scroller region
+   else
+     {
+        line = cur_line + 2 + (int)((region_h / cursor_h) / 2);
+        if (line > ed->line_max) line = ed->line_max;
+     }
+
+   //Move the scroller for selection align
+   Evas_Object *tb = elm_entry_textblock_get(ed->en_edit);
+   Evas_Textblock_Cursor *cur = evas_object_textblock_cursor_get(tb);
+   evas_textblock_cursor_line_set(cur, (line - 1));
+   elm_entry_cursor_geometry_get(ed->en_edit, NULL, &region_y, NULL, NULL);
+   elm_scroller_region_show(ed->scroller, 0, region_y, 0, 0);
+
+   //Select region
+   elm_entry_select_region_set(ed->en_edit, start, end);
+}
+
+void
+edit_select_none(edit_data *ed)
+{
+   elm_entry_select_none(ed->en_edit);
+}
+
+void
+edit_cursor_pos_set(edit_data *ed, int position)
+{
+   elm_entry_cursor_pos_set(ed->en_edit, position);
+}
+
+int
+edit_cursor_pos_get(edit_data *ed)
+{
+   return elm_entry_cursor_pos_get(ed->en_edit);
+}
+
+const char *
+edit_selection_get(edit_data *ed)
+{
+   return elm_entry_selection_get(ed->en_edit);
+}
+
+const char *
+edit_text_get(edit_data *ed)
+{
+   return elm_entry_entry_get(ed->en_edit);
+}
+
+Eina_Bool
+edit_is_main_file(edit_data *ed)
+{
+   return ed->main;
+}
+
+void
+edit_focus_set(edit_data *ed, Eina_Bool focus)
+{
+   elm_object_focus_set(ed->en_edit, focus);
+}
+
+Eina_Bool
+edit_focus_get(edit_data *ed)
+{
+   return elm_object_focus_get(ed->en_edit);
+}
+
+Eina_List *
+edit_group_list_get(edit_data *ed)
+{
+   if (!ed) return NULL;
+
+   return parser_group_list_get(ed->pd, ed->en_edit);
+}
+
+
diff --git a/src/lib/edc_parser.c b/src/lib/edc_parser.c
new file mode 100644 (file)
index 0000000..de9a6b1
--- /dev/null
@@ -0,0 +1,2437 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+const char ATTR_PREPEND_COLON[] = ":";
+const char ATTR_PREPEND_NONE[] = "";
+const char ATTR_APPEND_SEMICOLON[] = ";";
+//Tizen Only
+const char ATTR_APPEND_STATE_VAL[] = " 0.0;";
+//
+const char ATTR_APPEND_TRANSITION_TIME[] = " 1.0;";
+const char ATTR_APPEND_TRANSITION_TIME_FACTOR[] = " 1.0 0.0;";
+const char ATTR_APPEND_TRANSITION_TIME_FACTOR2[] = " 1.0 0.0 0.0;";
+const char ATTR_APPEND_TRANSITION_TIME_FACTOR4[] = " 1.0 0.0 0.0 0.0 0.0;";
+
+typedef struct parser_attr_s
+{
+   Eina_Stringshare *keyword;
+   const char *context;
+   attr_value value;
+} parser_attr;
+
+typedef struct cur_context_thread_data_s
+{
+   Ecore_Thread *thread;
+   char *utf8;
+   int cur_pos;
+   const char *group_name;
+   const char *part_name;
+   const char *state_name;
+   double state_value;
+   void (*cb)(void *data, Eina_Stringshare *state_name, double state_value,
+              Eina_Stringshare *part_name, Eina_Stringshare *group_name);
+   void *cb_data;
+   parser_data *pd;
+   Eina_Bool collections: 1;  //It contains collections?
+} cur_context_td;
+
+typedef struct type_init_thread_data_s
+{
+   Eina_Inarray *attrs;
+   Ecore_Thread *thread;
+   parser_data *pd;
+   //Tizen Only : Support Tizen version
+   const char *tizen_version;
+   //
+} type_init_td;
+
+typedef struct bracket_thread_data_s
+{
+   int pos;
+   char *text;
+   Bracket_Update_Cb update_cb;
+   void *data;
+   Ecore_Thread *thread;
+   int left;
+   int right;
+   parser_data *pd;
+
+} bracket_td;
+
+
+struct parser_s
+{
+   Eina_Inarray *attrs;
+   cur_context_td *cntd;
+   type_init_td *titd;
+   bracket_td *btd;
+};
+
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+cur_context_thread_blocking(void *data, Ecore_Thread *thread)
+{
+#define PART_SYNTAX_CNT 14
+
+   const char *GROUP = "group";
+   const int GROUP_LEN = 5;
+   const char *PARTS = "parts";
+   const int PARTS_LEN = 5;
+   const char *PART[PART_SYNTAX_CNT] = { "part", "image", "textblock",
+        "swallow", "rect", "group", "spacer", "proxy", "text", "gradient",
+        "box", "table", "external", "vector" };
+   const int PART_LEN[PART_SYNTAX_CNT] =
+     { 4, 5, 9, 6, 4, 5, 6, 5, 4, 8, 3, 5, 8, 6};
+
+   const char *DESC[2] = { "desc", "description" };
+   const int DESC_LEN[2] = { 4, 11 };
+   const char *STATE = "state";
+   const char *DEF_STATE_NAME = "default";
+   const int DEF_STATE_LEN = 7;
+
+   cur_context_td *td = data;
+   char *utf8 = td->utf8;
+   int cur_pos = td->cur_pos;
+   char *p = utf8;
+   char *end = utf8 + cur_pos;
+   int i;
+   Eina_Bool inside_parts = EINA_FALSE;
+   Eina_Bool collections = td->collections;
+
+   int bracket = 0;
+   const char *group_name = NULL;
+   const char *part_name = NULL;
+   int group_name_len = 0;
+   int part_name_len = 0;
+
+   const char *desc_name = NULL;
+   int desc_name_len = 0;
+   const char *value = NULL;
+   int value_len = 0;
+   double value_convert = 0.0;
+
+   if (!collections) bracket = 1;
+
+   td->part_name = NULL;
+   td->group_name = NULL;
+   td->state_name = NULL;
+
+   while (p && p <= end)
+     {
+        if (ecore_thread_check(thread)) break;
+
+        //Skip "" range
+        if (!strncmp(p, QUOT_UTF8, QUOT_UTF8_LEN))
+          {
+             p += QUOT_UTF8_LEN;
+             p = strstr(p, QUOT_UTF8);
+             if (!p) goto end;
+             p += QUOT_UTF8_LEN;
+             continue;
+          }
+
+        //Enter one depth into Bracket.
+        if (*p == '{')
+          {
+             bracket++;
+             p++;
+             continue;
+          }
+        //Check inside comment
+        if (*p == '/')
+          {
+             if (p[1] == '/')
+               {
+                 p = strchr(p, '\n');
+                 continue;
+               }
+             else if (p[1] == '*')
+               {
+                 p = strstr(p, "*/");
+                 continue;
+               }
+          }
+        //Skip #if ~ #endif
+        if (!strncmp(p, "#if", 3))
+          {
+             p = strstr(p, "#endif");
+             if (!p) goto end;
+             p += 6; //strlen(#endif)
+             continue;
+          }
+
+        //Skip #define
+        if (!strncmp(p, "#define", 7))
+          {
+             //escape "\", "ie, #define .... \"
+             p += 7; //strlen(#define)
+
+             while (p <= end)
+               {
+                  char *eol = strstr(p, "\n");
+                  if (!eol) goto end;
+
+                  char *slash = strstr(p, "\\");
+
+                  p = eol + 1;
+
+                  if (!slash || (eol < slash))
+                    break;
+               }
+             continue;
+          }
+        //Check whether outside of description or part or group
+        if ((*p == '}') && (p < end))
+          {
+             bracket--;
+             p++;
+             if (bracket == 1) group_name = NULL;
+             else if (bracket == 2 && inside_parts == EINA_TRUE)
+               inside_parts = EINA_FALSE;
+             else if (bracket == 3) part_name = NULL;
+             else if (bracket == 4) desc_name = NULL;
+             continue;
+          }
+        //check block "Parts" in
+        if (bracket == 2)
+          {
+             if (!strncmp(p, PARTS, PARTS_LEN))
+               {
+                 inside_parts = EINA_TRUE;
+                 p = strstr(p, "{");
+                 if (!p) goto end;
+                 continue;
+               }
+         }
+        //Check Part in
+        if (bracket == 3)
+          {
+             int part_idx = -1;
+              //part ? image ? swallow ? text ? rect ?
+             for (i = 0; i < PART_SYNTAX_CNT; i++)
+                {
+                   if (!strncmp(p, PART[i], PART_LEN[i]))
+                     {
+                        part_idx = i;
+                        break;
+                     }
+                }
+
+              //we got a part!
+              if (part_idx != -1)
+                {
+                   p += PART_LEN[part_idx];
+                   char *name_begin = strstr(p, QUOT_UTF8);
+                   if (!name_begin) goto end;
+                   name_begin += QUOT_UTF8_LEN;
+                   p = name_begin;
+                   char *name_end = strstr(p, QUOT_UTF8);
+                   if (!name_end) goto end;
+                   part_name = name_begin;
+                   part_name_len = name_end - name_begin;
+                   p = name_end + QUOT_UTF8_LEN;
+                   bracket++;
+                   continue;
+                }
+          }
+        //Check Description in
+        if (bracket == 4)
+          {
+             //description? or desc?
+             int desc_idx = -1;
+             if (!strncmp(p, DESC[1], DESC_LEN[1])) desc_idx = 1;
+             else if (!strncmp(p, DESC[0], DESC_LEN[0])) desc_idx = 0;
+
+             //we got a description!
+             if (desc_idx != -1)
+               {
+                  /* By default state will be */
+                  desc_name = DEF_STATE_NAME;
+                  /* recognized as "default" 0.0*/
+                  desc_name_len = DEF_STATE_LEN;
+                  value_convert = 0;
+
+                  /* skip keyword */
+                  p += DESC_LEN[desc_idx];
+                  p = strstr(p, "{");
+                  if (!p) goto end;
+                  /*Limit size of text for processing*/
+                  char *end_brace = strstr(p, "}");
+                  if (!end_brace)
+                     goto end;
+
+                  /* proccessing for "description" keyword with "state"
+                     attribute */
+                  if (desc_idx == 1)
+                    {
+                       char *state = strstr(p, STATE);
+                       /* if name of state didn't find, */
+                       if (!state || state > end_brace)
+                         {
+                            /* description will recognized as default 0.0*/
+                            continue;
+                         }
+                       else
+                         {
+                            /*5 is strlen("state");*/
+                            p += 5;
+                         }
+                    }
+
+                  char *name_begin = strstr(p, QUOT_UTF8);
+                  if (!name_begin)
+                     continue;
+                  char *end_range = strstr(p, ";");
+                  if (!end_range) goto end;
+
+                  /* if string placed outside desc block*/
+                  if ((name_begin > end_brace) || (name_begin > end_range) ||
+                      (end_range > end_brace))
+                    continue;
+
+                  /* Exception cases like: desc {image.normal: "img";} */
+                  int alpha_present = 0;
+                  char *string_itr;
+                  for (string_itr = name_begin;
+                       (string_itr > p) && (!alpha_present); string_itr--)
+                    alpha_present = isalpha((int)*string_itr);
+
+                  if (alpha_present && desc_idx == 0)
+                    continue;
+
+                  /*Extract state name and value */
+                  name_begin += QUOT_UTF8_LEN;
+                  p = name_begin;
+                  char *name_end = strstr(p, QUOT_UTF8);
+                  if (!name_end) goto end;
+                  desc_name = name_begin;
+                  desc_name_len = name_end - name_begin;
+                  p = name_end + QUOT_UTF8_LEN;
+                  value = p;
+                  bracket++;
+
+                  char *value_end = strchr(value, ';');
+                  char *value_buf = NULL;
+                  while (value < value_end)
+                    {
+                       if (isdigit(*value) || *value == '.')
+                         {
+                            value_len = value_end - value;
+                            value_buf = (char *)calloc(1, value_len);
+                            memcpy(value_buf, value, value_len);
+                            break;
+                         }
+                       value++;
+                    }
+                  if (value_buf)
+                    {
+                       value_convert = atof(value_buf);
+                       free(value_buf);
+                    }
+                  continue;
+               }
+          }
+        //Check Group in. Probably inside of collections or the most outside.
+        if (bracket == 1)
+          {
+             if (!strncmp(p, GROUP, GROUP_LEN))
+               {
+                  p += GROUP_LEN;
+                  char *name_begin = strstr(p, QUOT_UTF8);
+                  if (!name_begin) goto end;
+                  name_begin += QUOT_UTF8_LEN;
+                  p = name_begin;
+                  char *name_end = strstr(p, QUOT_UTF8);
+                  if (!name_end) goto end;
+
+                  group_name = name_begin;
+                  group_name_len = name_end - name_begin;
+                  p = name_end + QUOT_UTF8_LEN;
+                  bracket++;
+                  continue;
+               }
+          }
+        p++;
+     }
+   if (part_name)
+     part_name = eina_stringshare_add_length(part_name, part_name_len);
+   if (desc_name)
+     desc_name = eina_stringshare_add_length(desc_name, desc_name_len);
+   if (group_name)
+     group_name = eina_stringshare_add_length(group_name, group_name_len);
+
+   td->part_name = part_name;
+   td->group_name = group_name;
+   td->state_name = desc_name;
+   td->state_value = value_convert;
+
+end:
+   free(utf8);
+   td->utf8 = NULL;
+}
+
+Eina_Stringshare *
+parser_cur_context_group_name_get(parser_data *pd EINA_UNUSED,
+                                  Evas_Object *entry, Eina_Bool collections)
+{
+   const char *GROUP = "group";
+   const int GROUP_LEN = 5;
+   const char *markup = elm_entry_entry_get(entry);
+   char *utf8 = elm_entry_markup_to_utf8(markup);
+   char *p = utf8;
+   int cur_pos = elm_entry_cursor_pos_get(entry);
+   char *end = utf8 + cur_pos;
+   int bracket = 0;
+   const char *group_name = NULL;
+   int group_name_len = 0;
+
+   if (!collections) bracket = 1;
+
+   while (p && (p <= end))
+     {
+        //Skip "" range
+        if (!strncmp(p, QUOT_UTF8, QUOT_UTF8_LEN))
+          {
+             p += QUOT_UTF8_LEN;
+             p = strstr(p, QUOT_UTF8);
+             if (!p) goto end;
+             p += QUOT_UTF8_LEN;
+             continue;
+          }
+        //Enter one depth into Bracket.
+        if (*p == '{')
+          {
+             bracket++;
+             p++;
+             continue;
+          }
+        //Check inside comment
+        if (*p == '/')
+          {
+             if (p[1] == '/')
+               {
+                 p = strchr(p, '\n');
+                 continue;
+               }
+             else if (p[1] == '*')
+               {
+                 p = strstr(p, "*/");
+                 continue;
+               }
+          }
+        //Skip #if ~ #endif
+        if (!strncmp(p, "#if", 3))
+          {
+             p = strstr(p, "#endif");
+             if (!p) goto end;
+             p += 6; //strlen(#endif)
+             continue;
+          }
+        //Skip #define
+        if (!strncmp(p, "#define", 7))
+          {
+             //escape "\", "ie, #define .... \"
+             p += 7; //strlen(#define)
+
+             while (p <= end)
+               {
+                  char *eol = strstr(p, "\n");
+                  if (!eol) goto end;
+
+                  char *slash = strstr(p, "\\");
+
+                  p = eol + 1;
+
+                  if (!slash || (eol < slash))
+                    break;
+               }
+             continue;
+          }
+        //Check whether outside of description or part or group
+        if ((*p == '}') && (p < end))
+          {
+             bracket--;
+             p++;
+             if (bracket == 1) group_name = NULL;
+             continue;
+          }
+        //Check Group in. Probably inside of collections or the most outside.
+        if (bracket == 1)
+          {
+             if (!strncmp(p, GROUP, GROUP_LEN))
+               {
+                  p += GROUP_LEN;
+                  char *name_begin = strstr(p, QUOT_UTF8);
+                  if (!name_begin) goto end;
+                  name_begin += QUOT_UTF8_LEN;
+                  p = name_begin;
+                  char *name_end = strstr(p, QUOT_UTF8);
+                  if (!name_end) goto end;
+
+                  group_name = name_begin;
+                  group_name_len = name_end - name_begin;
+                  p = name_end + QUOT_UTF8_LEN;
+                  bracket++;
+                  continue;
+               }
+          }
+        p++;
+     }
+   if (group_name)
+     group_name = eina_stringshare_add_length(group_name, group_name_len);
+
+end:
+   free(utf8);
+   return group_name;
+}
+
+static void
+cur_context_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   cur_context_td *td = data;
+   if (td->pd) td->pd->cntd = NULL;
+   eina_stringshare_del(td->state_name);
+   eina_stringshare_del(td->part_name);
+   eina_stringshare_del(td->group_name);
+   free(td);
+}
+
+static void
+cur_context_thread_end(void *data, Ecore_Thread *thread)
+{
+   cur_context_td *td = data;
+   td->cb(td->cb_data, td->state_name, td->state_value,  td->part_name,
+          td->group_name);
+   cur_context_thread_cancel(data, thread);
+}
+
+
+static void
+type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   type_init_td *td = data;
+   parser_attr attr;
+   td->attrs = eina_inarray_new(sizeof(parser_attr), 24);
+   eina_inarray_step_set(td->attrs, sizeof(Eina_Inarray), sizeof(parser_attr),
+                         4);
+   //Tizen Only : Support Tizen version
+   const char *tizen_version = td->tizen_version;
+   //
+
+   //FIXME: construct from the configuration file.
+
+   //Type: Constant
+   Eina_Array *types = eina_array_new(11);
+   eina_array_push(types, eina_stringshare_add("RECT"));
+   eina_array_push(types, eina_stringshare_add("TEXT"));
+   eina_array_push(types, eina_stringshare_add("IMAGE"));
+   eina_array_push(types, eina_stringshare_add("SWALLOW"));
+   eina_array_push(types, eina_stringshare_add("TEXTBLOCK"));
+   eina_array_push(types, eina_stringshare_add("GROUP"));
+   eina_array_push(types, eina_stringshare_add("BOX"));
+   eina_array_push(types, eina_stringshare_add("TABLE"));
+   eina_array_push(types, eina_stringshare_add("EXTERNAL"));
+   eina_array_push(types, eina_stringshare_add("PROXY"));
+   eina_array_push(types, eina_stringshare_add("SPACER"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("type");
+   attr.value.strs = types;
+   attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   //Context depended attributes
+   Eina_Array *wh = eina_array_new(2);
+   eina_array_push(wh, eina_stringshare_add("W:"));
+   eina_array_push(wh, eina_stringshare_add("H:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("min");
+   attr.value.strs = wh;
+   attr.value.cnt = 2;
+   attr.value.min = 0;
+   attr.value.max = 1;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   attr.context = eina_stringshare_add("text");
+   eina_inarray_push(td->attrs, &attr);
+
+   wh = eina_array_new(2);
+   eina_array_push(wh, eina_stringshare_add("W:"));
+   eina_array_push(wh, eina_stringshare_add("H:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("max");
+   attr.value.strs = wh;
+   attr.value.cnt = 2;
+   attr.value.min = 0;
+   attr.value.max = 1;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   attr.context = eina_stringshare_add("text");
+   eina_inarray_push(td->attrs, &attr);
+
+   wh = eina_array_new(2);
+   eina_array_push(wh, eina_stringshare_add("W:"));
+   eina_array_push(wh, eina_stringshare_add("H:"));
+
+   //Tizen Only : Support Tizen version
+   // Context independed attributes
+   //Eina_Array *trans = eina_array_new(11);
+   //eina_array_push(trans, eina_stringshare_add("LINEAR"));
+   //eina_array_push(trans, eina_stringshare_add("ACCELERATE"));
+   //eina_array_push(trans, eina_stringshare_add("DECELERATE"));
+   //eina_array_push(trans, eina_stringshare_add("SINUSOIDAL"));
+   //eina_array_push(trans, eina_stringshare_add("ACCELERATE_FACTOR"));
+   //eina_array_push(trans, eina_stringshare_add("DECELERATE_FACTOR"));
+   //eina_array_push(trans, eina_stringshare_add("SINUSOIDAL_FACTOR"));
+   //eina_array_push(trans, eina_stringshare_add("DIVISOR_INTERP"));
+   //eina_array_push(trans, eina_stringshare_add("BOUNCE"));
+   //eina_array_push(trans, eina_stringshare_add("SPRING"));
+   //eina_array_push(trans, eina_stringshare_add("CUBIC_BEZIER"));
+
+   // Context independed attributes
+   Eina_Array *trans;
+   //Support keywords for Tizen version 2.3
+   if (tizen_version && !strcmp(tizen_version, "2.3"))
+     trans = eina_array_new(10);
+   //Support keywords for Tizen version since 2.3.1 (2.3.1, 2.3.2, 2.4, 3.0)
+   else
+     trans = eina_array_new(11);
+
+   eina_array_push(trans, eina_stringshare_add("LINEAR"));
+   eina_array_push(trans, eina_stringshare_add("ACCELERATE"));
+   eina_array_push(trans, eina_stringshare_add("DECELERATE"));
+   eina_array_push(trans, eina_stringshare_add("SINUSOIDAL"));
+   eina_array_push(trans, eina_stringshare_add("ACCELERATE_FACTOR"));
+   eina_array_push(trans, eina_stringshare_add("DECELERATE_FACTOR"));
+   eina_array_push(trans, eina_stringshare_add("SINUSOIDAL_FACTOR"));
+   eina_array_push(trans, eina_stringshare_add("DIVISOR_INTERP"));
+   eina_array_push(trans, eina_stringshare_add("BOUNCE"));
+   eina_array_push(trans, eina_stringshare_add("SPRING"));
+
+   //Support keywords for Tizen version since 2.3.1 (2.3.1, 2.3.2, 2.4, 3.0)
+   if (!tizen_version || strcmp(tizen_version, "2.3"))
+     eina_array_push(trans, eina_stringshare_add("CUBIC_BEZIER"));
+   //
+
+   Eina_Array *trans_append_str;
+   //Support keywords for Tizen version 2.3
+   if (tizen_version && !strcmp(tizen_version, "2.3"))
+     trans_append_str = eina_array_new(10);
+   //Support keywords for Tizen version since 2.3.1 (2.3.1, 2.3.2, 2.4, 3.0)
+   else
+     trans_append_str = eina_array_new(11);
+
+   eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME));
+   eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME));
+   eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME));
+   eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME));
+   eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME_FACTOR));
+   eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME_FACTOR));
+   eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME_FACTOR));
+   eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME_FACTOR2));
+   eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME_FACTOR2));
+   eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME_FACTOR2));
+
+   //Support keywords for Tizen version since 2.3.1 (2.3.1, 2.3.2, 2.4, 3.0)
+   if (!tizen_version || strcmp(tizen_version, "2.3"))
+     eina_array_push(trans_append_str, eina_stringshare_add(ATTR_APPEND_TRANSITION_TIME_FACTOR4));
+   //
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("transition");
+   attr.value.strs = trans;
+   attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str_array = trans_append_str;
+   attr.value.use_append_str_array = EINA_TRUE;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *aspect_mode = eina_array_new(5);
+   eina_array_push(aspect_mode, eina_stringshare_add("NONE"));
+   eina_array_push(aspect_mode, eina_stringshare_add("NEITHER"));
+   eina_array_push(aspect_mode, eina_stringshare_add("VERTICAL"));
+   eina_array_push(aspect_mode, eina_stringshare_add("HORIZONTAL"));
+   eina_array_push(aspect_mode, eina_stringshare_add("BOTH"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("aspect_mode");
+   attr.value.strs = aspect_mode;
+   attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *aspect_prefer = eina_array_new(5);
+   eina_array_push(aspect_prefer, eina_stringshare_add("NONE"));
+   eina_array_push(aspect_prefer, eina_stringshare_add("VERTICAL"));
+   eina_array_push(aspect_prefer, eina_stringshare_add("HORIZONTAL"));
+   eina_array_push(aspect_prefer, eina_stringshare_add("BOTH"));
+   eina_array_push(aspect_prefer, eina_stringshare_add("SOURCE"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("aspect_preference");
+   attr.value.strs = aspect_prefer;
+   attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *effect = eina_array_new(11);
+   eina_array_push(effect, eina_stringshare_add("NONE"));
+   eina_array_push(effect, eina_stringshare_add("PLAIN"));
+   eina_array_push(effect, eina_stringshare_add("OUTLINE"));
+   eina_array_push(effect, eina_stringshare_add("SOFT_OUTLINE"));
+   eina_array_push(effect, eina_stringshare_add("SHADOW"));
+   eina_array_push(effect, eina_stringshare_add("SOFT_SHADOW"));
+   eina_array_push(effect, eina_stringshare_add("OUTLINE_SHADOW"));
+   eina_array_push(effect, eina_stringshare_add("OUTLINE_SOFT_SHADOW"));
+   eina_array_push(effect, eina_stringshare_add("FAR_SHADOW"));
+   eina_array_push(effect, eina_stringshare_add("FAR_SOFT_SHADOW"));
+   eina_array_push(effect, eina_stringshare_add("GLOW"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("effect");
+   attr.value.strs = effect;
+   attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   //Tizen Only : Support Tizen version
+   //Eina_Array *action = eina_array_new(22);
+   //eina_array_push(action, eina_stringshare_add("STATE_SET"));
+   //eina_array_push(action, eina_stringshare_add("ACTION_STOP"));
+   //eina_array_push(action, eina_stringshare_add("SIGNAL_EMIT"));
+   //eina_array_push(action, eina_stringshare_add("DRAG_VAL_SET"));
+   //eina_array_push(action, eina_stringshare_add("DRAG_VAL_STEP"));
+   //eina_array_push(action, eina_stringshare_add("DRAG_VAL_PAGE"));
+   //eina_array_push(action, eina_stringshare_add("SCRIPT"));
+   //eina_array_push(action, eina_stringshare_add("FOCUS_SET"));
+   //eina_array_push(action, eina_stringshare_add("FOCUS_OBJECT"));
+   //eina_array_push(action, eina_stringshare_add("PARAM_COPY"));
+   //eina_array_push(action, eina_stringshare_add("PARAM_SET"));
+   //eina_array_push(action, eina_stringshare_add("PLAY_SAMPLE"));
+   //eina_array_push(action, eina_stringshare_add("PLAY_TONE"));
+   //eina_array_push(action, eina_stringshare_add("PHYSICS_IMPULSE"));
+   //eina_array_push(action, eina_stringshare_add("PHYSICS_TORQUE_IMPULSE"));
+   //eina_array_push(action, eina_stringshare_add("PHYSICS_FORCE"));
+   //eina_array_push(action, eina_stringshare_add("PHYSICS_TORQUE"));
+   //eina_array_push(action, eina_stringshare_add("PHYSICS_FORCES_CLEAR"));
+   //eina_array_push(action, eina_stringshare_add("PHYSICS_VEL_SET"));
+   //eina_array_push(action, eina_stringshare_add("PHYSICS_ANG_VEL_SET"));
+   //eina_array_push(action, eina_stringshare_add("PHYSICS_STOP"));
+   //eina_array_push(action, eina_stringshare_add("PHYSICS_ROT_SET"));
+
+   Eina_Array *action;
+   //Support keywords for Tizen version 2.3.x (2.3, 2.3.1, 2.3.2)
+   if (tizen_version && !strncmp(tizen_version, "2.3", strlen("2.3")))
+     action = eina_array_new(13);
+   //Support keywords for Tizen version since 2.4 (2.4, 3.0)
+   else
+     action = eina_array_new(22);
+
+   eina_array_push(action, eina_stringshare_add("STATE_SET"));
+   eina_array_push(action, eina_stringshare_add("ACTION_STOP"));
+   eina_array_push(action, eina_stringshare_add("SIGNAL_EMIT"));
+   eina_array_push(action, eina_stringshare_add("DRAG_VAL_SET"));
+   eina_array_push(action, eina_stringshare_add("DRAG_VAL_STEP"));
+   eina_array_push(action, eina_stringshare_add("DRAG_VAL_PAGE"));
+   eina_array_push(action, eina_stringshare_add("SCRIPT"));
+   eina_array_push(action, eina_stringshare_add("FOCUS_SET"));
+   eina_array_push(action, eina_stringshare_add("FOCUS_OBJECT"));
+   eina_array_push(action, eina_stringshare_add("PARAM_COPY"));
+   eina_array_push(action, eina_stringshare_add("PARAM_SET"));
+   eina_array_push(action, eina_stringshare_add("PLAY_SAMPLE"));
+   eina_array_push(action, eina_stringshare_add("PLAY_TONE"));
+
+   //Support keywords for Tizen version since 2.4 (2.4, 3.0)
+   if (!tizen_version || strncmp(tizen_version, "2.3", strlen("2.3")))
+     {
+        eina_array_push(action, eina_stringshare_add("PHYSICS_IMPULSE"));
+        eina_array_push(action, eina_stringshare_add("PHYSICS_TORQUE_IMPULSE"));
+        eina_array_push(action, eina_stringshare_add("PHYSICS_FORCE"));
+        eina_array_push(action, eina_stringshare_add("PHYSICS_TORQUE"));
+        eina_array_push(action, eina_stringshare_add("PHYSICS_FORCES_CLEAR"));
+        eina_array_push(action, eina_stringshare_add("PHYSICS_VEL_SET"));
+        eina_array_push(action, eina_stringshare_add("PHYSICS_ANG_VEL_SET"));
+        eina_array_push(action, eina_stringshare_add("PHYSICS_STOP"));
+        eina_array_push(action, eina_stringshare_add("PHYSICS_ROT_SET"));
+     }
+   //
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("action");
+   attr.value.strs = action;
+   attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *sig = eina_array_new(15);
+   eina_array_push(sig, eina_stringshare_add("\"mouse,down,*\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,down,1\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,down,2\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,down,3\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,up,*\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,up,1\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,up,2\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,up,3\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,clicked,*\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,clicked,1\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,clicked,2\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,clicked,3\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,move\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,in\""));
+   eina_array_push(sig, eina_stringshare_add("\"mouse,out\""));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("signal");
+   attr.value.strs = sig;
+   attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   //Type: Integer
+   Eina_Array *rgba = eina_array_new(4);
+   eina_array_push(rgba, eina_stringshare_add("R:"));
+   eina_array_push(rgba, eina_stringshare_add("G:"));
+   eina_array_push(rgba, eina_stringshare_add("B:"));
+   eina_array_push(rgba, eina_stringshare_add("A:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("color");
+   attr.value.strs = rgba;
+   attr.value.cnt = 4;
+   attr.value.min = 0;
+   attr.value.max = 255;
+   attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   rgba = eina_array_new(4);
+   eina_array_push(rgba, eina_stringshare_add("R:"));
+   eina_array_push(rgba, eina_stringshare_add("G:"));
+   eina_array_push(rgba, eina_stringshare_add("B:"));
+   eina_array_push(rgba, eina_stringshare_add("A:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("color2");
+   attr.value.strs = rgba;
+   attr.value.cnt = 4;
+   attr.value.min = 0;
+   attr.value.max = 255;
+   attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   rgba = eina_array_new(4);
+   eina_array_push(rgba, eina_stringshare_add("R:"));
+   eina_array_push(rgba, eina_stringshare_add("G:"));
+   eina_array_push(rgba, eina_stringshare_add("B:"));
+   eina_array_push(rgba, eina_stringshare_add("A:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("color3");
+   attr.value.strs = rgba;
+   attr.value.cnt = 4;
+   attr.value.min = 0;
+   attr.value.max = 255;
+   attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *scale = eina_array_new(1);
+   eina_array_push(scale, eina_stringshare_add("Scale:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("scale");
+   attr.value.strs = scale;
+   attr.value.cnt = 1;
+   attr.value.min = 0;
+   attr.value.max = 1;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *smooth = eina_array_new(1);
+   eina_array_push(smooth, eina_stringshare_add("Smooth:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("smooth");
+   attr.value.strs = smooth;
+   attr.value.cnt = 1;
+   attr.value.min = 0;
+   attr.value.max = 1;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *visible = eina_array_new(1);
+   eina_array_push(visible, eina_stringshare_add("Visibility:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("visible");
+   attr.value.strs = visible;
+   attr.value.cnt = 1;
+   attr.value.min = 0;
+   attr.value.max = 1;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *onoff = eina_array_new(1);
+   eina_array_push(onoff, eina_stringshare_add("Map:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("on");
+   attr.value.strs = onoff;
+   attr.value.cnt = 1;
+   attr.value.min = 0;
+   attr.value.max = 1;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *xy = eina_array_new(2);
+   eina_array_push(xy, eina_stringshare_add("X:"));
+   eina_array_push(xy, eina_stringshare_add("Y:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("fixed");
+   attr.value.strs = xy;
+   attr.value.cnt = 2;
+   attr.value.min = 0;
+   attr.value.max = 1;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *size = eina_array_new(1);
+   eina_array_push(size, eina_stringshare_add("Size:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("size");
+   attr.value.strs = size;
+   attr.value.cnt = 1;
+   attr.value.min = 1;
+   attr.value.max = 255;
+   attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   wh = eina_array_new(2);
+   eina_array_push(wh, eina_stringshare_add("W:"));
+   eina_array_push(wh, eina_stringshare_add("H:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("min");
+   attr.value.strs = wh;
+   attr.value.cnt = 2;
+   attr.value.min = 0;
+   attr.value.max = 1000;
+   attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   wh = eina_array_new(2);
+   eina_array_push(wh, eina_stringshare_add("W:"));
+   eina_array_push(wh, eina_stringshare_add("H:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("max");
+   attr.value.strs = wh;
+   attr.value.cnt = 2;
+   attr.value.min = 0;
+   attr.value.max = 1000;
+   attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *mouse_events = eina_array_new(1);
+   eina_array_push(mouse_events, eina_stringshare_add("Mouse Events:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("mouse_events");
+   attr.value.strs = mouse_events;
+   attr.value.cnt = 1;
+   attr.value.min = 0;
+   attr.value.max = 1;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   xy = eina_array_new(2);
+   eina_array_push(xy, eina_stringshare_add("X:"));
+   eina_array_push(xy, eina_stringshare_add("Y:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("offset");
+   attr.value.strs = xy;
+   attr.value.cnt = 2;
+   attr.value.min = -100;
+   attr.value.max = 100;
+   attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   //Type: Float
+   xy = eina_array_new(2);
+   eina_array_push(xy, eina_stringshare_add("X:"));
+   eina_array_push(xy, eina_stringshare_add("Y:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("relative");
+   attr.value.strs = xy;
+   attr.value.cnt = 2;
+   attr.value.min = 0.0;
+   attr.value.max = 1;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   wh = eina_array_new(2);
+   eina_array_push(wh, eina_stringshare_add("Min:"));
+   eina_array_push(wh, eina_stringshare_add("Max:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("aspect");
+   attr.value.strs = wh;
+   attr.value.cnt = 2;
+   attr.value.min = 0.0;
+   attr.value.max = 1.0;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   xy = eina_array_new(2);
+   eina_array_push(xy, eina_stringshare_add("X:"));
+   eina_array_push(xy, eina_stringshare_add("Y:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("align");
+   attr.value.strs = xy;
+   attr.value.cnt = 2;
+   attr.value.min = 0.0;
+   attr.value.max = 1.0;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *duration = eina_array_new(1);
+   eina_array_push(duration, eina_stringshare_add("Time:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("LINEAR");
+   attr.value.strs = duration;
+   attr.value.cnt = 1;
+   attr.value.min = 0.0;
+   attr.value.max = 5.0;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_NONE;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   duration = eina_array_new(1);
+   eina_array_push(duration, eina_stringshare_add("Time:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("ACCELERATE");
+   attr.value.strs = duration;
+   attr.value.cnt = 1;
+   attr.value.min = 0.0;
+   attr.value.max = 5.0;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_NONE;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   duration = eina_array_new(1);
+   eina_array_push(duration, eina_stringshare_add("Time:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("DECELERATE");
+   attr.value.strs = duration;
+   attr.value.cnt = 1;
+   attr.value.min = 0.0;
+   attr.value.max = 5.0;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_NONE;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   duration = eina_array_new(1);
+   eina_array_push(duration, eina_stringshare_add("Time:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("SINUSOIDAL");
+   attr.value.strs = duration;
+   attr.value.cnt = 1;
+   attr.value.min = 0.0;
+   attr.value.max = 5.0;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_NONE;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *duration_factor = eina_array_new(2);
+   eina_array_push(duration_factor, eina_stringshare_add("Time:"));
+   eina_array_push(duration_factor, eina_stringshare_add("Factor:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("ACCELERATE_FACTOR");
+   attr.value.strs = duration_factor;
+   attr.value.cnt = 2;
+   attr.value.min = 0.0;
+   attr.value.max = 5.0;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_NONE;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   duration_factor = eina_array_new(2);
+   eina_array_push(duration_factor, eina_stringshare_add("Time:"));
+   eina_array_push(duration_factor, eina_stringshare_add("Factor:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("DECELERATE_FACTOR");
+   attr.value.strs = duration_factor;
+   attr.value.cnt = 2;
+   attr.value.min = 0.0;
+   attr.value.max = 5.0;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_NONE;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   duration_factor = eina_array_new(2);
+   eina_array_push(duration_factor, eina_stringshare_add("Time:"));
+   eina_array_push(duration_factor, eina_stringshare_add("Factor:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("SINUSOIDAL_FACTOR");
+   attr.value.strs = duration_factor;
+   attr.value.cnt = 2;
+   attr.value.min = 0.0;
+   attr.value.max = 5.0;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_NONE;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   Eina_Array *base_scale = eina_array_new(1);
+   eina_array_push(base_scale, eina_stringshare_add("Scale:"));
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("base_scale");
+   attr.value.strs = base_scale;
+   attr.value.cnt = 1;
+   attr.value.min = 0.01;
+   attr.value.max = 10.0;
+   attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   //Type: Part
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("target");
+   attr.value.type = ATTR_VALUE_PART;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("to");
+   attr.value.type = ATTR_VALUE_PART;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("source");
+   attr.value.type = ATTR_VALUE_PART;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("to_x");
+   attr.value.type = ATTR_VALUE_PART;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("to_y");
+   attr.value.type = ATTR_VALUE_PART;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   //Type: State
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("STATE_SET");
+   attr.value.type = ATTR_VALUE_STATE;
+   attr.value.prepend_str = ATTR_PREPEND_NONE;
+   //Tizen Only : Support Tizen version
+   //attr.value.append_str = ATTR_APPEND_SEMICOLON;
+
+   //Support keywords for Tizen version 2.x (2.3, 2.3.1, 2.3.2, 2.4)
+   if (tizen_version && (!strncmp(tizen_version, "2.3", strlen("2.3")) ||
+                         !strncmp(tizen_version, "2.4", strlen("2.4"))))
+     attr.value.append_str = ATTR_APPEND_STATE_VAL;
+   //Support keywords for Tizen version since 3.0
+   else
+     attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   //
+   attr.value.program = EINA_TRUE;
+   eina_inarray_push(td->attrs, &attr);
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("inherit");
+   attr.value.type = ATTR_VALUE_STATE;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   //Tizen Only : Support Tizen version
+   //attr.value.append_str = ATTR_APPEND_SEMICOLON;
+
+   //Support keywords for Tizen version 2.x (2.3, 2.3.1, 2.3.2, 2.4)
+   if (tizen_version && (!strncmp(tizen_version, "2.3", strlen("2.3")) ||
+                         !strncmp(tizen_version, "2.4", strlen("2.4"))))
+     attr.value.append_str = ATTR_APPEND_STATE_VAL;
+   //Support keywords for Tizen version since 3.0
+   else
+     attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   //
+   eina_inarray_push(td->attrs, &attr);
+
+   //Type: Image
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("normal");
+   attr.value.type = ATTR_VALUE_IMAGE;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("tween");
+   attr.value.type = ATTR_VALUE_IMAGE;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+
+   //Type: Program
+   memset(&attr, 0x00, sizeof(parser_attr));
+   attr.keyword = eina_stringshare_add("after");
+   attr.value.type = ATTR_VALUE_PROGRAM;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
+   eina_inarray_push(td->attrs, &attr);
+}
+
+static void
+type_init_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   type_init_td *td = data;
+   if (td->pd)
+     {
+        td->pd->titd = NULL;
+        td->pd->attrs = td->attrs;
+     }
+   free(td);
+}
+
+static void
+type_init_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   type_init_td *td = data;
+   if (td->pd) td->pd->titd = NULL;
+   free(td);
+}
+
+static const char *
+end_of_parts_block_find(const char *pos)
+{
+   //TODO: Process comments and quotes.
+   pos = strstr(pos, "parts");
+   if (!pos) return NULL;
+   pos = strstr(pos, "{");
+   if (!pos) return NULL;
+   pos++;
+   char level = 1;
+
+   while (*pos)
+     {
+        if (*pos == '{') level++;
+        else if (*pos == '}') level--;
+
+        if (!level) return --pos;
+        pos++;
+     }
+   return NULL;
+}
+
+static const char *
+group_beginning_pos_get(const char* source, const char *group_name)
+{
+   if (!group_name) return NULL;
+
+   const char* GROUP_SYNTAX_NAME = "group";
+   const char *quot = QUOT_UTF8;
+   const int quot_len = QUOT_UTF8_LEN;
+
+   const char *pos = strstr(source, GROUP_SYNTAX_NAME);
+   int group_name_len = strlen(group_name);
+
+   //TODO: Process comments and quotes.
+   while (pos)
+   {
+      const char *name = strstr(pos, quot);
+      if (!name) return NULL;
+      name += quot_len;
+      pos = strstr(name, quot);
+      if (!pos) return NULL;
+      if (!strncmp(name, group_name, group_name_len))
+        return pos;
+      pos = strstr(++pos,  GROUP_SYNTAX_NAME);
+   }
+
+   return NULL;
+}
+
+static Eina_Bool
+parser_collections_block_pos_get(const Evas_Object *entry,
+                                 const char *block_name, int *ret)
+{
+   if (!ret) return EINA_FALSE;
+
+   const char* GROUP_SYNTAX_NAME = "group";
+   const int BLOCK_NAME_LEN = strlen(block_name);
+   *ret = -1;
+
+   const char *text = elm_entry_entry_get(entry);
+   if (!text) return EINA_FALSE;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   if (!utf8) return EINA_FALSE;
+
+   int cur_cursor = elm_entry_cursor_pos_get(entry);
+   const char *pos = utf8 + cur_cursor;
+
+   int len = strlen(utf8);
+
+   /*
+    * The next loop processing the text of block "group"
+    * from actual cursor postion up to the block name or
+    * the "group" position.
+    * Returned value for the cases when the position
+    * found correctly will be the first symbol of the next line.
+    *
+    * TODO and FIXME: possible wrong behaviour when before the
+    * "group" keyword will be found part with name like "blah.group".
+    */
+
+   while (pos && (pos > utf8))
+     {
+        int block_pos = strncmp(block_name, pos, BLOCK_NAME_LEN);
+        if (block_pos == 0)
+          {
+             const char *block = pos + BLOCK_NAME_LEN;
+             while (block && (block < utf8 + len))
+               {
+                  if (*block == '.')
+                    {
+                       block = strchr(block, '\n');
+                       *ret = block - utf8 + 1;
+                       free(utf8);
+                       return EINA_FALSE;
+                    }
+                  else if (*block == '{')
+                    {
+                       block = strchr(block, '\n');
+                       *ret = block - utf8 + 1;
+                       free(utf8);
+                       return EINA_TRUE;
+                    }
+                  block++;
+               }
+             free(utf8);
+             return EINA_FALSE;
+          }
+        int group_pos = strncmp(GROUP_SYNTAX_NAME, pos, 5);
+        if (group_pos == 0)
+          {
+             const char *group_block = pos + 5;
+             while (group_block && (group_block < utf8 + len))
+               {
+                  if (*group_block == '{')
+                    {
+                       group_block = strchr(group_block, '\n');
+                       *ret = group_block - utf8 + 1;
+                       free(utf8);
+                       return EINA_FALSE;
+                    }
+                  group_block++;
+               }
+             free(utf8);
+             return EINA_FALSE;
+          }
+        pos--;
+      }
+   free(utf8);
+   return EINA_FALSE;
+}
+
+static void
+bracket_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   bracket_td *btd = data;
+   int left_bracket = -1;
+   int right_bracket = -1;
+   int cur_pos = btd->pos;
+   int depth = 0;
+   const char *utf8 = btd->text;
+
+   if (cur_pos == 0) return;
+
+   int length = strlen(utf8);
+
+   // left,  {
+   if (utf8[cur_pos] == '{')
+     {
+        left_bracket = cur_pos;
+        cur_pos++;
+        while (cur_pos < length)
+          {
+             if (utf8[cur_pos] == '{') depth++;
+             else if (utf8[cur_pos] == '}')
+               {
+                  if (depth) depth--;
+                  else
+                    {
+                       right_bracket = cur_pos;
+                       break;
+                    }
+               }
+             cur_pos++;
+          }
+     }
+   // left,  }
+   else if(utf8[cur_pos] == '}')
+     {
+        right_bracket = cur_pos;
+        cur_pos--;
+        while (cur_pos)
+          {
+             if (utf8[cur_pos] == '}') depth++;
+             else if(utf8[cur_pos] == '{')
+               {
+                  if(depth) depth--;
+                  else
+                    {
+                       left_bracket = cur_pos;
+                       break;
+                    }
+               }
+             cur_pos--;
+          }
+     }
+   // right, {
+   else if(utf8[cur_pos - 1] == '{')
+     {
+        left_bracket = cur_pos - 1;
+        while (cur_pos < length)
+          {
+             if (utf8[cur_pos] == '{') depth++;
+             else if (utf8[cur_pos] == '}')
+               {
+                  if (depth) depth--;
+                  else
+                    {
+                       right_bracket = cur_pos;
+                       break;
+                    }
+               }
+             cur_pos++;
+          }
+     }
+   // right, }
+   else if(utf8[cur_pos - 1] == '}')
+     {
+        right_bracket = cur_pos - 1;
+        cur_pos -= 2;
+        while (cur_pos)
+          {
+             if (utf8[cur_pos] == '}') depth++;
+             else if (utf8[cur_pos] == '{')
+               {
+                  if(depth) depth--;
+                  else
+                    {
+                       left_bracket = cur_pos;
+                       break;
+                    }
+               }
+             cur_pos--;
+          }
+     }
+
+   if (left_bracket == -1 || right_bracket == -1)
+     {
+        left_bracket = -1;
+        right_bracket = -1;
+     }
+
+   btd->left = left_bracket;
+   btd->right = right_bracket;
+}
+
+static void
+bracket_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   bracket_td *btd = data;
+   if (btd->pd) btd->pd->btd = NULL;
+   free(btd->text);
+   free(btd);
+}
+
+static void
+bracket_thread_end(void *data, Ecore_Thread *thread)
+{
+   bracket_td *btd = data;
+   btd->update_cb(btd->data, btd->left, btd->right);
+   bracket_thread_cancel(data, thread);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+parser_cancel(parser_data *pd)
+{
+   if (pd->cntd)
+     {
+        pd->cntd->pd = NULL;
+        ecore_thread_cancel(pd->cntd->thread);
+     }
+}
+
+char *
+parser_name_get(parser_data *pd EINA_UNUSED, const char *cur)
+{
+   if (!cur) return NULL;
+
+   char *p = (char *) cur;
+   char *end;
+   p = strstr(p, "\"");
+   if (!p) return NULL;
+   p++;
+   end = strstr(p, "\"");
+   if (!end) return NULL;
+
+   //Don't find if the name is in the next lines.
+   char *eol = strstr(cur, "\n");
+   if (eol && (eol < p)) return NULL;
+
+   return strndup(p, (end - p));
+}
+
+attr_value *
+parser_attribute_get(parser_data *pd, const char *text, const char *cur,
+                     const char *selected)
+{
+   if (!text || !cur) return NULL;
+   if ((*cur == ';') || (*cur == ':')) return NULL;
+
+   parser_attr *attr;
+   Eina_Bool instring = EINA_FALSE;
+
+   char *p = (char *) cur;
+
+   while (p >= text)
+     {
+        if (*p == '\"') instring = !instring;
+        p--;
+     }
+   if (instring) return NULL;
+
+   int name_count;
+   const char **cur_context = autocomp_current_context_get(&name_count);
+   int i;
+
+   EINA_INARRAY_FOREACH(pd->attrs, attr)
+     {
+        if (strcmp(selected, attr->keyword)) continue;
+        if (!attr->context) return &attr->value;
+        if (!cur_context) continue;
+        for (i = 0; i < name_count; i++)
+          {
+             if (!strcmp(cur_context[i], attr->context))
+               return &attr->value;
+          }
+     }
+
+   return NULL;
+}
+
+/* Function is_numberic is refer to the following url.
+   http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#C */
+static Eina_Bool
+is_numberic(const char *str)
+{
+   Eina_Bool ret = EINA_FALSE;
+   char *p;
+
+   if (!str || (*str == '\0') || isspace(*str))
+     return EINA_FALSE;
+
+   double v EINA_UNUSED  = strtod(str, &p);
+
+   if (*p == '\0') ret = EINA_TRUE;
+
+   return ret;
+}
+
+void
+parser_attribute_value_set(attr_value *value, char *cur)
+{
+   const char token[4] = " ;:";
+   char *str = strtok(cur, token);
+   int i;
+
+   if (!str) return;
+   str = strtok(NULL, token); //Skip the keyword
+
+   //Initialize attribute values
+   for (i = 0; i < value->cnt; i++)
+     value->val[i] = 0;
+
+   for (i = 0; str && (i < value->cnt); str = strtok(NULL, token))
+     {
+        if (!is_numberic(str)) continue;
+
+        value->val[i] = atof(str);
+        i++;
+     }
+}
+
+Eina_Stringshare *
+parser_paragh_name_get(parser_data *pd EINA_UNUSED, Evas_Object *entry)
+{
+   //FIXME: list up groups
+#define GROUP_CNT 20
+   typedef struct _group_info
+   {
+      char *str;
+      int len;
+   } group_info;
+
+   group_info group_list[GROUP_CNT] =
+     {
+        { "collections", 11 },
+        { "description", 11 },
+        { "desc", 4 },
+        { "fill", 4 },
+        { "group", 5 },
+        { "images", 6 },
+        { "image", 5 },
+        { "map", 3 },
+        { "origin", 6 },
+        { "parts", 5 },
+        { "part", 4 },
+        { "programs", 8 },
+        { "program", 7 },
+        { "rect", 4 },
+        { "rel1", 4 },
+        { "rel2", 4 },
+        { "spacer", 6 },
+        { "swallow", 7 },
+        { "textblock", 9 },
+        { "text", 4 }
+     };
+
+   const char *text = elm_entry_entry_get(entry);
+   if (!text) return NULL;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   if (!utf8) return NULL;
+
+   int cur_pos = elm_entry_cursor_pos_get(entry);
+   if (cur_pos < 1) return NULL;
+
+   const char *quot = QUOT_UTF8;
+   int quot_len = QUOT_UTF8_LEN;
+   char *cur = utf8;
+   char *end = cur + cur_pos;
+   char *stack[20];
+   int depth = 0;
+
+   //1. Figure out depth.
+   while (cur <= end)
+     {
+        //Skip "" range
+        if (!strncmp(cur, quot, quot_len))
+          {
+             cur += quot_len;
+             cur = strstr(cur, quot);
+             if (!cur)
+               {
+                  free(utf8);
+                  return NULL;
+               }
+             cur += quot_len;
+          }
+
+        if (*cur == '{')
+          {
+             stack[depth] = cur;
+             depth++;
+          }
+        else if (*cur == '}')
+          {
+             if (depth > 0) depth--;
+          }
+        cur++;
+     }
+
+   if (depth == 0)
+     {
+        free(utf8);
+        return NULL;
+     }
+
+   //2. Parse the paragraph Name
+   cur = stack[depth - 1];
+   int i;
+   while (cur > utf8)
+     {
+        cur--;
+        for (i = 0; i < GROUP_CNT; i++)
+          {
+             group_info *gi = &group_list[i];
+             if (!strncmp(cur, gi->str, gi->len))
+               {
+                  free(utf8);
+                  return eina_stringshare_add_length(gi->str, gi->len);
+               }
+          }
+     }
+
+   free(utf8);
+   return NULL;
+}
+
+Eina_Stringshare*
+parser_cur_context_fast_get(Evas_Object *entry, const char *scope)
+{
+   const char *quot = QUOT_UTF8;
+   const int quot_len = QUOT_UTF8_LEN;
+   const int scope_len = strlen(scope);
+
+   const char *text = elm_entry_entry_get(entry);
+   if (!text) return NULL;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   if (!utf8) return NULL;
+
+   int cur_pos = elm_entry_cursor_pos_get(entry);
+
+   char *p = utf8;
+   char *end = utf8 + cur_pos;
+
+   int bracket = 0;
+   const char *name = NULL;
+   int name_len = 0;
+
+   while (p <= end)
+     {
+        //Skip "" range
+        if (!strncmp(p, quot, quot_len))
+          {
+             p += quot_len;
+             p = strstr(p, quot);
+             if (!p) goto end;
+             p += quot_len;
+             continue;
+          }
+
+        if (*p == '{')
+          {
+             bracket++;
+             p++;
+             continue;
+          }
+
+        //Check whether outside of scope
+        if ((*p == '}') && (p < end))
+          {
+             bracket--;
+             p++;
+
+             if (bracket == 1) name = NULL;
+             continue;
+          }
+        //Check Scope in
+        if (!strncmp(p, scope, scope_len))
+          {
+             p += scope_len;
+             char *name_begin = strstr(p, quot);
+             if (!name_begin) goto end;
+             name_begin += quot_len;
+             p = name_begin;
+             char *name_end = strstr(p, quot);
+             if (!name_end) goto end;
+             name = name_begin;
+             name_len = name_end - name_begin;
+             p = name_end + quot_len;
+             bracket++;
+             continue;
+          }
+        p++;
+     }
+   if (name) name = eina_stringshare_add_length(name, name_len);
+
+end:
+   free(utf8);
+   return name;
+}
+
+void
+parser_cur_context_get(parser_data *pd, Evas_Object *entry,
+                       void (*cb)(void *data, Eina_Stringshare *state_name,
+                       double state_value, Eina_Stringshare *part_name,
+                       Eina_Stringshare *group_name), void *data,
+                       Eina_Bool collections)
+{
+   if (pd->cntd)
+     {
+        pd->cntd->pd = NULL;
+        ecore_thread_cancel(pd->cntd->thread);
+     }
+
+   const char *text = elm_entry_entry_get(entry);
+   if (!text) return;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   if (!utf8) return;
+
+   cur_context_td *td = calloc(1, sizeof(cur_context_td));
+   if (!td)
+     {
+        free(utf8);
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return;
+     }
+
+   td->pd = pd;
+   pd->cntd = td;
+   td->utf8 = utf8;
+   td->cur_pos = elm_entry_cursor_pos_get(entry);
+   td->cb = cb;
+   td->cb_data = data;
+   td->collections = collections;
+
+   td->thread = ecore_thread_run(cur_context_thread_blocking,
+                                 cur_context_thread_end,
+                                 cur_context_thread_cancel,
+                                 td);
+}
+
+int
+parser_line_cnt_get(parser_data *pd EINA_UNUSED, const char *src)
+{
+   if (!src) return 0;
+
+   int cnt = 0;
+
+   while ((src = strstr(src, EOL)))
+     {
+        cnt++;
+        src += EOL_LEN;
+     }
+
+   return cnt;
+}
+
+Eina_Stringshare *
+parser_first_group_name_get(parser_data *pd EINA_UNUSED, Evas_Object *entry)
+{
+   const char *markup = elm_entry_entry_get(entry);
+   char *utf8 = elm_entry_markup_to_utf8(markup);
+   int utf8_len = strlen(utf8);
+   char *p = utf8;
+
+   const char *quot = QUOT_UTF8;
+   const char *group = "group";
+   const int quot_len = QUOT_UTF8_LEN;
+   const int group_len = 5; //strlen("group");
+   const char *group_name = NULL;
+
+   while (p < (utf8 + utf8_len))
+     {
+        //Skip "" range
+        if (!strncmp(p, quot, quot_len))
+          {
+             p += quot_len;
+             p = strstr(p, quot);
+             if (!p) goto end;
+             p += quot_len;
+             continue;
+          }
+
+        //Skip comments: /* ~ */
+        if ((*p == '/') && (*(++p) == '*'))
+          {
+             p = strstr(p, "*/");
+             if (!p) goto end;
+             p += 2;
+             continue;
+          }
+
+        //Skip comments: //
+        if ((*p == '/') && (*(++p) == '/'))
+          {
+             p = strstr(p, "\n");
+             if (!p) goto end;
+             p++;
+             continue;
+          }
+
+        //Skip #if ~ #endif
+        if (!strncmp(p, "#if", 3))
+          {
+             p = strstr(p, "#endif");
+             if (!p) goto end;
+             p += 6; //strlen(#endif)
+             continue;
+          }
+
+        //Skip #define
+        if (!strncmp(p, "#define", 7))
+          {
+             //escape "\", "ie, #define .... \"
+             p += 7; //strlen(#define)
+
+             while (p < (utf8 + utf8_len))
+               {
+                  char *eol = strstr(p, "\n");
+                  if (!eol) goto end;
+
+                  char *slash = strstr(p, "\\");
+
+                  p = eol + 1;
+
+                  if (!slash || (eol < slash))
+                    break;
+               }
+             continue;
+          }
+
+        //group?
+       if (!strncmp(p, group, group_len))
+          {
+             p += group_len;
+             char *name_begin = strstr(p, quot);
+             if (!name_begin) goto end;
+             name_begin += quot_len;
+             p = name_begin;
+             char *name_end = strstr(p, quot);
+             if (!name_end) goto end;
+
+             group_name = eina_stringshare_add_length(name_begin,
+                                                      (name_end - name_begin));
+             goto end;
+          }
+        p++;
+     }
+
+end:
+   free(utf8);
+
+   return group_name;
+}
+
+Eina_List *
+parser_states_filtered_name_get(Eina_List *states)
+{
+   Eina_List *ret = NULL;
+   Eina_List *l;
+   char *state;
+   EINA_LIST_FOREACH(states, l, state)
+     {
+        char *p = state;
+        char *pp = state;
+        while ((p = strstr(p, " ")))
+           {
+              pp = p;
+              p++;
+           }
+        ret = eina_list_append(ret, strndup(state, pp - state));
+     }
+   return ret;
+}
+
+//Tizen Only : Support Tizen version
+//parser_data *
+//parser_init(void)
+parser_data *
+parser_init(const char *tizen_version)
+//
+{
+   parser_data *pd = calloc(1, sizeof(parser_data));
+   if (!pd)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return NULL;
+     }
+
+   type_init_td *td = calloc(1, sizeof(type_init_td));
+   if (!td)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        free(pd);
+        return NULL;
+     }
+
+   td->pd = pd;
+   pd->titd = td;
+   //Tizen Only : Support Tizen version
+   td->tizen_version = tizen_version;
+   //
+   td->thread = ecore_thread_run(type_init_thread_blocking,
+                                 type_init_thread_end,
+                                 type_init_thread_cancel, td);
+   return pd;
+}
+
+void
+parser_term(parser_data *pd)
+{
+   if (pd->cntd)
+     {
+        ecore_thread_cancel(pd->cntd->thread);
+        pd->cntd->pd = NULL;
+     }
+   if (pd->titd)
+     {
+        ecore_thread_cancel(pd->titd->thread);
+        pd->titd->pd = NULL;
+     }
+   if (pd->btd)
+     {
+        ecore_thread_cancel(pd->btd->thread);
+        pd->btd->pd = NULL;
+     }
+
+   if (pd->attrs)
+     {
+        parser_attr *attr;
+        EINA_INARRAY_FOREACH(pd->attrs, attr)
+          {
+             eina_stringshare_del(attr->keyword);
+
+             if (attr->value.strs)
+               {
+                  while (eina_array_count(attr->value.strs))
+                    eina_stringshare_del(eina_array_pop(attr->value.strs));
+                  eina_array_free(attr->value.strs);
+               }
+          }
+        eina_inarray_free(pd->attrs);
+     }
+
+   free(pd);
+}
+
+int
+parser_end_of_parts_block_pos_get(const Evas_Object *entry,
+                                  const char *group_name)
+{
+   if (!group_name) return -1;
+
+   const char *text = elm_entry_entry_get(entry);
+   if (!text) return -1;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   if (!utf8) return -1;
+
+   const char *pos = group_beginning_pos_get(utf8, group_name);
+   if (!pos)
+     {
+        free(utf8);
+        return -1;
+     }
+
+   pos = end_of_parts_block_find(++pos);
+   if (!pos)
+     {
+        free(utf8);
+        return - 1;
+     }
+
+   int ret = (pos - utf8) + 1;
+
+   free(utf8);
+
+   return ret;
+}
+
+Eina_Bool
+parser_images_pos_get(const Evas_Object *entry, int *ret)
+{
+   return parser_collections_block_pos_get(entry, "images", ret);
+}
+
+Eina_Bool
+parser_styles_pos_get(const Evas_Object *entry, int *ret)
+{
+   return parser_collections_block_pos_get(entry, "styles", ret);
+}
+
+Eina_Bool
+parser_is_image_name(const Evas_Object *entry, const char *str)
+{
+   int start_pos, end_pos = -1, i;
+   if (!parser_collections_block_pos_get(entry, "images", &start_pos))
+     return EINA_FALSE;
+
+   const char *text = elm_entry_entry_get(entry);
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   int utf8_len = strlen(utf8);
+
+   for (i = start_pos ; i < utf8_len; i++)
+      if (utf8[i] == '}')
+        {
+           end_pos = i;
+           break;
+        }
+
+   if (end_pos < 0) return EINA_FALSE;
+
+   char *candidate_str = alloca(end_pos - start_pos + 1);
+   const char *src_str = elm_entry_markup_to_utf8(str);
+   strncpy(candidate_str, utf8 + start_pos, end_pos - start_pos);
+   candidate_str[end_pos - start_pos] = '\0';
+
+   if (strstr(candidate_str, src_str))
+     return EINA_TRUE;
+   else
+     return EINA_FALSE;
+}
+
+void
+parser_bracket_cancel(parser_data *pd)
+{
+   if (pd->btd)
+     {
+        ecore_thread_cancel(pd->btd->thread);
+        pd->btd->pd = NULL;
+        pd->btd = NULL;
+     }
+}
+
+void
+parser_bracket_find(parser_data *pd, Evas_Object *entry,
+                    Bracket_Update_Cb func, void *data)
+{
+   if (pd->btd)
+     {
+        pd->btd->pd = NULL;
+        ecore_thread_cancel(pd->btd->thread);
+     }
+
+   const char *text = elm_entry_entry_get(entry);
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   int pos = elm_entry_cursor_pos_get(entry);
+
+   bracket_td *btd = malloc(sizeof(bracket_td));
+   pd->btd = btd;
+
+   btd->pos = pos;
+   btd->text = utf8;
+   btd->update_cb = func;
+   btd->data = data;
+   btd->pd = pd;
+   btd->thread = ecore_thread_run(bracket_thread_blocking,
+                                  bracket_thread_end,
+                                  bracket_thread_cancel,
+                                  btd);
+}
+
+Eina_List *
+parser_group_list_get(parser_data *pd EINA_UNUSED, Evas_Object *entry)
+{
+   const char *markup = elm_entry_entry_get(entry);
+   char *utf8 = elm_entry_markup_to_utf8(markup);
+   int utf8_len = strlen(utf8);
+   char *p = utf8;
+
+   const char *quot = QUOT_UTF8;
+   const char *group = "group";
+   const int quot_len = QUOT_UTF8_LEN;
+   const int group_len = 5; //strlen("group");
+   const char *group_name = NULL;
+   Eina_List *group_list = NULL;
+
+   while (p < (utf8 + utf8_len))
+     {
+        //Skip "" range
+        if (!strncmp(p, quot, quot_len))
+          {
+             p += quot_len;
+             p = strstr(p, quot);
+             if (!p) goto end;
+             p += quot_len;
+             continue;
+          }
+
+        //Skip comments: /* ~ */
+        if ((*p == '/') && (*(++p) == '*'))
+          {
+             p = strstr(p, "*/");
+             if (!p) goto end;
+             p += 2;
+             continue;
+          }
+
+        //Skip comments: //
+        if ((*p == '/') && (*(++p) == '/'))
+          {
+             p = strstr(p, "\n");
+             if (!p) goto end;
+             p++;
+             continue;
+          }
+
+        //Skip #if ~ #endif
+        if (!strncmp(p, "#if", 3))
+          {
+             p = strstr(p, "#endif");
+             if (!p) goto end;
+             p += 6; //strlen(#endif)
+             continue;
+          }
+
+        //Skip #define
+        if (!strncmp(p, "#define", 7))
+          {
+             //escape "\", "ie, #define .... \"
+             p += 7; //strlen(#define)
+
+             while (p < (utf8 + utf8_len))
+               {
+                  char *eol = strstr(p, "\n");
+                  if (!eol) goto end;
+
+                  char *slash = strstr(p, "\\");
+
+                  p = eol + 1;
+
+                  if (!slash || (eol < slash))
+                    break;
+               }
+             continue;
+          }
+
+        //group?
+       if (!strncmp(p, group, group_len))
+         {
+            p += group_len;
+
+            if (((*p != ' ') && (*p != '{') && (*p != '\n') && (*p != '\t')))
+              continue;
+
+            p++;
+
+            //We found a group
+            p = strstr(p, quot);
+            if (!p) goto end;
+
+            p++;
+            char *name_begin = p;
+
+            p = strstr(p, quot);
+            if (!p) goto end;
+
+            char *name_end = p;
+
+            group_name = eina_stringshare_add_length(name_begin,
+                                                     name_end - name_begin);
+            if (group_name)
+              group_list = eina_list_append(group_list, group_name);
+         }
+       p++;
+     }
+
+end:
+   free(utf8);
+
+   return group_list;
+}
+
+char*
+parser_group_pos_get(char *utf8, char *utf8_end,
+                     const char *group_name)
+{
+   char *p = utf8;
+   char *result = NULL;
+
+   int group_name_len = strlen(group_name);
+
+   //Find group
+   while (utf8_end > p)
+     {
+        //Skip " ~ " Section
+        if (*p == '\"')
+          {
+             ESCAPE_RET_NULL();
+          }
+
+        if (!strncmp("group", p, strlen("group")))
+          {
+             p = strstr((p + 5), "\"");
+             if (!p) return NULL;
+             p++;
+             if (!strncmp(group_name, p, group_name_len))
+               {
+                  //Compare Elaborately
+                  char *next_quote = strstr(p, "\"");
+                  if (group_name_len == (next_quote - p))
+                    {
+                       result = p;
+                       break;
+                    }
+                  else
+                    {
+                       ESCAPE_RET_NULL();
+                    }
+               }
+             else
+               {
+                  ESCAPE_RET_NULL();
+               }
+          }
+        p++;
+     }
+
+   return result;
+}
+
+char*
+parser_part_pos_get(char *utf8, char *utf8_end,
+                    const char* group_name,
+                    const char *part_name, const char *part_type)
+{
+   char *p = parser_group_pos_get(utf8, utf8_end, group_name);
+
+   //No found
+   if (!p) return NULL;
+
+   p = strstr(p, "\"");
+   if (!p) return NULL;
+   p++;
+
+   char *result = NULL;
+
+   //goto parts
+   p = strstr(p, "parts");
+   if (!p) return NULL;
+
+   int part_name_len = strlen(part_name);
+
+   //Find part
+   while (utf8_end > p)
+     {
+        //Skip " ~ " Section
+        if (*p == '\"')
+          {
+             ESCAPE_RET_NULL();
+          }
+
+        if (!strncmp(part_type, p, strlen(part_type)))
+          {
+             p = strstr((p + strlen(part_type)), "\"");
+             if (!p) return NULL;
+             p++;
+             if (!strncmp(part_name, p, part_name_len))
+               {
+                  //Compare Elaborately
+                  char *next_quote = strstr(p, "\"");
+                  if (part_name_len == (next_quote - p))
+                    {
+                       result = p;
+                       break;
+                    }
+                  else
+                    {
+                       ESCAPE_RET_NULL();
+                    }
+               }
+             else
+               {
+                  ESCAPE_RET_NULL();
+               }
+          }
+
+        //compatibility: "part"
+        if (!strncmp("part", p, strlen("part")))
+          {
+             p = strstr((p + 4), "\"");
+             if (!p) return NULL;
+             p++;
+             if (!strncmp(part_name, p, strlen(part_name)))
+               {
+                  //Compare Elaborately
+                  char *next_quote = strstr(p, "\"");
+                  if (part_name_len == (next_quote - p))
+                    {
+                       result = p;
+                       break;
+                    }
+                  else
+                    {
+                       ESCAPE_RET_NULL();
+                    }
+               }
+             else
+               {
+                  ESCAPE_RET_NULL();
+               }
+          }
+
+        p++;
+     }
+
+   return result;
+}
diff --git a/src/lib/edj_mgr.c b/src/lib/edj_mgr.c
new file mode 100644 (file)
index 0000000..18ce8b5
--- /dev/null
@@ -0,0 +1,239 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+const double VIEW_CACHING_TIME = 60 * 5;
+
+typedef struct edj_data_s
+{
+   view_data *vd;
+   Ecore_Timer *timer;
+} edj_data;
+
+typedef struct edj_mgr_s
+{
+   Eina_List *edjs;
+   edj_data *edj;
+   Enventor_Object *enventor;
+   Evas_Object *layout;
+
+   Eina_Bool reload_need : 1;
+} edj_mgr;
+
+static edj_mgr *g_em = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+view_del_cb(void *data)
+{
+   edj_mgr *em = g_em;
+   edj_data *edj = data;
+   em->edjs = eina_list_remove(em->edjs, edj);
+   ecore_timer_del(edj->timer);
+   if (em->edj == edj) em->edj = NULL;
+   free(edj);
+}
+
+static Eina_Bool
+view_del_timer_cb(void *data)
+{
+   view_data *vd = data;
+   edj_data *edj = view_data_get(vd);
+   edj->timer = NULL;
+   edj_mgr_view_del(vd);
+   return ECORE_CALLBACK_CANCEL;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+edj_mgr_clear(void)
+{
+   edj_data *edj;
+   edj_mgr *em = g_em;
+
+   EINA_LIST_FREE(em->edjs, edj)
+     {
+        ecore_timer_del(edj->timer);
+        view_term(edj->vd);
+        free(edj);
+     }
+   em->edjs = NULL;
+   em->edj = NULL;
+   em->reload_need = EINA_FALSE;
+}
+
+void
+edj_mgr_init(Enventor_Object *enventor)
+{
+   edj_mgr *em = calloc(1, sizeof(edj_mgr));
+   if (!em)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return;
+     }
+   g_em = em;
+
+   Evas_Object *layout = elm_layout_add(enventor);
+   elm_layout_file_set(layout, EDJE_PATH, "viewer_layout");
+   em->enventor = enventor;
+   em->layout = layout;
+}
+
+void
+edj_mgr_term(void)
+{
+   edj_mgr *em = g_em;
+
+   edj_mgr_clear();
+   evas_object_del(em->layout);
+   free(em);
+}
+
+view_data *
+edj_mgr_view_get(Eina_Stringshare *group)
+{
+   edj_mgr *em = g_em;
+   if (!em) return NULL;
+
+   if (!group && em->edj) return em->edj->vd;
+
+   edj_data *edj;
+   Eina_List *l;
+   EINA_LIST_FOREACH(em->edjs, l, edj)
+     {
+        if (view_group_name_get(edj->vd) == group)
+          return edj->vd;
+     }
+   return NULL;
+}
+
+void
+edj_mgr_view_del(view_data *vd)
+{
+   edj_mgr *em = g_em;
+   edj_data *edj = view_data_get(vd);
+   em->edjs = eina_list_remove(em->edjs, edj);
+   ecore_timer_del(edj->timer);
+   view_term(vd);
+   free(edj);
+}
+
+view_data *
+edj_mgr_view_new(Enventor_Item *it, const char *group)
+{
+   edj_mgr *em = g_em;
+
+   if (!group) return NULL;
+
+   edj_data *edj = calloc(1, sizeof(edj_data));
+   if (!edj)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return NULL;
+     }
+
+   view_data *vd = view_init(em->enventor, it, group, view_del_cb, edj);
+   if (!vd)
+     {
+        free(edj);
+        return NULL;
+     }
+
+   edj->vd = vd;
+   edj_mgr_view_switch_to(vd);
+
+   em->edjs = eina_list_append(em->edjs, edj);
+
+   return vd;
+}
+
+void
+edj_mgr_view_switch_to(view_data *vd)
+{
+   edj_mgr *em = g_em;
+
+   if (em->edj && (em->edj->vd == vd)) return;
+
+   //Switch views
+   Evas_Object *prev =
+      elm_object_part_content_unset(em->layout, "elm.swallow.content");
+
+   elm_object_part_content_set(em->layout, "elm.swallow.content",
+                               view_obj_get(vd));
+   //Switching effect
+   if (prev != view_obj_get(vd))
+     {
+        Evas_Object *tmp =
+           elm_object_part_content_unset(em->layout, "elm.swallow.prev");
+        if (tmp) evas_object_hide(tmp);
+        elm_object_part_content_set(em->layout, "elm.swallow.prev", prev);
+        elm_object_signal_emit(em->layout, "elm,view,switch", "");
+     }
+   else
+     {
+        elm_object_signal_emit(em->layout, "elm,view,switch,instant", "");
+     }
+
+   //Reset caching timers
+   edj_data *cur_edj = view_data_get(vd);
+   if (cur_edj)
+     {
+        ecore_timer_del(cur_edj->timer);
+        cur_edj->timer = NULL;
+     }
+
+   edj_data *prev_edj = em->edj;
+   if (prev_edj)
+     {
+        ecore_timer_del(prev_edj->timer);
+        prev_edj->timer = ecore_timer_add(VIEW_CACHING_TIME, view_del_timer_cb,
+                                          prev_edj->vd);
+        view_activated_set(prev_edj->vd, EINA_FALSE);
+     }
+   em->edj = view_data_get(vd);
+
+   view_activated_set(vd, EINA_TRUE);
+}
+
+Evas_Object *
+edj_mgr_obj_get(void)
+{
+   edj_mgr *em = g_em;
+   return em->layout;
+}
+
+void
+edj_mgr_reload_need_set(Eina_Bool reload)
+{
+   edj_mgr *em = g_em;
+   em->reload_need = reload;
+}
+
+Eina_Bool
+edj_mgr_reload_need_get(void)
+{
+   edj_mgr *em = g_em;
+   return em->reload_need;
+}
+
+void
+edj_mgr_all_views_reload(void)
+{
+   edj_mgr *em = g_em;
+   if (!em) return;
+   Eina_List *l = NULL;
+   edj_data *edj = NULL;
+
+   EINA_LIST_FOREACH(em->edjs, l, edj)
+     view_obj_need_reload_set(edj->vd);
+}
+
diff --git a/src/lib/edj_viewer.c b/src/lib/edj_viewer.c
new file mode 100644 (file)
index 0000000..f070027
--- /dev/null
@@ -0,0 +1,1038 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#define EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT 1
+
+#include <Enventor.h>
+#include <Edje_Edit.h>
+#include <Eio.h>
+#include "enventor_private.h"
+
+struct viewer_s
+{
+   Evas_Object *layout;
+   Evas_Object *base;
+   Evas_Object *scroller;
+   Evas_Object *event_rect;
+   Enventor_Object *enventor;
+   Enventor_Item *it;
+
+   Evas_Object *part_obj;
+   Evas_Object *part_highlight;
+
+   Eina_Stringshare *group_name;
+   Eina_Stringshare *part_name;
+
+   Ecore_Idler *idler;
+   Ecore_Animator *animator;
+#ifndef _WIN32
+   Ecore_Timer *update_img_timer;
+#endif
+   Ecore_Timer *update_edj_timer;
+#ifndef _WIN32
+   Ecore_Timer *edj_monitor_timer;
+   Eio_Monitor *edj_monitor;
+   Eina_List *img_monitors;
+#endif
+   Eina_List *part_names;
+#ifndef _WIN32
+   Eio_Monitor *img_monitor;
+   Ecore_Event_Handler *edj_monitor_event;
+   Ecore_Event_Handler *img_monitor_event;
+#endif
+   Ecore_Event_Handler *exe_del_event;
+   void (*del_cb)(void *data);
+   void *data;
+
+   /* view size configured by application */
+   Evas_Coord_Size view_config_size;
+   double view_scale;
+
+   //Keep the part info which state has been changed
+   struct {
+     Eina_Stringshare *part;
+     Eina_Stringshare *desc;
+     double state;
+   } changed_part;
+
+   Eina_Bool edj_reload_need : 1;
+   Eina_Bool file_set_finished : 1;
+   Eina_Bool activated: 1;
+   Eina_Bool view_update_call_request : 1;
+};
+
+const char *PART_NAME = "part_name";
+
+
+static void
+view_obj_parts_callbacks_set(view_data *vd);
+
+static Eina_Bool
+exe_del_event_cb(void *data, int type, void *even);
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+#ifndef _WIN32
+static Eina_Bool
+img_changed_timer_cb(void *data)
+{
+   view_data *vd = data;
+   Eina_File *file = eina_file_open(eio_monitor_path_get(vd->img_monitor),
+                                    EINA_FALSE);
+   if (!file) return ECORE_CALLBACK_RENEW;
+   vd->edj_reload_need = EINA_TRUE;
+   vd->update_img_timer = NULL;
+   vd->img_monitor = NULL;
+   build_edc();
+   eina_file_close(file);
+   return ECORE_CALLBACK_CANCEL;
+}
+#endif
+
+#ifndef _WIN32
+static Eina_Bool
+img_changed_cb(void *data, int type EINA_UNUSED, void *event)
+{
+   view_data *vd = data;
+   Eio_Monitor_Event *ev = event;
+   Eina_List *l;
+   Eio_Monitor *monitor = NULL;
+   EINA_LIST_FOREACH(vd->img_monitors, l, monitor)
+     {
+        if (ev->monitor != monitor) continue;
+        vd->img_monitor = monitor;
+        ecore_timer_del(vd->update_img_timer);
+        //FIXME: here 0.5 was confirmed by experimental way. But we need to
+        //decide the time size based on the image file size in order that
+        //we could update small images quickly but large images slowly.
+        vd->update_img_timer = ecore_timer_add(1, img_changed_timer_cb, vd);
+        return ECORE_CALLBACK_DONE;
+     }
+   return ECORE_CALLBACK_PASS_ON;
+}
+#endif
+
+static void
+view_obj_min_update(view_data *vd)
+{
+   double min_w = (double) vd->view_config_size.w * vd->view_scale;
+   if (1 > min_w) min_w = 1;
+   double min_h = (double) vd->view_config_size.h * vd->view_scale;
+   if (1 > min_h) min_h = 1;
+
+   evas_object_size_hint_min_set(vd->layout, min_w, min_h);
+   evas_object_size_hint_max_set(vd->layout, min_w, min_h);
+}
+
+#ifndef _WIN32
+static void
+view_images_monitor_set(view_data *vd)
+{
+   Eina_List *l, *l2;
+   char *path, *img;
+   char buf[PATH_MAX];
+   Eio_Monitor *monitor;
+
+   //Free the previous monitors
+   EINA_LIST_FREE(vd->img_monitors, monitor)
+     eio_monitor_del(monitor);
+
+   Eina_List *imgs = edje_edit_images_list_get(vd->layout);
+   Eina_List *paths = build_path_get(ENVENTOR_PATH_TYPE_IMAGE);
+
+   //List up new image pathes and add monitors
+   EINA_LIST_FOREACH(imgs, l, img)
+     {
+        EINA_LIST_FOREACH(paths, l2, path)
+          {
+             if (path[strlen(path) - 1] == '/')
+               snprintf(buf, sizeof(buf), "%s%s", path, img);
+             else
+               snprintf(buf, sizeof(buf), "%s/%s", path, img);
+             if (ecore_file_exists(buf))
+               {
+                  monitor = eio_monitor_add(buf);
+                  vd->img_monitors = eina_list_append(vd->img_monitors,
+                                                      monitor);
+               }
+          }
+     }
+
+   edje_edit_string_list_free(imgs);
+}
+#endif
+
+static void
+view_obj_create_post_job(view_data *vd)
+{
+   vd->file_set_finished = EINA_TRUE;
+   Eina_Bool ret, ret2;
+
+#ifdef _WIN32
+   vd->edj_reload_need = EINA_TRUE;
+#endif
+   vd->exe_del_event =
+      ecore_event_handler_add(ECORE_EXE_EVENT_DEL, exe_del_event_cb, vd);
+
+#ifndef _WIN32
+   eio_monitor_del(vd->edj_monitor);
+   vd->edj_monitor = eio_monitor_add(build_edj_path_get());
+   if (!vd->edj_monitor) EINA_LOG_ERR("Failed to add Eio_Monitor");
+#endif
+   view_obj_min_update(vd);
+
+   if (vd->part_name) view_part_highlight_set(vd, vd->part_name);
+
+   if (eo_do_ret(vd->enventor, ret,
+                eo_do_ret(vd->enventor, ret2, enventor_obj_dummy_parts_get())))
+     dummy_obj_new(vd->layout);
+
+   if (eo_do_ret(vd->enventor, ret,
+                eo_do_ret(vd->enventor, ret2, enventor_obj_wireframes_get())))
+     wireframes_obj_new(vd->layout);
+
+   view_mirror_mode_update(vd);
+
+   if (vd->changed_part.part)
+     edje_edit_part_selected_state_set(vd->layout, vd->changed_part.part,
+                                       vd->changed_part.desc,
+                                       vd->changed_part.state);
+
+   view_obj_parts_callbacks_set(vd);
+
+   evas_object_smart_callback_call(vd->enventor, SIG_LIVE_VIEW_LOADED, vd->it);
+#ifndef _WIN32
+   view_images_monitor_set(vd);
+#endif
+}
+
+static Eina_Bool
+file_set_animator_cb(void *data)
+{
+   view_data *vd = data;
+   if (!vd->layout)
+     {
+        vd->animator = NULL;
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   if (edje_object_file_set(vd->layout, build_edj_path_get(), vd->group_name))
+     {
+        view_obj_create_post_job(vd);
+        vd->animator = NULL;
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   edj_mgr_reload_need_set(EINA_TRUE);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+part_obj_geom_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+                 void *event_info EINA_UNUSED)
+{
+   view_data *vd = data;
+   Evas_Object *part_highlight = vd->part_highlight;
+
+   //Create Part Highlight Object
+   if (!part_highlight && vd->part_name)
+     {
+        part_highlight = elm_layout_add(vd->scroller);
+        evas_object_smart_member_add(part_highlight, vd->scroller);
+        elm_layout_file_set(part_highlight, EDJE_PATH, "part_highlight");
+        evas_object_pass_events_set(part_highlight, EINA_TRUE);
+        evas_object_show(part_highlight);
+     }
+
+   Evas_Coord x, y, w , h;
+   Edje_Part_Type type = edje_edit_part_type_get(vd->layout, vd->part_name);
+   if (type == EDJE_PART_TYPE_SPACER)
+     {
+        Evas_Object *scroller_edje = elm_layout_edje_get(vd->scroller);
+        // Clipper need, to clip the highlight object for the  part SPACER,
+        // because position of the highlight object is calculated here,
+        // not in edje. In case, when  the SPACER is placed outside of
+        // scroller region view, the highlight should be hided.
+        Evas_Object *clipper =
+           (Evas_Object *)edje_object_part_object_get(scroller_edje,
+                                                      "clipper");
+
+        evas_object_smart_member_add(part_highlight, vd->scroller);
+        edje_object_part_geometry_get(vd->layout, vd->part_name,
+                                      &x, &y, &w, &h);
+        Evas_Coord lx, ly;
+        evas_object_geometry_get(vd->layout, &lx, &ly, NULL, NULL);
+
+        evas_object_move(part_highlight, (x + lx), (y + ly));
+        evas_object_resize(part_highlight, w, h);
+        evas_object_clip_set(part_highlight, clipper);
+     }
+#if 0
+   else if (type == EDJE_PART_TYPE_TEXT)
+     {
+        Evas_Coord lx, ly;
+        evas_object_geometry_get(vd->layout, &lx, &ly, NULL, NULL);
+        edje_object_part_geometry_get(vd->layout, vd->part_name,
+                                      &x, &y, &w, &h);
+        evas_object_resize(part_highlight, w, h);
+        evas_object_move(part_highlight, lx + x, ly + y);
+     }
+#endif
+   else
+     {
+        evas_object_geometry_get(obj, &x, &y, &w, &h);
+        evas_object_move(part_highlight, x, y);
+        evas_object_resize(part_highlight, w, h);
+     }
+
+   vd->part_highlight = part_highlight;
+}
+
+static void
+event_highlight_geom_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                 void *event_info EINA_UNUSED)
+{
+   view_data *vd = (view_data *) data;
+   if (!vd) return;
+
+   if (edje_edit_part_type_get(vd->layout, vd->part_name) == EDJE_PART_TYPE_SPACER)
+     part_obj_geom_cb(vd, evas_object_evas_get(vd->layout), vd->part_obj, NULL);
+}
+
+static void
+part_obj_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+
+                void *event_info EINA_UNUSED)
+{
+   view_data *vd = data;
+   vd->part_obj = NULL;
+}
+
+static void
+rect_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                   Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   static Enventor_Live_View_Cursor cursor;
+   view_data *vd = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+
+   Evas_Coord x, y, w, h;
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+   cursor.relx = (float) ((ev->cur.canvas.x - x) / (float) w);
+   cursor.rely = (float) ((ev->cur.canvas.y - y) / (float) h);
+
+   if (vd->view_config_size.w > 0)
+     cursor.x = (((double)vd->view_config_size.w) * cursor.relx);
+   else
+     cursor.x = (ev->cur.canvas.x - x);
+
+   if (vd->view_config_size.h > 0)
+     cursor.y = (((double)vd->view_config_size.h) * cursor.rely);
+   else
+     cursor.y = (ev->cur.canvas.y - y);
+
+   evas_object_smart_callback_call(vd->enventor, SIG_LIVE_VIEW_CURSOR_MOVED,
+                                   &cursor);
+}
+
+static Evas_Object *
+view_scroller_create(Evas_Object *parent)
+{
+   Evas_Object *scroller = elm_scroller_add(parent);
+   elm_object_focus_allow_set(scroller, EINA_FALSE);
+   evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+   //Tizen Only
+   //Live view BG
+   Evas_Object *bg = elm_bg_add(scroller);
+   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_bg_color_set(bg, 216, 216, 216);
+   elm_object_part_content_set(scroller, "elm.swallow.bg", bg);
+   //
+
+   return scroller;
+}
+
+static void
+edje_part_clicked(void *data, Evas *e EINA_UNUSED,
+                  Evas_Object *obj  EINA_UNUSED,
+                  void *ei EINA_UNUSED)
+{
+   view_data *vd = (view_data *)data;
+   char *part_name = evas_object_data_get(obj, PART_NAME);
+   evas_object_smart_callback_call(vd->enventor, "part,clicked", part_name);
+}
+
+inline static void
+view_obj_parts_names_free(view_data *vd)
+{
+   Eina_Stringshare *part_name = NULL;
+
+   EINA_LIST_FREE(vd->part_names, part_name)
+      eina_stringshare_del(part_name);
+
+   vd->part_names = NULL;
+}
+
+static void
+view_obj_parts_callbacks_set(view_data *vd)
+{
+   if (vd->part_names)
+      view_obj_parts_names_free(vd);
+
+   Eina_List *l = NULL;
+   Eina_Stringshare *part_name = NULL;
+   Eina_List *parts = edje_edit_parts_list_get(vd->layout);
+
+   EINA_LIST_FOREACH(parts, l, part_name)
+     {
+        Evas_Object *edje_part =
+               (Evas_Object *)edje_object_part_object_get(vd->layout, part_name);
+        if (edje_part)
+          {
+             Eina_Stringshare *name = eina_stringshare_add(part_name);
+             vd->part_names = eina_list_append(vd->part_names, name);
+             evas_object_data_set(edje_part, PART_NAME, name);
+             evas_object_event_callback_add(edje_part, EVAS_CALLBACK_MOUSE_DOWN,
+                                            edje_part_clicked, vd);
+          }
+     }
+   edje_edit_string_list_free(parts);
+}
+
+static void
+update_view(view_data *vd)
+{
+#ifndef _WIN32
+   view_images_monitor_set(vd);
+#endif
+   view_obj_min_update(vd);
+   view_part_highlight_set(vd, vd->part_name);
+   dummy_obj_update(vd->layout);
+   wireframes_obj_update(vd->layout);
+   view_mirror_mode_update(vd);
+
+   if (vd->changed_part.part)
+   edje_edit_part_selected_state_set(vd->layout, vd->changed_part.part,
+                                     vd->changed_part.desc,
+                                     vd->changed_part.state);
+
+   view_obj_parts_callbacks_set(vd);
+   wireframes_obj_callbacks_set(vd->layout);
+
+   if (vd->view_update_call_request)
+     {
+        evas_object_smart_callback_call(vd->enventor,
+                                        SIG_LIVE_VIEW_UPDATED, vd->it);
+        vd->view_update_call_request = EINA_FALSE;
+     }
+}
+
+static void
+update_edj_file_internal(view_data *vd)
+{
+   vd->view_update_call_request = EINA_TRUE;
+   vd->edj_reload_need = EINA_FALSE;
+   vd->file_set_finished = EINA_TRUE;
+
+   if (!vd->activated) return;
+
+   update_view(vd);
+}
+
+static Eina_Bool
+update_edj_file(void *data)
+{
+   view_data *vd = data;
+
+   if (!vd->edj_reload_need)
+     {
+        vd->update_edj_timer = NULL;
+        return ECORE_CALLBACK_DONE;
+     }
+
+   //wait for whether edj is generated completely.
+   Eina_File *file = eina_file_open(build_edj_path_get(), EINA_FALSE);
+   if (!file) return ECORE_CALLBACK_RENEW;
+   eina_file_close(file);
+
+   //Failed to load edj? I have no idea. Try again.
+   if (!edje_object_file_set(vd->layout, build_edj_path_get(), vd->group_name))
+     return ECORE_CALLBACK_RENEW;
+
+   update_edj_file_internal(vd);
+   vd->update_edj_timer = NULL;
+
+   return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool
+exe_del_event_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
+{
+   view_data *vd = data;
+
+   if (!vd->edj_reload_need) return ECORE_CALLBACK_PASS_ON;
+
+   //Failed to load edj? I have no idea. Try again.
+   if (!edje_object_file_set(vd->layout, build_edj_path_get(), vd->group_name))
+     {
+        if (vd->activated)
+          {
+             dummy_obj_update(vd->layout);
+             wireframes_obj_update(vd->layout);
+          }
+        ecore_timer_del(vd->update_edj_timer);
+        vd->file_set_finished = EINA_FALSE;
+        vd->update_edj_timer = ecore_timer_add(0.25, update_edj_file, vd);
+        return ECORE_CALLBACK_PASS_ON;
+     }
+
+   update_edj_file_internal(vd);
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+#ifndef _WIN32
+static Eina_Bool
+edj_monitor_timer_cb(void *data)
+{
+   view_data *vd = data;
+
+   Eina_File *file = eina_file_open(build_edj_path_get(), EINA_FALSE);
+   if (!file) return ECORE_CALLBACK_PASS_ON;
+   eina_file_close(file);
+   vd->edj_monitor = eio_monitor_add(build_edj_path_get());
+   if (!vd->edj_monitor)
+     {
+        EINA_LOG_ERR("Failed to add Eio_Monitor!");
+        return ECORE_CALLBACK_PASS_ON;
+     }
+   vd->edj_monitor_timer = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+#endif
+
+#ifndef _WIN32
+static Eina_Bool
+edj_changed_cb(void *data, int type EINA_UNUSED, void *event)
+{
+   view_data *vd = data;
+   Eio_Monitor_Event *ev = event;
+
+   if (vd->edj_monitor != ev->monitor) return ECORE_CALLBACK_PASS_ON;
+   view_obj_parts_names_free(vd);
+
+   //FIXME: why it need to add monitor again??
+   eio_monitor_del(vd->edj_monitor);
+
+   //Exceptional case. Try again.
+   Eina_File *file = eina_file_open(build_edj_path_get(), EINA_FALSE);
+   if (!file)
+     {
+        ecore_timer_del(vd->edj_monitor_timer);
+        vd->edj_monitor_timer = ecore_timer_add(0.25, edj_monitor_timer_cb, vd);
+        return ECORE_CALLBACK_DONE;
+     }
+   eina_file_close(file);
+
+   vd->edj_monitor = eio_monitor_add(build_edj_path_get());
+   if (!vd->edj_monitor) EINA_LOG_ERR("Failed to add Eio_Monitor!");
+
+   vd->edj_reload_need = EINA_TRUE;
+
+   return ECORE_CALLBACK_DONE;
+}
+#endif
+
+static void
+layout_geom_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+               void *event_info EINA_UNUSED)
+{
+   Evas_Coord x, y, w, h;
+   Evas_Object *rect = data;
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+   evas_object_move(rect, x, y);
+   evas_object_resize(rect, w, h);
+}
+
+static void
+layout_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   Evas_Object *rect = data;
+   evas_object_del(rect);
+}
+
+static Evas_Object *
+base_create(Evas_Object *parent)
+{
+   Evas_Object *base = elm_layout_add(parent);
+   elm_layout_file_set(base, EDJE_PATH, "viewer_layout_bg");
+   evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(base, 0.5, 0.5);
+
+   return base;
+}
+
+static void
+dummy_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ei)
+{
+   char *part_name = (char *)ei;
+   view_data *vd = (view_data *)data;
+   evas_object_smart_callback_call(vd->enventor, "part,clicked", part_name);
+}
+
+static void
+view_obj_create(view_data *vd)
+{
+   Evas *e = evas_object_evas_get(vd->base);
+   vd->layout = edje_edit_object_add(e);
+   if (!edje_object_file_set(vd->layout, build_edj_path_get(), vd->group_name))
+     vd->animator = ecore_animator_add(file_set_animator_cb, vd);
+   else
+     view_obj_create_post_job(vd);
+
+   evas_object_size_hint_weight_set(vd->layout, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_smart_callback_add(vd->layout, "dummy,clicked",
+                                  dummy_clicked_cb, vd);
+}
+
+static void
+event_layer_set(view_data *vd)
+{
+   Evas *e = evas_object_evas_get(vd->layout);
+   Evas_Object *rect = evas_object_rectangle_add(e);
+   evas_object_repeat_events_set(rect, EINA_TRUE);
+   evas_object_color_set(rect, 0, 0, 0, 0);
+   evas_object_show(rect);
+
+   evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_RESIZE,
+                                  layout_geom_cb, rect);
+   evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_MOVE,
+                                  layout_geom_cb, rect);
+   evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_DEL,
+                                  layout_del_cb, rect);
+   evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_MOVE,
+                                  rect_mouse_move_cb, vd);
+   evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_WHEEL,
+                                  event_highlight_geom_cb, vd);
+   vd->event_rect = rect;
+}
+
+static Eina_Bool
+view_obj_idler_cb(void *data)
+{
+   view_data *vd = data;
+
+   vd->base = base_create(vd->scroller);
+
+   view_obj_create(vd);
+
+   event_layer_set(vd);
+
+   elm_object_part_content_set(vd->base, "elm.swallow.content",
+                               vd->layout);
+   elm_object_content_set(vd->scroller, vd->base);
+
+   vd->idler = NULL;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+view_dummy_set(view_data *vd, Eina_Bool dummy_parts)
+{
+   if (!vd) return;
+   //Does view have dummy object?
+   if (dummy_parts) dummy_obj_new(vd->layout);
+   else dummy_obj_del(vd->layout);
+}
+
+void
+view_wireframes_set(view_data *vd, Eina_Bool wireframes)
+{
+   if (!vd) return;
+   if (wireframes) wireframes_obj_new(vd->layout);
+   else wireframes_obj_del(vd->layout);
+}
+
+view_data *
+view_init(Enventor_Object *enventor, Enventor_Item *it, const char *group,
+          void (*del_cb)(void *data), void *data)
+{
+   view_data *vd = calloc(1, sizeof(view_data));
+   if (!vd)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return NULL;
+     }
+   vd->enventor = enventor;
+   vd->it = it;
+   vd->scroller = view_scroller_create(enventor);
+
+   vd->group_name = eina_stringshare_add(group);
+   vd->idler = ecore_idler_add(view_obj_idler_cb, vd);
+   vd->del_cb = del_cb;
+   vd->data = data;
+   view_part_highlight_set(vd, NULL);
+
+#ifndef _WIN32
+   vd->edj_monitor_event =
+      ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, edj_changed_cb, vd);
+   vd->img_monitor_event =
+      ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, img_changed_cb, vd);
+#endif
+
+   vd->view_config_size.w = 0;
+   vd->view_config_size.h = 0;
+   vd->view_scale = 1;
+
+   return vd;
+}
+
+void
+view_term(view_data *vd)
+{
+   if (!vd) return;
+
+   eina_stringshare_del(vd->group_name);
+   eina_stringshare_del(vd->part_name);
+   eina_stringshare_del(vd->changed_part.part);
+   eina_stringshare_del(vd->changed_part.desc);
+   view_obj_parts_names_free(vd);
+
+   if (vd->part_obj)
+     evas_object_event_callback_del(vd->part_obj, EVAS_CALLBACK_DEL,
+                                    part_obj_del_cb);
+   evas_object_del(vd->scroller);
+   ecore_idler_del(vd->idler);
+   ecore_animator_del(vd->animator);
+#ifndef _WIN32
+   ecore_timer_del(vd->update_img_timer);
+#endif
+   ecore_timer_del(vd->update_edj_timer);
+#ifndef _WIN32
+   ecore_timer_del(vd->edj_monitor_timer);
+   eio_monitor_del(vd->edj_monitor);
+
+   Eio_Monitor *monitor;
+   EINA_LIST_FREE(vd->img_monitors, monitor)
+      eio_monitor_del(monitor);
+
+   ecore_event_handler_del(vd->edj_monitor_event);
+   ecore_event_handler_del(vd->img_monitor_event);
+#endif
+   ecore_event_handler_del(vd->exe_del_event);
+
+   free(vd);
+}
+
+Evas_Object *
+view_obj_get(view_data *vd)
+{
+   if (!vd) return NULL;
+   return vd->scroller;
+}
+
+void
+view_obj_need_reload_set(view_data *vd)
+{
+   vd->edj_reload_need = EINA_TRUE;
+}
+
+void
+view_programs_stop(view_data *vd)
+{
+   if (!vd || !vd->layout) return;
+   if (!vd->file_set_finished) return;
+   edje_edit_program_stop_all(vd->layout);
+}
+
+void
+view_program_run(view_data *vd, const char *program)
+{
+   if (!vd) return;
+   if (!program || !vd->layout) return;
+   if (!vd->file_set_finished) return;
+   edje_edit_program_run(vd->layout, program);
+}
+
+void
+view_part_highlight_set(view_data *vd, const char *part_name)
+{
+   if (!vd) return;
+
+   if (!vd->layout)
+     {
+        if (vd->idler) vd->part_name = eina_stringshare_add(part_name);
+        return;
+     }
+   if (!part_name)
+     {
+        if (vd->part_highlight)
+          {
+             evas_object_del(vd->part_highlight);
+             vd->part_highlight = NULL;
+          }
+        if (vd->part_name)
+          {
+             eina_stringshare_del(vd->part_name);
+             vd->part_name = NULL;
+          }
+        return;
+     }
+   if (vd->part_obj && (vd->part_name == part_name)) return;
+
+   Evas_Object *part_obj =
+      (Evas_Object *) edje_object_part_object_get(vd->layout, part_name);
+
+   //Delete the previous part callbacks
+   if (vd->part_obj)
+     {
+        evas_object_event_callback_del(vd->part_obj, EVAS_CALLBACK_RESIZE,
+                                       part_obj_geom_cb);
+        evas_object_event_callback_del(vd->part_obj, EVAS_CALLBACK_MOVE,
+                                       part_obj_geom_cb);
+        evas_object_event_callback_del(vd->part_obj, EVAS_CALLBACK_DEL,
+                                       part_obj_del_cb);
+     }
+   evas_object_event_callback_add(part_obj, EVAS_CALLBACK_RESIZE,
+                                  part_obj_geom_cb, vd);
+   evas_object_event_callback_add(part_obj, EVAS_CALLBACK_MOVE,
+                                  part_obj_geom_cb, vd);
+   evas_object_event_callback_add(part_obj, EVAS_CALLBACK_DEL, part_obj_del_cb,
+                                  vd);
+
+   evas_object_event_callback_del(vd->layout, EVAS_CALLBACK_RESIZE,
+                                  event_highlight_geom_cb);
+   evas_object_event_callback_del(vd->layout, EVAS_CALLBACK_MOVE,
+                                  event_highlight_geom_cb);
+
+   if (!part_obj)
+     {
+        evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_RESIZE,
+                                       event_highlight_geom_cb, vd);
+        evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_MOVE,
+                                       event_highlight_geom_cb, vd);
+     }
+
+   vd->part_obj = part_obj;
+   eina_stringshare_replace(&vd->part_name, part_name);
+   part_obj_geom_cb(vd, evas_object_evas_get(vd->layout), part_obj, NULL);
+}
+
+Eina_Stringshare *
+view_group_name_get(view_data *vd)
+{
+   if (!vd) return NULL;
+   return vd->group_name;
+}
+
+void *
+view_data_get(view_data *vd)
+{
+   if (!vd) return NULL;
+   return vd->data;
+}
+
+double
+view_scale_get(view_data *vd)
+{
+   if (!vd) return 1.0;
+   return vd->view_scale;
+}
+
+void
+view_scale_set(view_data *vd, double scale)
+{
+   if (!vd || !vd->layout) return;
+   if (scale == edje_object_scale_get(vd->layout)) return;
+
+   vd->view_scale = scale;
+
+   int pminw, pminh;
+   evas_object_size_hint_min_get(vd->layout, &pminw, &pminh);
+   Evas_Coord sx, sy, sw, sh;
+   elm_scroller_region_get(vd->scroller, &sx, &sy, &sw, &sh);
+
+   edje_object_scale_set(vd->layout, scale);
+
+   view_obj_min_update(vd);
+
+   //adjust scroller position according to the scale change.
+   int minw, minh;
+   evas_object_size_hint_min_get(vd->layout, &minw, &minh);
+
+   //a. center position of the scroller
+   double cx = ((double)sx + ((double)sw * 0.5));
+   double cy = ((double)sy + ((double)sh * 0.5));
+
+   //b. multiply scale value
+   cx *= (1 + (((double)(minw - pminw))/pminw));
+   cy *= (1 + (((double)(minh - pminh))/pminh));
+
+   elm_scroller_region_show(vd->scroller, ((Evas_Coord) cx) - (sw / 2),
+                            ((Evas_Coord) cy) - (sh / 2), sw, sh);
+}
+
+void
+view_size_set(view_data *vd, Evas_Coord w, Evas_Coord h)
+{
+   static Enventor_Live_View_Size size;
+
+   if (!vd) return;
+
+   int prev_w = vd->view_config_size.w;
+   int prev_h = vd->view_config_size.h;
+
+   vd->view_config_size.w = w;
+   vd->view_config_size.h = h;
+   view_obj_min_update(vd);
+
+   if ((prev_w == w) && (prev_h == h)) return;
+
+   view_size_get(vd, &size.w, &size.h);
+   evas_object_smart_callback_call(vd->enventor, SIG_LIVE_VIEW_RESIZED, &size);
+}
+
+void
+view_size_get(view_data *vd, Evas_Coord *w, Evas_Coord *h)
+{
+   if (!w || !h) return;
+   if (!vd)
+     {
+        *w = 0;
+        *h = 0;
+        return;
+     }
+
+   evas_object_geometry_get(vd->layout, NULL , NULL, w, h);
+
+   if (vd->view_config_size.w > 0)
+     *w = vd->view_config_size.w;
+
+   if (vd->view_config_size.h > 0)
+     *h = vd->view_config_size.h;
+}
+
+Eina_List *
+view_parts_list_get(view_data *vd)
+{
+   if (!vd || !vd->file_set_finished) return NULL;
+   return edje_edit_parts_list_get(vd->layout);
+}
+
+Eina_List *
+view_images_list_get(view_data *vd)
+{
+   if (!vd || !vd->file_set_finished) return NULL;
+   return edje_edit_images_list_get(vd->layout);
+}
+
+Eina_List *
+view_programs_list_get(view_data *vd)
+{
+   if (!vd || !vd->file_set_finished) return NULL;
+   return edje_edit_programs_list_get(vd->layout);
+}
+
+Edje_Part_Type
+view_part_type_get(view_data *vd, const char *part)
+{
+   if (!vd || !vd->file_set_finished) return EDJE_PART_TYPE_NONE;
+   return edje_edit_part_type_get(vd->layout, part);
+}
+
+Eina_List *
+view_part_states_list_get(view_data *vd, const char *part)
+{
+   if (!vd || !vd->file_set_finished) return NULL;
+   return edje_edit_part_states_list_get(vd->layout, part);
+}
+
+Eina_List *
+view_program_targets_get(view_data *vd, const char *prog)
+{
+   if (!vd || !vd->file_set_finished) return NULL;
+   return edje_edit_program_targets_get(vd->layout, prog);
+}
+
+void
+view_string_list_free(Eina_List *list)
+{
+   edje_edit_string_list_free(list);
+}
+
+void
+view_part_state_set(view_data *vd, Eina_Stringshare *part,
+                    Eina_Stringshare *desc, double state)
+{
+   if (!vd) return;
+   if (!part && !vd->changed_part.part) return;
+   if (!vd->file_set_finished) return;
+
+   //reset previous part?
+   if (part != vd->changed_part.part)
+     {
+        view_part_state_set(vd, vd->changed_part.part, "default", 0.0);
+        eina_stringshare_del(vd->changed_part.part);
+        eina_stringshare_del(vd->changed_part.desc);
+     }
+
+   edje_edit_part_selected_state_set(vd->layout, part, desc, state);
+   vd->changed_part.part = eina_stringshare_add(part);
+   vd->changed_part.desc = eina_stringshare_add(desc);
+   vd->changed_part.state = state;
+}
+
+void
+view_mirror_mode_update(view_data *vd)
+{
+   if (!vd || !vd->layout) return;
+   Eina_Bool ret;
+   edje_object_mirrored_set(vd->layout,
+                            eo_do_ret(vd->enventor, ret, enventor_obj_mirror_mode_get()));
+   dummy_obj_update(vd->layout);
+   part_obj_geom_cb(vd, evas_object_evas_get(vd->layout), vd->part_obj, NULL);
+}
+
+Enventor_Item *
+view_item_get(view_data *vd)
+{
+   if (!vd) return NULL;
+   return vd->it;
+}
+
+void
+view_activated_set(view_data *vd, Eina_Bool activated)
+{
+   if (!vd) return;
+   activated = !!activated;
+   if (activated == vd->activated) return;
+   vd->activated = activated;
+   if (!activated) return;
+
+   update_view(vd);
+}
+
+double
+view_base_scale_get(view_data *vd)
+{
+   if (!vd) return 0.0;
+
+   return edje_object_base_scale_get(vd->layout);
+}
diff --git a/src/lib/enventor_main.c b/src/lib/enventor_main.c
new file mode 100644 (file)
index 0000000..f067f99
--- /dev/null
@@ -0,0 +1,131 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include <Eio.h>
+#include "enventor_private.h"
+
+char EDJE_PATH[PATH_MAX];
+Eina_Prefix *PREFIX = NULL;
+const char SIG_CURSOR_LINE_CHANGED[] = "cursor,line,changed";
+const char SIG_CURSOR_GROUP_CHANGED[]= "cursor,group,changed";
+const char SIG_LIVE_VIEW_LOADED[] = "live_view,loaded";
+const char SIG_LIVE_VIEW_UPDATED[] = "live_view,updated";
+const char SIG_LIVE_VIEW_CURSOR_MOVED[] = "live_view,cursor,moved";
+const char SIG_LIVE_VIEW_RESIZED[] = "live_view,resized";
+const char SIG_MAX_LINE_CHANGED[] = "max_line,changed";
+const char SIG_COMPILE_ERROR[] = "compile,error";
+const char SIG_CTXPOPUP_CHANGED[] = "ctxpopup,changed";
+const char SIG_CTXPOPUP_DISMISSED[] = "ctxpopup,dismissed";
+const char SIG_CTXPOPUP_ACTIVATED[] = "ctxpopup,activated";
+const char SIG_EDC_MODIFIED[] = "edc,modified";
+const char SIG_FOCUSED[] = "focused";
+const char SIG_FILE_OPEN_REQUESTED[] = "file,open,requested";
+
+static int _enventor_init_count = 0;
+static int _enventor_log_dom = -1;
+
+EAPI int
+enventor_init(int argc, char **argv)
+{
+   _enventor_init_count++;
+
+   if (_enventor_init_count > 1) return _enventor_init_count;
+
+   if (!eina_init())
+     {
+        EINA_LOG_ERR("Failed to initialize Eina");
+        return _enventor_init_count--;
+     }
+
+   if (!eet_init())
+     {
+        EINA_LOG_ERR("Failed to initialize Eet");
+        return _enventor_init_count--;
+     }
+
+   if (!evas_init())
+     {
+        EINA_LOG_ERR("Failed to initialize Eet");
+        return _enventor_init_count--;
+     }
+
+   if (!ecore_init())
+     {
+        EINA_LOG_ERR("Failed to initialize Ecore");
+        return _enventor_init_count--;
+     }
+
+   if (!ecore_file_init())
+     {
+        EINA_LOG_ERR("Failed to initialize Ecore_File");
+        return _enventor_init_count--;
+     }
+
+   if (!edje_init())
+     {
+        EINA_LOG_ERR("Failed to initialize Edje");
+        return _enventor_init_count--;
+     }
+
+   if (!eio_init())
+     {
+        EINA_LOG_ERR("Failed to initialize Eio");
+        return _enventor_init_count--;
+     }
+
+   if (!elm_init(argc, argv))
+     {
+        EINA_LOG_ERR("Failed to initialize Elementary");
+        return _enventor_init_count--;
+     }
+
+   _enventor_log_dom = eina_log_domain_register("enventor", EINA_COLOR_CYAN);
+   if (!_enventor_log_dom)
+     {
+        EINA_LOG_ERR("Could not register enventor log domain");
+        _enventor_log_dom = EINA_LOG_DOMAIN_GLOBAL;
+     }
+
+   PREFIX = eina_prefix_new(NULL, enventor_init, "ENVENTOR", "enventor", NULL,
+                         PACKAGE_BIN_DIR, PACKAGE_LIB_DIR,
+                         PACKAGE_DATA_DIR, PACKAGE_DATA_DIR);
+
+   snprintf(EDJE_PATH, sizeof(EDJE_PATH), "%s/themes/enventor.edj",
+            eina_prefix_data_get(PREFIX));
+   srand(time(NULL));
+
+   return _enventor_init_count;
+}
+
+EAPI int
+enventor_shutdown(void)
+{
+   if (_enventor_init_count <= 0)
+     {
+        EINA_LOG_ERR("Init count not greater than 0 in shutdown.");
+        return 0;
+     }
+
+   if ((--_enventor_init_count) > 0) return _enventor_init_count;
+
+   if ((_enventor_log_dom != -1) &&
+       (_enventor_log_dom != EINA_LOG_DOMAIN_GLOBAL))
+     {
+        eina_log_domain_unregister(_enventor_log_dom);
+        _enventor_log_dom = -1;
+     }
+   eina_prefix_free(PREFIX);
+
+   elm_shutdown();
+   eio_shutdown();
+   ecore_file_shutdown();
+   ecore_shutdown();
+   edje_shutdown();
+   evas_shutdown();
+   eet_shutdown();
+   eina_shutdown();
+
+   return _enventor_init_count;
+}
diff --git a/src/lib/enventor_object.eo b/src/lib/enventor_object.eo
new file mode 100644 (file)
index 0000000..59d6543
--- /dev/null
@@ -0,0 +1,249 @@
+class Enventor.Object (Elm.Widget, Efl.File) {
+   eo_prefix: enventor_obj;
+   methods {
+      @property part_highlight {
+         set {
+         }
+         get {
+         }
+         values {
+            part_highlight: bool;
+         }
+      }
+      @property live_view_scale {
+         set {
+         }
+         get {
+         }
+         values {
+            scale: double;
+         }
+      }
+      @property dummy_parts {
+         set {
+         }
+         get {
+         }
+         values {
+            dummy_parts: bool;
+         }
+      }
+      @property wireframes {
+         set {
+         }
+         get {
+         }
+         values {
+            wireframe: bool;
+         }
+      }
+      @property mirror_mode {
+         set {
+         }
+         get {
+         }
+         values {
+            mirror_mode: bool;
+         }
+      }
+      @property auto_complete {
+         set {
+         }
+         get {
+         }
+         values {
+            auto_complete: bool;
+         }
+      }
+      @property auto_indent {
+         set {
+         }
+         get {
+         }
+         values {
+            auto_indent: bool;
+         }
+      }
+      @property ctxpopup {
+         set {
+         }
+         get {
+         }
+         values {
+            ctxpopup: bool;
+         }
+      }
+      @property focus {
+         set {
+         }
+         get {
+         }
+         values {
+            focus: bool;
+         }
+      }
+      @property font_scale {
+         set {
+         }
+         get {
+         }
+         values {
+            font_scale: double;
+         }
+      }
+      @property linenumber {
+         set {
+         }
+         get {
+         }
+         values {
+            linenumber: bool;
+         }
+      }
+      @property smart_undo_redo {
+         set {
+         }
+         get {
+         }
+         values {
+            smart_undo_redo: bool;
+         }
+      }
+      path_set {
+         return: Eina_Bool;
+         params {
+            @in type: Enventor_Path_Type;
+            @in pathes: const(Eina_List) *;
+         }
+      }
+      path_get {
+         return: const(Eina_List) *;
+         params {
+            @in type: Enventor_Path_Type;
+         }
+      }
+      edje_cc_path_set {
+         return: Eina_Bool;
+         params {
+            @in path: const(char) *;
+         }
+      }
+      auto_complete_eet_path_set {
+         return: Eina_Bool;
+         params {
+            @in path: const(char) *;
+         }
+      }
+      programs_list_get {
+         return: Eina_List *;
+      }
+      part_states_list_get {
+         return: Eina_List *;
+         params {
+            @in type: const(char) *;
+         }
+      }
+      parts_list_get {
+         return: Eina_List *;
+      }
+      live_view_get {
+         return: Eo *;
+      }
+      programs_stop {
+      }
+      program_run {
+         params {
+            @in program: const(char) *;
+         }
+      }
+      syntax_color_set {
+         params {
+            @in color_type: Enventor_Syntax_Color_Type;
+            @in val: const(char) *;
+         }
+      }
+      syntax_color_get {
+         return: const(char) *;
+         params {
+            @in color_type: Enventor_Syntax_Color_Type;
+         }
+      }
+      ctxpopup_visible_get {
+         return: bool;
+      }
+      ctxpopup_dismiss {
+      }
+      disabled_set {
+         params {
+            @in disabled: bool;
+         }
+      }
+      live_view_size_set {
+         params {
+            @in w: Evas_Coord;
+            @in h: Evas_Coord;
+         }
+      }
+      live_view_size_get {
+         params {
+            @in w: Evas_Coord *;
+            @in h: Evas_Coord *;
+         }
+      }
+      part_type_get {
+         return: Edje_Part_Type;
+         params {
+            @in part_name: const(char) *;
+         }
+      }
+      font_set {
+         params {
+            @in font_name: const(char) *;
+            @in font_style: const(char) *;
+         }
+      }
+      font_get {
+         params {
+            @in font_name: const(char) **;
+            @in font_style: const(char) **;
+         }
+      }
+      auto_complete_list_show {
+      }
+      keyword_reference_show {
+      }
+      base_scale_get {
+         return: double;
+      }
+   }
+   implements {
+      class.constructor;
+      Eo.Base.constructor;
+      Evas.Object_Smart.add;
+      Evas.Object_Smart.del;
+      Evas.Object_Smart.move;
+      Evas.Object_Smart.resize;
+      Evas.Object_Smart.show;
+      Evas.Object_Smart.hide;
+      Evas.Object_Smart.clip.set;
+      Evas.Object_Smart.clip_unset;
+      Evas.Object_Smart.member_add;
+      Efl.File.file.set;
+   }
+   events {
+      cursor,line,changed;
+      cursor,group,changed;
+      live_view,updated;
+      live_view,loaded;
+      live_view,cursor,moved;
+      live_view,resized;
+      max_line,changed;
+      compile,error;
+      ctxpopup,activated;
+      ctxpopup,changed;
+      ctxpopup,dismissed;
+      edc,modified;
+      focused;
+      file,open,requested;
+   }
+}
diff --git a/src/lib/enventor_private.h b/src/lib/enventor_private.h
new file mode 100644 (file)
index 0000000..0d73c3b
--- /dev/null
@@ -0,0 +1,336 @@
+#ifndef __ENVENTOR_PRIVATE_H__
+#define __ENVENTOR_PRIVATE_H__
+
+#include "common.h"
+
+#define QUOT "&quot;"
+#define QUOT_LEN 6
+#define QUOT_UTF8 "\""
+#define QUOT_UTF8_LEN 1
+#define LESS "&lt;"
+#define GREATER "&gt;"
+#define AMP "&amp;"
+#define EOL "<br/>"
+#define EOL_LEN 5
+#define TAB "<tab/>"
+#define TAB_LEN 6
+#define TAB_SPACE 3
+#define REL1_X 0.25f
+#define REL1_Y 0.25f
+#define REL2_X 0.75f
+#define REL2_Y 0.75f
+#define VIEW_DATA edj_mgr_view_get(NULL)
+#define ATTR_VALUE_MAX_CNT 4
+
+extern const char SIG_CURSOR_LINE_CHANGED[];
+extern const char SIG_CURSOR_GROUP_CHANGED[];
+extern const char SIG_MAX_LINE_CHANGED[];
+extern const char SIG_COMPILE_ERROR[];
+extern const char SIG_LIVE_VIEW_LOADED[];
+extern const char SIG_LIVE_VIEW_UPDATED[];
+extern const char SIG_LIVE_VIEW_CURSOR_MOVED[];
+extern const char SIG_LIVE_VIEW_RESIZED[];
+extern const char SIG_CTXPOPUP_CHANGED[];
+extern const char SIG_CTXPOPUP_DISMISSED[];
+extern const char SIG_CTXPOPUP_ACTIVATED[];
+extern const char SIG_EDC_MODIFIED[];
+extern const char SIG_FOCUSED[];
+extern const char SIG_FILE_OPEN_REQUESTED[];
+
+typedef struct viewer_s view_data;
+typedef struct syntax_color_s color_data;
+typedef struct parser_s parser_data;
+typedef struct attr_value_s attr_value;
+typedef struct syntax_helper_s syntax_helper;
+typedef struct indent_s indent_data;
+typedef struct redoundo_s redoundo_data;
+typedef struct editor_s edit_data;
+typedef struct state_info_s state_info;
+
+typedef enum attr_value_type
+{
+   ATTR_VALUE_BOOLEAN = 1,
+   ATTR_VALUE_INTEGER = 2,
+   ATTR_VALUE_FLOAT = 4,
+   ATTR_VALUE_CONSTANT = 8,
+   ATTR_VALUE_PART = 16,
+   ATTR_VALUE_STATE = 32,
+   ATTR_VALUE_IMAGE = 64,
+   ATTR_VALUE_PROGRAM = 128
+} attr_value_type;
+
+struct attr_value_s
+{
+   Eina_Array *strs;
+   int cnt;
+   float val[ATTR_VALUE_MAX_CNT];
+   float min;
+   float max;
+   attr_value_type type;
+   const char *prepend_str;
+   const char *append_str;
+   Eina_Array *append_str_array;
+   Eina_Bool use_append_str_array : 1;
+   Eina_Bool program : 1;
+};
+
+struct state_info_s
+{
+   double value;
+   const char *part;
+   const char *state;
+};
+
+/* auto_comp */
+void autocomp_init(void);
+void autocomp_term(void);
+void autocomp_target_set(edit_data *ed);
+void autocomp_enabled_set(Eina_Bool enabled);
+Eina_Bool autocomp_enabled_get(void);
+Eina_Bool autocomp_event_dispatch(const char *key);
+void autocomp_list_show(void);
+void autocomp_reset(void);
+const char **autocomp_current_context_get(int *name_count);
+//Tizen Only : Support autocomp eet path set
+Eina_Bool autocomp_eet_path_set(const char *eet_path);
+//
+
+
+/* syntax color */
+color_data *color_init(Eina_Strbuf *strbuf);
+void color_term(color_data *cd);
+void color_set(color_data *cd, Enventor_Syntax_Color_Type color_type, const char *val);
+const char *color_value_get(Enventor_Syntax_Color_Type color_type);
+const char *color_cancel(Ecore_Thread *thread, color_data *cd, const char *str, int length, int from_pos, int to_pos, char **from, char **to);
+const char *color_apply(Ecore_Thread *thread, color_data *cd, const char *str, int length, char *from, char *to);
+
+
+/*parser */
+//Tizen Only : Support Tizen version
+//parser_data *parser_init(void);
+parser_data *parser_init(const char *tizen_version);
+//
+void parser_term(parser_data *pd);
+Eina_Stringshare *parser_first_group_name_get(parser_data *pd, Evas_Object *entry);
+Eina_Stringshare *parser_cur_context_group_name_get(parser_data *pd, Evas_Object *entry, Eina_Bool collections);
+void parser_cur_context_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data, Eina_Bool collections);
+Eina_Stringshare *parser_cur_context_fast_get(Evas_Object *entry, const char *scope);
+Eina_Bool parser_type_name_compare(parser_data *pd, const char *str);
+attr_value *parser_attribute_get(parser_data *pd, const char *text, const char *cur, const char *selected);
+void parser_attribute_value_set(attr_value *attr, char *cur);
+Eina_Stringshare *parser_paragh_name_get(parser_data *pd, Evas_Object *entry);
+char *parser_name_get(parser_data *pd, const char *cur);
+void parser_cancel(parser_data *pd);
+int parser_line_cnt_get(parser_data *pd EINA_UNUSED, const char *src);
+Eina_List *parser_states_filtered_name_get(Eina_List *states);
+int parser_end_of_parts_block_pos_get(const Evas_Object *entry, const char *group_name);
+Eina_Bool parser_images_pos_get(const Evas_Object *entry, int *ret);
+Eina_Bool parser_is_image_name(const Evas_Object *entry, const char *str);
+Eina_Bool parser_styles_pos_get(const Evas_Object *entry, int *ret);
+Eina_Bool parser_state_info_get(Evas_Object *entry, state_info *info);
+typedef void (*Bracket_Update_Cb)(void *data, int left, int right);
+void parser_bracket_find(parser_data *pd, Evas_Object *entry, Bracket_Update_Cb func, void *data);
+void parser_bracket_cancel(parser_data *pd);
+Eina_List *parser_group_list_get(parser_data *pd, Evas_Object *entry);
+
+#define ESCAPE_GOTO_END() \
+   p++; \
+   p = strstr(p, "\""); \
+   if (!p) goto end; \
+   p++; \
+   continue
+
+#define ESCAPE_RET_NULL() \
+   p++; \
+   p = strstr(p, "\""); \
+   if (!p) return NULL; \
+   p++; \
+   continue
+
+char* parser_group_pos_get(char *utf8, char *utf8_end,
+                           const char *group_name);
+char* parser_part_pos_get(char *utf8, char *utf8_end,
+                          const char* group_name,
+                          const char *part_name,
+                          const char *part_type);
+
+/* syntax helper */
+syntax_helper *syntax_init(edit_data *ed);
+void syntax_term(syntax_helper *sh);
+color_data *syntax_color_data_get(syntax_helper *sh);
+indent_data *syntax_indent_data_get(syntax_helper *sh);
+
+
+/* indent */
+indent_data *indent_init(Eina_Strbuf *strbuf, edit_data *ed);
+void indent_term(indent_data *id);
+int indent_space_get(indent_data *id);
+int indent_insert_apply(indent_data *id, const char *insert, int cur_line);
+void indent_delete_apply(indent_data *id, const char *del, int cur_line);
+Eina_Bool indent_text_check(indent_data *id EINA_UNUSED, const char *utf8);
+char * indent_text_create(indent_data *id, const char *utf8, int *indented_line_cnt);
+
+
+/* build */
+void build_edc(void);
+void build_init(void);
+void build_term(void);
+Eina_Bool build_path_set(Enventor_Path_Type type, const Eina_List *pathes);
+Eina_List *build_path_get(Enventor_Path_Type type);
+void  build_edc_path_set(const char *edc_path);
+const char *build_edc_path_get(void);
+const char *build_edj_path_get(void);
+void build_err_noti_cb_set(void (*cb)(void *data, const char *msg), void *data);
+//Tizen Only : Support edje_cc path set
+Eina_Bool build_edje_cc_path_set(const char *edje_cc_path);
+//
+
+
+/* dummy_obj */
+void dummy_obj_new(Evas_Object *layout);
+void dummy_obj_del(Evas_Object *layout);
+void dummy_obj_update(Evas_Object *layout);
+
+/* wireframes_obj */
+void wireframes_obj_new(Evas_Object *layout);
+void wireframes_obj_del(Evas_Object *layout);
+void wireframes_obj_update(Evas_Object *layout);
+void wireframes_obj_callbacks_set(Evas_Object *layout);
+
+/* edj_mgr */
+void edj_mgr_init(Enventor_Object *enventor);
+void edj_mgr_term(void);
+view_data * edj_mgr_view_new(Enventor_Item *it, const char *group);
+view_data *edj_mgr_view_get(Eina_Stringshare *group);
+Evas_Object * edj_mgr_obj_get(void);
+void edj_mgr_view_switch_to(view_data *vd);
+void edj_mgr_view_del(view_data *vd);
+void edj_mgr_reload_need_set(Eina_Bool reload);
+Eina_Bool edj_mgr_reload_need_get(void);
+void edj_mgr_clear(void);
+void edj_mgr_all_views_reload(void);
+
+
+/* redoundo */
+redoundo_data *redoundo_init(edit_data *ed, Enventor_Object *enventor);
+void redoundo_term(redoundo_data *rd);
+void redoundo_clear(redoundo_data *rd);
+void redoundo_text_push(redoundo_data *rd, const char *text, int pos, int length, Eina_Bool insert);
+void redoundo_text_relative_push(redoundo_data *rd, const char *text);
+void redoundo_entry_region_push(redoundo_data *rd, int cursor_pos, int cursor_pos2);
+int redoundo_undo(redoundo_data *rd, Eina_Bool *changed);
+int redoundo_redo(redoundo_data *rd, Eina_Bool *changed);
+void redoundo_n_diff_cancel(redoundo_data *rd, unsigned int n);
+void redoundo_diff_buildable(redoundo_data *rd, Eina_Bool buildable);
+
+
+/* edj_viewer */
+view_data * view_init(Enventor_Object *enventor, Enventor_Item *it, const char *group, void (*del_cb)(void *data), void *data);
+void view_term(view_data *vd);
+Evas_Object *view_obj_get(view_data *vd);
+void view_new(view_data *vd, const char *group);
+void view_part_highlight_set(view_data *vd, const char *part_name);
+void view_dummy_set(view_data *vd, Eina_Bool dummy_on);
+void view_wireframes_set(view_data *vd, Eina_Bool wireframes);
+void view_mirror_mode_update(view_data *vd);
+void view_program_run(view_data *vd, const char *program);
+void view_programs_stop(view_data *vd);
+Eina_Stringshare *view_group_name_get(view_data *vd);
+void *view_data_get(view_data *vd);
+void view_scale_set(view_data *vd, double scale);
+double view_scale_get(view_data *vd);
+void view_size_get(view_data *vd, Evas_Coord *w, Evas_Coord *h);
+void view_size_set(view_data *vd, Evas_Coord w, Evas_Coord h);
+Eina_List *view_parts_list_get(view_data *vd);
+Eina_List *view_images_list_get(view_data *vd);
+Eina_List *view_programs_list_get(view_data *vd);
+Eina_List *view_part_states_list_get(view_data *vd, const char *part);
+Eina_List *view_program_targets_get(view_data *vd, const char *prog);
+void view_string_list_free(Eina_List *list);
+void view_part_state_set(view_data *vd, const char *part, const char *description, const double state);
+void view_obj_need_reload_set(view_data *vd);
+Edje_Part_Type view_part_type_get(view_data *vd, const char *part);
+Enventor_Item *view_item_get(view_data *vd);
+void view_activated_set(view_data *vd, Eina_Bool activated);
+double view_base_scale_get(view_data *vd);
+
+/* template */
+//Tizen Only : Support Tizen version
+//Eina_Bool template_part_insert(edit_data *ed, Edje_Part_Type part_type, Enventor_Template_Insert_Type insert_type, Eina_Bool fixed_w, Eina_Bool fixed_h, char *rel1_x_to, char *rel1_y_to, char *rel2_x_to, char *rel2_y_to, float align_x, float align_y, int min_w, int min_h,
+//float rel1_x, float rel1_y, float rel2_x, float rel2_y, const Eina_Stringshare *group_name, char *syntax, size_t n);
+Eina_Bool template_part_insert(edit_data *ed, Edje_Part_Type part_type, Enventor_Template_Insert_Type insert_type, Eina_Bool fixed_w, Eina_Bool fixed_h, char *rel1_x_to, char *rel1_y_to, char *rel2_x_to, char *rel2_y_to, float align_x, float align_y, int min_w, int min_h,
+float rel1_x, float rel1_y, float rel2_x, float rel2_y, const Eina_Stringshare *group_name, char *syntax, size_t n, const char *tizen_version);
+
+//Eina_Bool template_insert(edit_data *ed, char *syntax, size_t n);
+Eina_Bool template_insert(edit_data *ed, char *syntax, size_t n, const char *tizen_version);
+//
+
+
+/* ctxpopup */
+Evas_Object *ctxpopup_candidate_list_create(edit_data *ed, attr_value *attr, Evas_Smart_Cb ctxpopup_dismiss_cb, Evas_Smart_Cb ctxpopup_changed_cb, Enventor_Ctxpopup_Type *type);
+Evas_Object *ctxpopup_img_preview_create(edit_data*ed, const char *imgpath, Evas_Smart_Cb ctxpopup_dismiss_cb, Evas_Smart_Cb ctxpopup_relay_cb);
+void ctxpopup_img_preview_reload(Evas_Object *ctxpopup, const char *imgpath);
+
+/* edc_editor */
+void edit_font_update(edit_data *ed);
+Eina_Bool edit_key_down_event_dispatch(edit_data *ed, const char *key);
+Eina_Bool edit_key_up_event_dispatch(edit_data *ed, const char *key);
+edit_data *edit_init(Enventor_Object *enventor, Enventor_Item *it);
+void edit_term(edit_data *ed);
+Evas_Object *edit_obj_get(edit_data *ed);
+Eina_Bool edit_changed_get(edit_data *ed);
+void edit_changed_set(edit_data *ed, Eina_Bool changed);
+void edit_linenumber_set(edit_data *ed, Eina_Bool linenumber);
+Eina_Bool edit_saved_get(edit_data *ed);
+void edit_saved_set(edit_data *ed, Eina_Bool saved);
+Eina_Bool edit_save(edit_data *ed, const char *file);
+void edit_new(edit_data* ed);
+void edit_view_sync_cb_set(edit_data *ed, void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data);
+void edit_view_sync(edit_data *ed);
+void edit_font_scale_set(edit_data *ed, double font_scale);
+void edit_line_delete(edit_data *ed);
+Eina_Stringshare *edit_cur_prog_name_get(edit_data *ed);
+Eina_Stringshare *edit_cur_part_name_get(edit_data *ed);
+Eina_Stringshare *edit_cur_paragh_get(edit_data *ed);
+int edit_max_line_get(edit_data *ed);
+void edit_goto(edit_data *ed, int line);
+void edit_syntax_color_set(edit_data *ed, Enventor_Syntax_Color_Type color_type, const char *val);
+void edit_syntax_color_full_apply(edit_data *ed, Eina_Bool force);
+void edit_syntax_color_partial_apply(edit_data *ed, double interval);
+Evas_Object *edit_entry_get(edit_data *ed);
+void edit_line_increase(edit_data *ed, int cnt);
+void edit_line_decrease(edit_data *ed, int cnt);
+int edit_cur_indent_depth_get(edit_data *ed);
+void edit_redoundo_region_push(edit_data *ed, int cursor_pos1, int cursor_pos2);
+Eina_Bool edit_ctxpopup_visible_get(edit_data *ed);
+void edit_ctxpopup_dismiss(edit_data *ed);
+Eina_Bool edit_load(edit_data *ed, const char *edc_path);
+void edit_selection_clear(edit_data *ed);
+const char *edit_text_get(edit_data *ed);
+Eina_Bool edit_redoundo(edit_data *ed, Eina_Bool undo);
+void edit_disabled_set(edit_data *ed, Eina_Bool disabled);
+void edit_error_set(edit_data *ed, int line, const char *target);
+void edit_text_insert(edit_data *ed, const char *text);
+void edit_part_cursor_set(edit_data *ed, const char *group_name, const char *part_name);
+redoundo_data *edit_redoundo_get(edit_data *ed);
+void edit_selection_region_center_set(edit_data *ed, int start, int end);
+const char *edit_file_get(edit_data *ed);
+void edit_select_none(edit_data *ed);
+void edit_cursor_pos_set(edit_data *ed, int position);
+int edit_cursor_pos_get(edit_data *ed);
+const char *edit_selection_get(edit_data *ed);
+Eina_Bool edit_is_main_file(edit_data *ed);
+Eina_Bool edit_focus_get(edit_data *ed);
+void edit_focus_set(edit_data *ed, Eina_Bool focus);
+Eina_List *edit_group_list_get(edit_data *ed);
+
+/* util */
+void mem_fail_msg(void);
+const char* part_type_str_convert(Edje_Part_Type type);
+
+/* reference */
+void ref_init(void);
+void ref_term(void);
+void ref_show(edit_data *ed);
+
+#endif
diff --git a/src/lib/enventor_smart.c b/src/lib/enventor_smart.c
new file mode 100644 (file)
index 0000000..9dfde08
--- /dev/null
@@ -0,0 +1,1318 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#define ELM_INTERNAL_API_ARGESFSDFEFC 1
+#define EFL_CANVAS_OBJECT_PROTECTED 1
+
+#include <Enventor.h>
+#include <Eio.h>
+#include <elm_widget.h>
+#include "enventor_private.h"
+
+#define MY_CLASS_NAME_LEGACY "enventor_object"
+
+#ifdef MY_CLASS
+#undef MY_CLASS
+#endif
+
+#define MY_CLASS ENVENTOR_OBJECT_CLASS
+
+#define DEFAULT_LINENUMBER EINA_TRUE
+#define DEFAULT_FONT_SCALE 1
+#define DEFAULT_AUTO_INDENT EINA_TRUE
+#define DEFAULT_PART_HIGHLIGHT EINA_TRUE
+#define DEFAULT_SMART_UNDO_REDO EINA_FALSE
+#define DEFAULT_CTXPOPUP EINA_TRUE
+
+typedef struct _Enventor_Object_Data Enventor_Object_Data;
+typedef struct _Enventor_Item_Data Enventor_Item_Data;
+
+struct _Enventor_Item_Data
+{
+   edit_data *ed;
+   Enventor_Object_Data *pd;
+};
+
+struct _Enventor_Object_Data
+{
+   Enventor_Object *obj;
+   Enventor_Item *main_it;
+   Eina_List *sub_its;
+   Enventor_Item *focused_it;
+
+   Eina_Stringshare *group_name;
+
+   Ecore_Event_Handler *key_down_handler;
+   Ecore_Event_Handler *key_up_handler;
+
+   double font_scale;
+   Eina_Stringshare *font_name;
+   Eina_Stringshare *font_style;
+   const char *text_color_val[ENVENTOR_SYNTAX_COLOR_LAST];
+
+   //Tizen Only : Support Tizen version
+   Eina_Stringshare *tizen_version;
+
+   Eina_Bool dummy_parts : 1;
+   Eina_Bool wireframes : 1;
+   Eina_Bool disabled : 1;
+   Eina_Bool mirror_mode : 1;
+   Eina_Bool linenumber : 1;
+   Eina_Bool auto_indent : 1;
+   Eina_Bool part_highlight : 1;
+   Eina_Bool smart_undo_redo : 1;
+   Eina_Bool ctxpopup : 1;
+};
+
+static const Evas_Smart_Cb_Description _smart_callbacks[] = {
+   {SIG_CURSOR_LINE_CHANGED, ""},
+   {SIG_CURSOR_GROUP_CHANGED, ""},
+   {SIG_LIVE_VIEW_CURSOR_MOVED, ""},
+   {SIG_LIVE_VIEW_RESIZED, ""},
+   {SIG_LIVE_VIEW_LOADED, ""},
+   {SIG_LIVE_VIEW_UPDATED, ""},
+   {SIG_MAX_LINE_CHANGED, ""},
+   {SIG_COMPILE_ERROR, ""},
+   {SIG_CTXPOPUP_CHANGED, ""},
+   {SIG_CTXPOPUP_DISMISSED, ""},
+   {SIG_CTXPOPUP_ACTIVATED, ""},
+   {SIG_EDC_MODIFIED, ""},
+   {SIG_FOCUSED, ""},
+   {SIG_FILE_OPEN_REQUESTED, ""},
+   {NULL, NULL}
+};
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+_enventor_main_item_free(Enventor_Object_Data *pd)
+{
+   if (pd->main_it) enventor_item_del(pd->main_it);
+}
+
+static void
+_enventor_sub_items_free(Enventor_Object_Data *pd)
+{
+   Enventor_Item *it;
+   EINA_LIST_FREE(pd->sub_its, it)
+     enventor_item_del(it);
+   pd->sub_its = NULL;
+}
+
+static Eina_Bool
+key_up_cb(void *data, int type EINA_UNUSED, void *ev)
+{
+   Enventor_Object_Data *pd = data;
+   Ecore_Event_Key *event = ev;
+
+   if (!pd->focused_it) return ECORE_CALLBACK_PASS_ON;
+
+   edit_key_up_event_dispatch(pd->focused_it->ed, event->key);
+
+   return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool
+key_down_cb(void *data, int type EINA_UNUSED, void *ev)
+{
+   Enventor_Object_Data *pd = data;
+   Ecore_Event_Key *event = ev;
+
+   if (!pd->focused_it) return ECORE_CALLBACK_PASS_ON;
+
+   Eina_Bool ret = edit_focus_get(pd->focused_it->ed);
+   if (!ret) return ECORE_CALLBACK_PASS_ON;
+
+   if (edit_key_down_event_dispatch(pd->focused_it->ed, event->key))
+     return ECORE_CALLBACK_DONE;
+
+   if (autocomp_event_dispatch(event->key))
+     return ECORE_CALLBACK_DONE;
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+edit_view_sync_cb(void *data, Eina_Stringshare *state_name, double state_value,
+                  Eina_Stringshare *part_name, Eina_Stringshare *group_name)
+{
+   Enventor_Item *it = data;
+   Enventor_Object_Data *pd = it->pd;
+
+   edj_mgr_all_views_reload();
+
+   //Switch group!
+   if (pd->group_name != group_name)
+     {
+        view_data *vd = edj_mgr_view_get(group_name);
+        if (vd)
+          {
+             //If a group name equals to an other item's,
+             //Probably, Enventor switches multiple collections.
+             if (view_item_get(vd) == it) edj_mgr_view_switch_to(vd);
+             else edj_mgr_view_switch_to(NULL);
+          }
+        else
+          {
+             vd = edj_mgr_view_new(it, group_name);
+             if (!vd) edj_mgr_view_switch_to(NULL);
+          }
+        view_dummy_set(vd, pd->dummy_parts);
+        view_wireframes_set(vd, pd->wireframes);
+        eina_stringshare_del(pd->group_name);
+        pd->group_name = eina_stringshare_add(group_name);
+        evas_object_smart_callback_call(pd->obj, SIG_CURSOR_GROUP_CHANGED,
+                                        (void *) group_name);
+     }
+   if (pd->part_highlight && !pd->disabled)
+     view_part_highlight_set(VIEW_DATA, part_name);
+   else
+     view_part_highlight_set(VIEW_DATA, NULL);
+
+   //reset previous part's state
+   if (!state_name)
+     {
+        view_part_state_set(VIEW_DATA, NULL, NULL, 0);
+        return;
+     }
+
+   view_part_state_set(VIEW_DATA, part_name, state_name, state_value);
+}
+
+static void
+build_err_noti_cb(void *data, const char *msg)
+{
+   Enventor_Object_Data *pd = data;
+
+   int line_num = 0;
+   Eina_Stringshare *target = NULL;
+   char *ptr = NULL;
+   char *utf8 = evas_textblock_text_markup_to_utf8(NULL, msg);
+
+   if (!utf8) goto call_error;
+
+   if ((ptr = strstr(utf8, ".edc")))
+     {
+        ptr += strlen(".edc");
+        if (!ptr || (ptr[0] != ':')) goto call_error;
+        if (!(++ptr)) goto call_error;
+        line_num = atoi(ptr);
+     }
+   else if ((ptr = strstr(utf8, "image")) ||
+            (ptr = strstr(utf8, "group")) ||
+            (ptr = strstr(utf8, "part")))
+      {
+        ptr = strchr(ptr, '\"');
+        if (!ptr || !(ptr++)) goto call_error;
+        char *ptr2 = strchr(ptr, '\"');
+        if (!ptr2) goto call_error;
+        int length = ptr2 - ptr;
+        target = eina_stringshare_add_length(ptr, length);
+     }
+
+call_error:
+   free(utf8);
+   //FIXME:
+   edit_error_set(pd->main_it->ed, line_num - 1, target);
+   if (line_num || target)
+     edit_syntax_color_full_apply(pd->main_it->ed, EINA_TRUE);
+
+   redoundo_data *rd = edit_redoundo_get(pd->main_it->ed);
+
+   // When msg == NULL it mean, that needed to reset error state
+   if (msg)
+     {
+        // Ctxpopup should be dismissed only in cases when error happens
+        edit_ctxpopup_dismiss(pd->main_it->ed);
+        evas_object_smart_callback_call(pd->obj, SIG_COMPILE_ERROR, (char *)msg);
+        redoundo_diff_buildable(rd, EINA_FALSE);
+     }
+   else
+     {
+        redoundo_diff_buildable(rd, EINA_TRUE);
+     }
+}
+
+static void
+_enventor_part_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ei)
+{
+   Enventor_Object_Data *pd = (Enventor_Object_Data *)data;
+   if (pd->disabled || !pd->focused_it) return;
+   const char *part_name = (const char *)ei;
+   edit_part_cursor_set(pd->focused_it->ed, view_group_name_get(VIEW_DATA),
+                        part_name);
+}
+
+
+/*****************************************************************************/
+/* Internal Eo object required routines                                      */
+/*****************************************************************************/
+EOLIAN static void
+_enventor_object_class_constructor(Eo_Class *klass)
+{
+   evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
+}
+
+EOLIAN static void
+_enventor_object_evas_object_smart_add(Eo *obj, Enventor_Object_Data *pd)
+{
+   pd->obj = obj;
+   elm_widget_sub_object_parent_add(obj);
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
+
+   build_init();
+   autocomp_init();
+   ref_init();
+   edj_mgr_init(obj);
+   build_err_noti_cb_set(build_err_noti_cb, pd);
+
+   elm_widget_can_focus_set(obj, EINA_FALSE);
+
+   pd->key_down_handler =
+      ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, key_down_cb, pd);
+   pd->key_up_handler =
+      ecore_event_handler_add(ECORE_EVENT_KEY_UP, key_up_cb, pd);
+
+   evas_object_smart_callback_add(pd->obj, "part,clicked",
+                                  _enventor_part_clicked_cb, pd);
+
+   pd->font_scale = DEFAULT_FONT_SCALE;
+   pd->linenumber = DEFAULT_LINENUMBER;
+   pd->auto_indent = DEFAULT_AUTO_INDENT;
+   pd->part_highlight = DEFAULT_PART_HIGHLIGHT;
+   pd->smart_undo_redo = DEFAULT_SMART_UNDO_REDO;
+   pd->ctxpopup = DEFAULT_CTXPOPUP;
+}
+
+EOLIAN static void
+_enventor_object_evas_object_smart_del(Evas_Object *obj EINA_UNUSED,
+                                       Enventor_Object_Data *pd)
+{
+   int i;
+   for (i = ENVENTOR_SYNTAX_COLOR_STRING; i < ENVENTOR_SYNTAX_COLOR_LAST; i++)
+     eina_stringshare_del(pd->text_color_val[i]);
+
+   eina_stringshare_del(pd->font_name);
+   eina_stringshare_del(pd->font_style);   
+   eina_stringshare_del(pd->group_name);
+   autocomp_term();
+   ref_term();
+   ecore_event_handler_del(pd->key_down_handler);
+   ecore_event_handler_del(pd->key_up_handler);
+
+   _enventor_sub_items_free(pd);
+   _enventor_main_item_free(pd);
+
+   edj_mgr_term();
+   build_term();
+}
+
+EOLIAN static void
+_enventor_object_evas_object_smart_member_add(Eo *obj, Enventor_Object_Data *pd EINA_UNUSED, Evas_Object *child)
+{
+   //Don't go through elm_widget to avoid color set.
+   evas_object_data_set(child, "_elm_leaveme", (void*)1);
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_member_add(child));
+
+   Evas_Coord x, y, w, h;
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+   evas_object_move(child, x, y);
+   evas_object_resize(child, w, h);
+   evas_object_clip_set(child, evas_object_clip_get(obj));
+}
+
+EOLIAN static void
+_enventor_object_evas_object_smart_move(Evas_Object *obj EINA_UNUSED, Enventor_Object_Data *pd EINA_UNUSED, Evas_Coord x, Evas_Coord y)
+{
+   Eina_Iterator *it = evas_object_smart_iterator_new(obj);
+   Evas_Object *o;
+   EINA_ITERATOR_FOREACH(it, o)
+     evas_object_move(o, x, y);
+   eina_iterator_free(it);
+}
+
+EOLIAN static void
+_enventor_object_evas_object_smart_resize(Evas_Object *obj EINA_UNUSED, Enventor_Object_Data *pd EINA_UNUSED, Evas_Coord w, Evas_Coord h)
+{
+   Eina_Iterator *it = evas_object_smart_iterator_new(obj);
+   Evas_Object *o;
+   EINA_ITERATOR_FOREACH(it, o)
+     evas_object_resize(o, w, h);
+   eina_iterator_free(it);
+}
+
+EOLIAN static void
+_enventor_object_evas_object_smart_show(Evas_Object *obj EINA_UNUSED, Enventor_Object_Data *pd)
+{
+   if (!pd->focused_it) return;
+   Evas_Object *o = edit_obj_get(pd->focused_it->ed);
+   evas_object_show(o);
+}
+
+EOLIAN static void
+_enventor_object_evas_object_smart_hide(Evas_Object *obj EINA_UNUSED, Enventor_Object_Data *pd)
+{
+   if (!pd->focused_it) return;
+   Evas_Object *o = edit_obj_get(pd->focused_it->ed);
+   evas_object_hide(o);
+}
+
+EOLIAN static void
+_enventor_object_evas_object_smart_clip_set(Evas_Object *obj EINA_UNUSED, Enventor_Object_Data *pd EINA_UNUSED, Evas_Object *clip)
+{
+   Eina_Iterator *it = evas_object_smart_iterator_new(obj);
+   Evas_Object *o;
+   EINA_ITERATOR_FOREACH(it, o)
+     evas_object_clip_set(o, clip);
+   eina_iterator_free(it);
+}
+
+EOLIAN static void
+_enventor_object_evas_object_smart_clip_unset(Evas_Object *obj EINA_UNUSED, Enventor_Object_Data *pd EINA_UNUSED)
+{
+   Eina_Iterator *it = evas_object_smart_iterator_new(obj);
+   Evas_Object *o;
+   EINA_ITERATOR_FOREACH(it, o)
+     evas_object_clip_unset(o);
+   eina_iterator_free(it);
+}
+
+EOLIAN static Eo *
+_enventor_object_eo_base_constructor(Eo *obj,
+                                     Enventor_Object_Data *pd EINA_UNUSED)
+{
+   obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
+   eo_do(obj,
+         evas_obj_type_set(MY_CLASS_NAME_LEGACY),
+         evas_obj_smart_callbacks_descriptions_set(_smart_callbacks));
+
+   return obj;
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_efl_file_file_set(Eo *obj EINA_UNUSED,
+                                   Enventor_Object_Data *pd,
+                                   const char *file,
+                                   const char *group EINA_UNUSED)
+{
+   build_edc_path_set(file);
+   if (!file) goto err;
+
+   if (!edit_load(pd->main_it->ed, file)) return EINA_FALSE;
+   build_edc();
+   edit_changed_set(pd->main_it->ed, EINA_FALSE);
+
+   return EINA_TRUE;
+
+err:
+   build_edc_path_set(NULL);
+   return EINA_FALSE;
+}
+
+EOLIAN static Eina_List *
+_enventor_object_programs_list_get(Eo *obj EINA_UNUSED,
+                                   Enventor_Object_Data *pd EINA_UNUSED)
+{
+   return view_programs_list_get(VIEW_DATA);
+}
+
+EOLIAN static Eina_List *
+_enventor_object_part_states_list_get(Eo *obj EINA_UNUSED,
+                                      Enventor_Object_Data *pd EINA_UNUSED,
+                                      const char *part)
+{
+   return view_part_states_list_get(VIEW_DATA, part);
+}
+
+EOLIAN static Edje_Part_Type
+_enventor_object_part_type_get(Eo *obj EINA_UNUSED,
+                               Enventor_Object_Data *pd EINA_UNUSED,
+                               const char *part_name)
+{
+   return view_part_type_get(VIEW_DATA, part_name);
+}
+
+EOLIAN static Eina_List *
+_enventor_object_parts_list_get(Eo *obj EINA_UNUSED,
+                                Enventor_Object_Data *pd EINA_UNUSED)
+{
+   return view_parts_list_get(VIEW_DATA);
+}
+
+EOLIAN static void
+_enventor_object_linenumber_set(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd,
+                                Eina_Bool linenumber)
+{
+   linenumber = !!linenumber;
+
+   if (pd->linenumber == linenumber) return;
+
+   if (!pd->focused_it) return;
+
+   //Main Item
+   edit_linenumber_set(pd->focused_it->ed, linenumber);
+
+   pd->linenumber = linenumber;
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_linenumber_get(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd)
+{
+   return pd->linenumber;
+}
+
+EOLIAN static void
+_enventor_object_smart_undo_redo_set(Eo *obj EINA_UNUSED,
+                                     Enventor_Object_Data *pd,
+                                     Eina_Bool smart_undo_redo)
+{
+   smart_undo_redo = !!smart_undo_redo;
+   pd->smart_undo_redo = smart_undo_redo;
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_smart_undo_redo_get(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd)
+{
+   return pd->smart_undo_redo;
+}
+
+EOLIAN static void
+_enventor_object_auto_indent_set(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd,
+                                 Eina_Bool auto_indent)
+{
+   pd->auto_indent = !!auto_indent;
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_auto_indent_get(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd)
+{
+   return pd->auto_indent;
+}
+
+EOLIAN static void
+_enventor_object_auto_complete_set(Eo *obj EINA_UNUSED,
+                                   Enventor_Object_Data *pd EINA_UNUSED,
+                                   Eina_Bool auto_complete)
+{
+   autocomp_enabled_set(auto_complete);
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_auto_complete_get(Eo *obj EINA_UNUSED,
+                                   Enventor_Object_Data *pd EINA_UNUSED)
+{
+   return autocomp_enabled_get();
+}
+
+EOLIAN static void
+_enventor_object_auto_complete_list_show(Eo *obj EINA_UNUSED,
+                                   Enventor_Object_Data *pd EINA_UNUSED)
+{
+   autocomp_list_show();
+}
+
+//Tizen Only : Support autocomp eet path set
+EOLIAN static Eina_Bool
+_enventor_object_auto_complete_eet_path_set(Eo *obj EINA_UNUSED,
+                                            Enventor_Object_Data *pd EINA_UNUSED,
+                                            const char *path)
+{
+   return autocomp_eet_path_set(path);
+}
+//
+
+EOLIAN static Eina_Bool
+_enventor_object_path_set(Eo *obj EINA_UNUSED,
+                          Enventor_Object_Data *pd EINA_UNUSED,
+                          Enventor_Path_Type type, const Eina_List *pathes)
+{
+   return build_path_set(type, pathes);
+}
+
+EOLIAN static const Eina_List *
+_enventor_object_path_get(Eo *obj EINA_UNUSED,
+                          Enventor_Object_Data *pd EINA_UNUSED,
+                          Enventor_Path_Type type)
+{
+   return build_path_get(type);
+}
+
+//Tizen Only : Support edje_cc path set
+EOLIAN static Eina_Bool
+_enventor_object_edje_cc_path_set(Eo *obj EINA_UNUSED,
+                                  Enventor_Object_Data *pd EINA_UNUSED,
+                                  const char *path)
+{
+   return build_edje_cc_path_set(path);
+}
+//
+
+EOLIAN static void
+_enventor_object_live_view_scale_set(Eo *obj EINA_UNUSED,
+                                     Enventor_Object_Data *pd EINA_UNUSED,
+                                     double scale)
+{
+   view_scale_set(VIEW_DATA, scale);
+}
+
+EOLIAN static void
+_enventor_object_live_view_size_set(Eo *obj EINA_UNUSED,
+                                    Enventor_Object_Data *pd EINA_UNUSED,
+                                    Evas_Coord w, Evas_Coord h)
+{
+   view_size_set(VIEW_DATA, w, h);
+}
+
+EOLIAN static void
+_enventor_object_live_view_size_get(Eo *obj EINA_UNUSED,
+                                    Enventor_Object_Data *pd EINA_UNUSED,
+                                    Evas_Coord *w, Evas_Coord *h)
+{
+   view_size_get(VIEW_DATA, w, h);
+}
+
+EOLIAN static double
+_enventor_object_live_view_scale_get(Eo *obj EINA_UNUSED,
+                                     Enventor_Object_Data *pd EINA_UNUSED)
+{
+   return view_scale_get(VIEW_DATA);
+}
+
+EOLIAN static void
+_enventor_object_dummy_parts_set(Eo *obj EINA_UNUSED,
+                                 Enventor_Object_Data *pd,
+                                 Eina_Bool dummy_parts)
+{
+   dummy_parts = !!dummy_parts;
+   if (pd->dummy_parts == dummy_parts) return;
+
+   view_dummy_set(VIEW_DATA, dummy_parts);
+   pd->dummy_parts = dummy_parts;
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_ctxpopup_get(Eo *obj EINA_UNUSED,
+                              Enventor_Object_Data *pd)
+{
+   return pd->ctxpopup;
+}
+
+EOLIAN static void
+_enventor_object_ctxpopup_set(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd,
+                              Eina_Bool ctxpopup)
+{
+   ctxpopup = !!ctxpopup;
+   pd->ctxpopup = ctxpopup;
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_ctxpopup_visible_get(Eo *obj EINA_UNUSED,
+                                      Enventor_Object_Data *pd)
+{
+   if (!pd->focused_it) return EINA_FALSE;
+   return edit_ctxpopup_visible_get(pd->focused_it->ed);
+}
+
+EOLIAN static void
+_enventor_object_ctxpopup_dismiss(Eo *obj EINA_UNUSED,
+                                  Enventor_Object_Data *pd)
+{
+   if (!pd->focused_it) return;
+   edit_ctxpopup_dismiss(pd->focused_it->ed);
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_dummy_parts_get(Eo *obj EINA_UNUSED,
+                                   Enventor_Object_Data *pd)
+{
+   return pd->dummy_parts;
+}
+
+EOLIAN static void
+_enventor_object_wireframes_set(Eo *obj EINA_UNUSED,
+                                Enventor_Object_Data *pd,
+                                Eina_Bool wireframes)
+{
+   wireframes = !!wireframes;
+
+   view_wireframes_set(VIEW_DATA, wireframes);
+   pd->wireframes = wireframes;
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_wireframes_get(Eo *obj EINA_UNUSED,
+                                Enventor_Object_Data *pd)
+{
+   return pd->wireframes;
+}
+
+
+EOLIAN static void
+_enventor_object_part_highlight_set(Eo *obj EINA_UNUSED,
+                                    Enventor_Object_Data *pd,
+                                    Eina_Bool part_highlight)
+{
+   part_highlight = !!part_highlight;
+   if (pd->part_highlight == part_highlight) return;
+   pd->part_highlight = part_highlight;
+
+   if (!pd->focused_it) return;
+
+   //Main Item
+   if (part_highlight) edit_view_sync(pd->focused_it->ed);
+   else view_part_highlight_set(VIEW_DATA, NULL);
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_part_highlight_get(Eo *obj EINA_UNUSED,
+                                    Enventor_Object_Data *pd)
+{
+   return pd->part_highlight;
+}
+
+EOLIAN static void
+_enventor_object_mirror_mode_set(Eo *obj EINA_UNUSED,
+                                 Enventor_Object_Data *pd,
+                                 Eina_Bool mirror_mode)
+{
+   pd->mirror_mode = !!mirror_mode;
+   view_mirror_mode_update(VIEW_DATA);
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_mirror_mode_get(Eo *obj EINA_UNUSED,
+                                 Enventor_Object_Data *pd)
+{
+   return pd->mirror_mode;
+}
+
+EOLIAN static void
+_enventor_object_focus_set(Eo *obj EINA_UNUSED,
+                           Enventor_Object_Data *pd EINA_UNUSED,
+                           Eina_Bool focus)
+{
+   if (!pd->focused_it) return;
+   edit_focus_set(pd->focused_it->ed, focus);
+}
+
+EOLIAN static Eina_Bool
+_enventor_object_focus_get(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd)
+{
+   if (!pd->focused_it) return EINA_FALSE;
+   return edit_focus_get(pd->focused_it->ed);
+}
+
+EOLIAN static void
+_enventor_object_font_scale_set(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd,
+                                double font_scale)
+{
+   if (pd->font_scale == font_scale) return;
+   pd->font_scale = font_scale;
+
+   if (!pd->focused_it) return;
+     edit_font_scale_set(pd->focused_it->ed, font_scale);
+}
+
+EOLIAN static double
+_enventor_object_font_scale_get(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd)
+{
+   return pd->font_scale;
+}
+
+EOLIAN static void
+_enventor_object_font_set(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd,
+                          const char *font_name, const char *font_style)
+{
+   if (!font_name) return;
+   if ((font_name == pd->font_name) && (font_style == pd->font_style)) return;
+
+   eina_stringshare_replace(&pd->font_name, font_name);
+   eina_stringshare_replace(&pd->font_style, font_style);
+
+   char *font = NULL;
+   if (font_name) font = elm_font_fontconfig_name_get(font_name, font_style);
+   //Tizen Only
+   //elm_config_font_overlay_set("enventor_entry", font, -100);
+   elm_config_font_overlay_set("entry_edit", font, -100);
+   elm_config_font_overlay_apply();
+
+   elm_font_fontconfig_name_free(font);
+}
+
+EOLIAN static void
+_enventor_object_font_get(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd,
+                          const char **font_name, const char **font_style)
+{
+   if (font_name) *font_name = pd->font_name;
+   if (font_style) *font_style = pd->font_style;
+}
+
+EOLIAN static void
+_enventor_object_syntax_color_set(Eo *obj EINA_UNUSED,
+                                  Enventor_Object_Data *pd,
+                                  Enventor_Syntax_Color_Type color_type,
+                                  const char *val)
+{
+   EINA_SAFETY_ON_NULL_RETURN(val);
+
+   if ((color_type < ENVENTOR_SYNTAX_COLOR_STRING) ||
+       (color_type >= ENVENTOR_SYNTAX_COLOR_LAST))
+     {
+        EINA_LOG_ERR("Invalid color_type(%d)", color_type);
+        return;
+     }
+
+   eina_stringshare_del(pd->text_color_val[color_type]);
+   pd->text_color_val[color_type] = eina_stringshare_add(val);
+
+   //Main Item
+   if (pd->main_it)
+     edit_syntax_color_set(pd->main_it->ed, color_type, val);
+
+   //Sub Items
+   Eina_List *l;
+   Enventor_Item *it;
+   EINA_LIST_FOREACH(pd->sub_its, l, it)
+     edit_syntax_color_set(it->ed, color_type, val);
+}
+
+EOLIAN static const char *
+_enventor_object_syntax_color_get(Eo *obj EINA_UNUSED,
+                                  Enventor_Object_Data *pd,
+                                  Enventor_Syntax_Color_Type color_type)
+{
+   if ((color_type < ENVENTOR_SYNTAX_COLOR_STRING) ||
+       (color_type >= ENVENTOR_SYNTAX_COLOR_LAST))
+     {
+        EINA_LOG_ERR("Invalid color_type(%d)", color_type);
+        return NULL;
+     }
+
+   //Return overriden color values or defaults.
+   if (pd->text_color_val[color_type])
+     return pd->text_color_val[color_type];
+   else
+     return color_value_get(color_type);
+}
+
+EOLIAN static Eo *
+_enventor_object_live_view_get(Eo *obj EINA_UNUSED,
+                               Enventor_Object_Data *pd EINA_UNUSED)
+{
+   return edj_mgr_obj_get();
+}
+
+EOLIAN static void
+_enventor_object_disabled_set(Eo *obj EINA_UNUSED,
+                              Enventor_Object_Data *pd,
+                              Eina_Bool disabled)
+{
+   disabled = !!disabled;
+   if (pd->disabled == disabled) return;
+
+   if (!pd->focused_it) return;
+   edit_disabled_set(pd->focused_it->ed, disabled);
+
+   pd->disabled = !!disabled;
+}
+
+EOLIAN static void
+_enventor_object_program_run(Eo *obj EINA_UNUSED,
+                             Enventor_Object_Data *pd EINA_UNUSED,
+                             const char *program)
+{
+   view_program_run(VIEW_DATA, program);
+}
+
+EOLIAN static void
+_enventor_object_programs_stop(Eo *obj EINA_UNUSED,
+                               Enventor_Object_Data *pd EINA_UNUSED)
+{
+   view_programs_stop(VIEW_DATA);
+}
+
+EOLIAN static void
+_enventor_object_keyword_reference_show(Eo *obj EINA_UNUSED,
+                                        Enventor_Object_Data *pd)
+{
+   if (!pd->focused_it) return;
+   ref_show(pd->focused_it->ed);
+}
+
+EOLIAN static double
+_enventor_object_base_scale_get(Eo *obj EINA_UNUSED,
+                                Enventor_Object_Data *pd EINA_UNUSED)
+{
+   return view_base_scale_get(VIEW_DATA);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+EAPI Enventor_Object *
+enventor_object_add(Enventor_Object *parent)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
+   Evas_Object *obj = eo_add(MY_CLASS, parent);
+   return obj;
+}
+
+EAPI Enventor_Item *
+enventor_object_sub_item_add(Enventor_Object *obj, const char *file)
+{
+   Enventor_Object_Data *pd = eo_data_scope_get(obj, ENVENTOR_OBJECT_CLASS);
+
+   if (!file)
+     {
+        EINA_LOG_ERR("No file path!!");
+        return NULL;
+     }
+
+   Enventor_Item_Data *it = calloc(1, sizeof(Enventor_Item_Data));
+   if (!it)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+
+   it->ed = edit_init(obj, it);
+   it->pd = pd;
+
+   if (!edit_load(it->ed, file))
+     {
+        edit_term(it->ed);
+        free(it);
+        return NULL;
+     }
+
+   edit_changed_set(it->ed, EINA_FALSE);
+   edit_disabled_set(it->ed, EINA_TRUE);
+
+   pd->sub_its = eina_list_append(pd->sub_its, it);
+
+   //Update Syntax Color Here.
+   int i;
+   for (i = ENVENTOR_SYNTAX_COLOR_STRING; i < ENVENTOR_SYNTAX_COLOR_LAST; i++)
+     {
+        if (!pd->text_color_val[i]) continue;
+        edit_syntax_color_set(it->ed, i, pd->text_color_val[i]);
+     }
+
+   return it;
+}
+
+EAPI Enventor_Item *
+enventor_object_main_item_set(Enventor_Object *obj, const char *file)
+{
+   Enventor_Object_Data *pd = eo_data_scope_get(obj, ENVENTOR_OBJECT_CLASS);
+
+   edj_mgr_clear();
+   _enventor_main_item_free(pd);
+
+   Enventor_Item_Data *it = calloc(1, sizeof(Enventor_Item_Data));
+   if (!it)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+
+   pd->main_it = it;
+
+   it->ed = edit_init(obj, it);
+   it->pd = pd;
+
+   Eina_Bool ret;
+   if (!eo_do_ret(obj, ret, efl_file_set(file, NULL)))
+     {
+        edit_term(it->ed);
+        pd->main_it = NULL;
+        free(it);
+        return NULL;
+     }
+
+   return it;
+}
+
+EAPI Enventor_Item *
+enventor_object_main_item_get(const Enventor_Object *obj)
+{
+   Enventor_Object_Data *pd = eo_data_scope_get(obj, ENVENTOR_OBJECT_CLASS);
+   return pd->main_it;
+}
+
+EAPI const Eina_List *
+enventor_object_sub_items_get(const Enventor_Object *obj)
+{
+   Enventor_Object_Data *pd = eo_data_scope_get(obj, ENVENTOR_OBJECT_CLASS);
+   return pd->sub_its;
+}
+
+EAPI Enventor_Item *
+enventor_object_focused_item_get(const Enventor_Object *obj)
+{
+   Enventor_Object_Data *pd = eo_data_scope_get(obj, ENVENTOR_OBJECT_CLASS);
+   return  pd->focused_it;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/* Enventor_Item Functions.                                                  */
+///////////////////////////////////////////////////////////////////////////////
+EAPI Eina_Bool
+enventor_item_represent(Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   Enventor_Object_Data *pd = it->pd;
+
+   if (pd->focused_it == it) return EINA_TRUE;
+
+   eina_stringshare_del(pd->group_name);
+   pd->group_name = NULL;
+
+   if (pd->focused_it)
+     {
+        edit_view_sync_cb_set(pd->focused_it->ed, NULL, NULL);
+        evas_object_hide(edit_obj_get(pd->focused_it->ed));
+        edj_mgr_view_switch_to(NULL);
+     }
+   edit_view_sync_cb_set(it->ed, edit_view_sync_cb, it);
+
+   pd->focused_it = it;
+
+   //Update Editor State
+   edit_linenumber_set(it->ed, pd->linenumber);
+   edit_font_scale_set(it->ed, pd->font_scale);
+   edit_disabled_set(it->ed, pd->disabled);
+
+   if (evas_object_visible_get(it->pd->obj))
+     evas_object_show(edit_obj_get(it->ed));
+
+   autocomp_target_set(it->ed);
+
+   return EINA_TRUE;
+}
+
+EAPI Evas_Object *
+enventor_item_editor_get(const Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, NULL);
+
+   if (!it->ed) return NULL;
+
+   return edit_obj_get(it->ed);
+}
+
+EAPI const char *
+enventor_item_file_get(const Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, NULL);
+
+   if (!it->ed) return NULL;
+
+   return edit_file_get(it->ed);
+}
+
+EAPI int
+enventor_item_max_line_get(const Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, 0);
+
+   return edit_max_line_get(it->ed);
+}
+
+EAPI Eina_Bool
+enventor_item_line_goto(Enventor_Item *it, int line)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   edit_goto(it->ed, line);
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+enventor_item_syntax_color_full_apply(Enventor_Item *it, Eina_Bool force)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   edit_syntax_color_full_apply(it->ed, force);
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+enventor_item_syntax_color_partial_apply(Enventor_Item *it, double interval)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   edit_syntax_color_partial_apply(it->ed, interval);
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+enventor_item_select_region_set(Enventor_Item *it, int start, int end)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   edit_selection_clear(it->ed);
+   edit_selection_region_center_set(it->ed, start, end);
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+enventor_item_select_none(Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   edit_select_none(it->ed);
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+enventor_item_cursor_pos_set(Enventor_Item *it, int position)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   edit_cursor_pos_set(it->ed, position);
+
+   return EINA_TRUE;
+}
+
+EAPI int
+enventor_item_cursor_pos_get(const Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, 0);
+
+   return edit_cursor_pos_get(it->ed);
+}
+
+EAPI const char *
+enventor_item_selection_get(const Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, NULL);
+
+   return edit_selection_get(it->ed);
+}
+
+EAPI Eina_Bool
+enventor_item_text_insert(Enventor_Item *it, const char *text)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   edit_text_insert(it->ed, text);
+
+   return EINA_TRUE;
+}
+
+EAPI const char *
+enventor_item_text_get(const Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, NULL);
+
+   return edit_text_get(it->ed);
+}
+
+EAPI Eina_Bool
+enventor_item_line_delete(Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   edit_line_delete(it->ed);
+
+   //Close auto-completion popup if it's shown.
+   autocomp_reset();
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+enventor_item_file_save(Enventor_Item *it, const char *file)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   if (!file) file = edit_file_get(it->ed);
+
+   //Update edc file and try to save if the edc path is different.
+   if (it->pd->main_it == it)
+     {
+        if (build_edc_path_get() != file)
+          edit_changed_set(it->ed, EINA_TRUE);
+     }
+
+   Eina_Bool saved = edit_save(it->ed, file);
+   if (saved) build_edc();
+   return saved;
+}
+
+EAPI Eina_Bool
+enventor_item_modified_get(const Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   return edit_changed_get(it->ed);
+}
+
+EAPI void
+enventor_item_modified_set(Enventor_Item *it, Eina_Bool modified)
+{
+   EINA_SAFETY_ON_NULL_RETURN(it);
+
+   edit_changed_set(it->ed, modified);
+}
+
+EAPI Eina_Bool
+enventor_item_del(Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+   Enventor_Object_Data *pd = it->pd;
+
+   if (pd->focused_it == it)
+     {
+        edj_mgr_view_switch_to(NULL);
+        autocomp_target_set(NULL);
+        pd->focused_it = NULL;
+     }
+
+   edit_term(it->ed);
+
+   //Main Item?
+   if (it == pd->main_it)
+     {
+        pd->main_it = NULL;
+        free(it);
+     }
+   //Sub Items
+   else
+     {
+        pd->sub_its = eina_list_remove(pd->sub_its, it);
+        free(it);
+     }
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+enventor_item_template_insert(Enventor_Item *it, char *syntax, size_t n)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   //Tizen Only : Support Tizen version
+   //return template_insert(it->ed, syntax, n);
+   return template_insert(it->ed, syntax, n, it->pd->tizen_version);
+   //
+}
+
+EAPI Eina_Bool
+enventor_item_template_part_insert(Enventor_Item *it,
+                                   Edje_Part_Type part,
+                                   Enventor_Template_Insert_Type insert_type,
+                                   Eina_Bool fixed_w, Eina_Bool fixed_h,
+                                   char *rel1_x_to, char *rel1_y_to,
+                                   char *rel2_x_to, char *rel2_y_to,
+                                   float align_x, float align_y,
+                                   int min_w, int min_h,
+                                   float rel1_x, float rel1_y,
+                                   float rel2_x,float rel2_y,
+                                   char *syntax, size_t n)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   Enventor_Object_Data *pd = it->pd;
+
+   // if mirror mode, exchange properties about left and right
+   if (pd->mirror_mode)
+     {
+        float x1, x2;
+        x1 = 1.0 - rel2_x;
+       x2 = 1.0 - rel1_x;
+       rel1_x = x1;
+       rel2_x = x2;
+
+       if (align_x == 0.0)
+         align_x = 1.0;
+       else if (align_x == 1.0)
+         align_x = 0.0;
+
+       char *buf;
+       buf = rel1_x_to;
+       rel1_x_to = rel2_x_to;
+       rel2_x_to =  buf;
+     }
+
+   //Tizen Only : Support Tizen version
+   //return template_part_insert(it->ed, part, insert_type,
+   //                            fixed_w, fixed_h,
+   //                            rel1_x_to, rel1_y_to,
+   //                            rel2_x_to, rel2_y_to,
+   //                            align_x, align_y, min_w, min_h,
+   //                            rel1_x, rel1_y, rel2_x, rel2_y,
+   //                            NULL, syntax, n);
+   return template_part_insert(it->ed, part, insert_type,
+                               fixed_w, fixed_h,
+                               rel1_x_to, rel1_y_to,
+                               rel2_x_to, rel2_y_to,
+                               align_x, align_y, min_w, min_h,
+                               rel1_x, rel1_y, rel2_x, rel2_y,
+                               NULL, syntax, n, pd->tizen_version);
+   //
+}
+
+EAPI Eina_Bool
+enventor_item_redo(Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   return edit_redoundo(it->ed, EINA_FALSE);
+}
+
+EAPI Eina_Bool
+enventor_item_undo(Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, EINA_FALSE);
+
+   return edit_redoundo(it->ed, EINA_TRUE);
+}
+
+EAPI Eina_List *
+enventor_item_group_list_get(Enventor_Item *it)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(it, NULL);
+
+   return edit_group_list_get(it->ed);
+}
+
+//Tizen Only : Support Tizen version
+EAPI Eina_Bool
+enventor_object_tizen_version_set(Enventor_Object *obj, const char *version)
+{
+   Enventor_Object_Data *pd = eo_data_scope_get(obj, ENVENTOR_OBJECT_CLASS);
+   if (!pd) return EINA_FALSE;
+
+   if (pd->tizen_version)
+     {
+        eina_stringshare_del(pd->tizen_version);
+        pd->tizen_version = NULL;
+     }
+   if (version)
+     pd->tizen_version = eina_stringshare_add(version);
+
+   return EINA_TRUE;
+}
+
+EAPI const char *
+enventor_object_tizen_version_get(Enventor_Object *obj)
+{
+   Enventor_Object_Data *pd = eo_data_scope_get(obj, ENVENTOR_OBJECT_CLASS);
+   if (!pd) return NULL;
+
+   return pd->tizen_version;
+}
+//
+
+#include "enventor_object.eo.c"
diff --git a/src/lib/redoundo.c b/src/lib/redoundo.c
new file mode 100644 (file)
index 0000000..405e89a
--- /dev/null
@@ -0,0 +1,513 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+#define DEFAULT_QUEUE_SIZE 200
+#define INPUT_SPEED 0.8 //how much time need to input one symbol with speed 75sym/min
+
+typedef struct diff_s
+{
+   Eina_Stringshare *text;
+   unsigned int length;
+   unsigned int cursor_pos;
+   Eina_Bool action : 1;   //EINA_TRUE: insert, EINA_FALSE, delete
+   Eina_Bool relative : 1; //If this change relative to prevision or next step
+   Eina_Bool buildable : 1;           //Is this change buildable?
+} diff_data;
+
+struct redoundo_s
+{
+   Evas_Object *entry;
+   Evas_Object *textblock;
+   Enventor_Object *enventor;
+   Evas_Textblock_Cursor *cursor;
+   Eina_List *queue;
+   Eina_List *current_node;
+   diff_data *last_diff;
+   unsigned int queue_max;        //Maximum queuing data count 0: unlimited
+   edit_data *ed;
+   struct {
+      Ecore_Timer *timer;
+      Eina_Bool continues_input;
+      double input_delay;
+   } smart;
+
+   Eina_Bool internal_change : 1; //Entry change by redoundo
+
+};
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+static void
+entry_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+             void *event_info EINA_UNUSED)
+{
+   redoundo_data *rd = data;
+   rd->cursor = NULL;
+}
+
+Eina_Bool
+_input_timer_cb(void *data)
+{
+   redoundo_data *rd = (redoundo_data *)data;
+   rd->smart.timer = NULL;
+   if (!rd->smart.continues_input) return ECORE_CALLBACK_CANCEL;
+   rd->smart.continues_input = EINA_FALSE;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static diff_data *
+smart_analyser(redoundo_data *rd, diff_data *diff)
+{
+   Eina_Bool ret;
+   if (!eo_do_ret(rd->enventor, ret, enventor_obj_smart_undo_redo_get())) return diff;
+
+   if (rd->smart.timer)
+     {
+        ecore_timer_del(rd->smart.timer);
+        rd->smart.timer = NULL;
+     }
+
+   if (!diff) return diff;
+
+   if (diff->length == 1 && eo_do_ret(rd->enventor, ret, enventor_obj_auto_indent_get()))
+     {
+       if (strstr(diff->text, "<br/>")) diff->relative = EINA_TRUE;
+         else diff->relative = EINA_FALSE;
+     }
+
+   // Analyse speed of text input and words separates
+   if ((rd->smart.continues_input) && (!diff->relative) &&
+       (isalpha(diff->text[0])) && (rd->last_diff && (isalpha(rd->last_diff->text[0]))))
+     {
+        diff_data *tmp = diff;
+        const char *text;
+        diff = rd->last_diff;
+        diff->length += tmp->length;
+        text = eina_stringshare_printf("%s%s", diff->text, tmp->text);
+        eina_stringshare_replace(&diff->text, text);
+        eina_stringshare_del(text);
+        rd->last_diff = eina_list_data_get(eina_list_prev(rd->current_node));
+        rd->queue = eina_list_remove_list(rd->queue, rd->current_node);
+        eina_stringshare_del(tmp->text);
+        free(tmp);
+     }
+
+   rd->smart.continues_input = EINA_TRUE;
+   rd->smart.timer = ecore_timer_add(rd->smart.input_delay, _input_timer_cb, rd);
+   return diff;
+}
+
+static void
+untracked_diff_free(redoundo_data *rd)
+{
+   if (!rd->last_diff)
+     {
+        redoundo_clear(rd);
+        return;
+     }
+
+   Eina_List *l;
+   diff_data *diff;
+
+   EINA_LIST_REVERSE_FOREACH(rd->queue, l, diff)
+    {
+       if (diff == rd->last_diff) break;
+       eina_stringshare_del(diff->text);
+       free(diff);
+       rd->queue = eina_list_remove_list(rd->queue, l);
+    }
+}
+
+static void
+entry_changed_user_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                      const char *emission EINA_UNUSED,
+                      const char *source EINA_UNUSED)
+{
+   redoundo_data *rd = data;
+   Edje_Entry_Change_Info *info = edje_object_signal_callback_extra_data_get();
+
+   if (rd->internal_change)
+     {
+         rd->internal_change = EINA_FALSE;
+         return;
+     }
+
+   diff_data *diff = calloc(1, sizeof(diff_data));
+   if (!diff)
+     {
+        mem_fail_msg();
+        return;
+     }
+
+   if ((rd->queue_max) && (eina_list_count(rd->queue) >= rd->queue_max))
+     {
+        diff_data *old = NULL;
+        old = eina_list_data_get(rd->queue);
+        eina_stringshare_del(old->text);
+        free(old);
+        rd->queue = eina_list_remove_list(rd->queue, rd->queue);
+     }
+
+   if (info->insert)
+     {
+        if (info->change.insert.plain_length == 0) goto nochange;
+        diff->text = eina_stringshare_add(info->change.insert.content);
+        diff->length = info->change.insert.plain_length;
+        diff->cursor_pos = info->change.insert.pos;
+        diff->action = EINA_TRUE;
+     }
+   else
+     {
+        int length = (info->change.del.end - info->change.del.start);
+        if (length == 0) goto nochange;
+
+        diff->text = eina_stringshare_add(info->change.del.content);
+        if (length > 0) diff->cursor_pos = info->change.del.start;
+        else diff->cursor_pos = info->change.del.end;
+        diff->length = abs(length);
+        diff->action = EINA_FALSE;
+     }
+   diff = smart_analyser(rd, diff);
+
+   untracked_diff_free(rd);
+   rd->queue = eina_list_append(rd->queue, diff);
+   rd->last_diff = diff;
+   rd->current_node = eina_list_last(rd->queue);
+
+   return;
+
+nochange:
+   free(diff);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+int
+redoundo_undo(redoundo_data *rd, Eina_Bool *changed)
+{
+   if (changed) *changed = EINA_FALSE;
+
+   if (!rd->last_diff)
+     {
+#ifndef _WIN32
+        Eina_Bool saved = edit_save(rd->ed, edit_file_get(rd->ed));
+        if (saved) build_edc();
+#endif
+        return 0;
+     }
+
+   rd->internal_change = EINA_TRUE;
+
+   int lines;
+
+   if (rd->last_diff->action)
+     {
+        //Last change was adding new symbol(s), that mean here need delete it
+        //Undo one character
+        if (rd->last_diff->length == 1)
+          {
+             evas_textblock_cursor_pos_set(rd->cursor,
+                                           rd->last_diff->cursor_pos);
+             evas_textblock_cursor_char_delete(rd->cursor);
+          }
+        //Undo String
+        else
+          {
+             Evas_Textblock_Cursor *cursor =
+                evas_object_textblock_cursor_new( rd->textblock);
+             evas_textblock_cursor_pos_set(rd->cursor,
+                                           rd->last_diff->cursor_pos);
+             evas_textblock_cursor_pos_set(cursor,
+                                           (rd->last_diff->cursor_pos +
+                                            rd->last_diff->length));
+             evas_textblock_cursor_range_delete(rd->cursor, cursor);
+             evas_textblock_cursor_free(cursor);
+          }
+        lines = -parser_line_cnt_get(NULL, rd->last_diff->text);
+        elm_entry_cursor_pos_set(rd->entry, rd->last_diff->cursor_pos);
+     }
+   else
+     {
+        evas_textblock_cursor_pos_set(rd->cursor,
+                                      rd->last_diff->cursor_pos);
+        evas_object_textblock_text_markup_prepend(rd->cursor,
+                                                  rd->last_diff->text);
+
+        lines = parser_line_cnt_get(NULL, rd->last_diff->text);
+        elm_entry_cursor_pos_set(rd->entry,
+                                 (rd->last_diff->cursor_pos + rd->last_diff->length));
+     }
+
+   rd->internal_change = EINA_FALSE;
+   rd->current_node =  eina_list_prev(rd->current_node);
+   rd->last_diff =  eina_list_data_get(rd->current_node);
+
+   if (rd->last_diff && rd->last_diff->relative)
+     lines += redoundo_undo(rd, NULL);
+
+   if (changed)
+     {
+        elm_entry_calc_force(rd->entry);
+        *changed = EINA_TRUE;
+        elm_entry_select_none(rd->entry);
+     }
+
+   if (rd->last_diff && rd->last_diff->buildable)
+     {
+#ifndef _WIN32
+        edit_save(rd->ed, edit_file_get(rd->ed));
+        build_edc();
+#endif
+     }
+
+   return lines;
+}
+
+int
+redoundo_redo(redoundo_data *rd, Eina_Bool *changed)
+{
+   if (changed) *changed = EINA_FALSE;
+
+   if (!rd->queue) return 0;
+
+   Eina_List *next;
+   diff_data *diff;
+   int lines;
+
+   next = eina_list_next(rd->current_node);
+   diff = eina_list_data_get(next);
+
+   if ((!next) && (!rd->last_diff))
+     {
+        next = rd->queue;
+        diff = eina_list_data_get(next);
+     }
+
+   if (!next || !diff)
+     {
+        rd->internal_change = EINA_FALSE;
+        return 0;
+     }
+
+   rd->internal_change = EINA_TRUE;
+
+   //Insert
+   if (diff->action)
+     {
+        evas_textblock_cursor_pos_set(rd->cursor,  diff->cursor_pos);
+        evas_object_textblock_text_markup_prepend(rd->cursor, diff->text);
+
+        lines = parser_line_cnt_get(NULL, diff->text);
+        elm_entry_cursor_pos_set(rd->entry, (diff->cursor_pos + diff->length));
+     }
+   //Remove
+   else
+     {
+        //One Character
+        if (diff->length == 1)
+          {
+             evas_textblock_cursor_pos_set(rd->cursor, diff->cursor_pos);
+             evas_textblock_cursor_char_delete(rd->cursor);
+          }
+        //String
+        else
+          {
+             Evas_Textblock_Cursor *cursor =
+                evas_object_textblock_cursor_new(rd->textblock);
+             evas_textblock_cursor_pos_set(rd->cursor, diff->cursor_pos);
+             evas_textblock_cursor_pos_set(cursor,
+                                           (diff->cursor_pos + diff->length));
+             evas_textblock_cursor_range_delete(rd->cursor, cursor);
+             evas_textblock_cursor_free(cursor);
+          }
+        lines = -parser_line_cnt_get(NULL, diff->text);
+        elm_entry_cursor_pos_set(rd->entry, diff->cursor_pos);
+     }
+
+   rd->internal_change = EINA_FALSE;
+
+   rd->last_diff = diff;
+   rd->current_node = next;
+
+   if (diff->relative)
+     lines += redoundo_redo(rd, NULL);
+
+   if (changed)
+     {
+        elm_entry_calc_force(rd->entry);
+        *changed = EINA_TRUE;
+        elm_entry_select_none(rd->entry);
+     }
+
+   if (rd->last_diff && rd->last_diff->buildable)
+     {
+#ifndef _WIN32
+        edit_save(rd->ed, edit_file_get(rd->ed));
+        build_edc();
+#endif
+     }
+
+   return lines;
+}
+
+void
+redoundo_text_push(redoundo_data *rd, const char *text, int pos, int length,
+                   Eina_Bool insert)
+{
+   if (!text) return;
+
+   diff_data *diff = calloc(1, sizeof(diff_data));
+   if (!diff)
+     {
+        mem_fail_msg();
+        return;
+     }
+
+   if (length) diff->length = length;
+   else
+     {
+        char *utf8 = evas_textblock_text_markup_to_utf8(NULL, text);
+        diff->length = strlen(utf8);
+        free(utf8);
+        if (!diff->length)
+          {
+             free(diff);
+             return;
+          }
+     }
+
+   diff->text = eina_stringshare_add(text);
+   diff->cursor_pos = pos;
+   diff->action = insert;
+   diff->relative = EINA_FALSE;
+
+   diff = smart_analyser(rd, diff);
+   rd->smart.continues_input = EINA_FALSE;
+
+   untracked_diff_free(rd);
+   rd->queue = eina_list_append(rd->queue, diff);
+   rd->last_diff = diff;
+   rd->current_node = eina_list_last(rd->queue);
+}
+
+redoundo_data *
+redoundo_init(edit_data *ed, Enventor_Object *enventor)
+{
+   Evas_Object *entry = edit_entry_get(ed);
+   if (!entry)
+     {
+        EINA_LOG_ERR("Should be initialized after edit entry is initialized!");
+        return NULL;
+     }
+
+   redoundo_data *rd = calloc(1, sizeof(redoundo_data));
+   if (!rd)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+
+   rd->entry = entry;
+   rd->enventor = enventor;
+   rd->textblock = elm_entry_textblock_get(entry);
+   rd->cursor = evas_object_textblock_cursor_new(rd->textblock);
+   rd->queue_max = DEFAULT_QUEUE_SIZE;
+   rd->smart.input_delay = INPUT_SPEED;
+   rd->ed = ed;
+
+   //FIXME: Why signal callback? not smart callback?
+   elm_object_signal_callback_add(rd->entry, "entry,changed,user", "*",
+                                  entry_changed_user_cb, rd);
+   evas_object_event_callback_add(entry, EVAS_CALLBACK_DEL,
+                                  entry_del_cb, rd);
+   return rd;
+}
+
+void
+redoundo_clear(redoundo_data *rd)
+{
+   diff_data *data;
+
+   EINA_LIST_FREE(rd->queue, data)
+     {
+        eina_stringshare_del(data->text);
+        free(data);
+     }
+   rd->internal_change = EINA_FALSE;
+   ecore_timer_del(rd->smart.timer);
+   rd->smart.timer = NULL;
+}
+
+void
+redoundo_term(redoundo_data *rd)
+{
+   redoundo_clear(rd);
+   evas_textblock_cursor_free(rd->cursor);
+   free(rd);
+}
+
+void
+redoundo_entry_region_push(redoundo_data *rd, int cursor_pos, int cursor_pos2)
+{
+   elm_entry_select_region_set(rd->entry,  cursor_pos, cursor_pos2);
+   redoundo_text_push(rd, elm_entry_selection_get(rd->entry), cursor_pos,
+                      (cursor_pos2 - cursor_pos), EINA_TRUE);
+   elm_entry_select_none(rd->entry);
+}
+
+void
+redoundo_text_relative_push(redoundo_data *rd, const char *text)
+{
+   if (!text) return;
+
+   diff_data *diff = malloc(sizeof(diff_data));
+   if (!diff)
+     {
+        mem_fail_msg();
+        return;
+     }
+
+   diff->text = eina_stringshare_add(text);
+   char *utf8 = evas_textblock_text_markup_to_utf8(NULL, diff->text);
+   diff->length = strlen(utf8);
+   diff->cursor_pos = elm_entry_cursor_pos_get(rd->entry);
+   diff->action = EINA_TRUE;
+   diff->relative = EINA_TRUE;
+
+   untracked_diff_free(rd);
+
+   rd->queue = eina_list_append(rd->queue, diff);
+   rd->last_diff = diff;
+   rd->current_node = eina_list_last(rd->queue);
+
+   free(utf8);
+}
+
+void
+redoundo_n_diff_cancel(redoundo_data *rd, unsigned int n)
+{
+   if (!rd || !rd->queue || !n) return;
+
+   unsigned int i;
+   for (i = 0; i < n && rd->current_node; i++)
+     rd->current_node = eina_list_prev(rd->current_node);
+   rd->last_diff = (diff_data *)eina_list_data_get(rd->current_node);
+   untracked_diff_free(rd);
+}
+
+void
+redoundo_diff_buildable(redoundo_data *rd, Eina_Bool buildable)
+{
+   if (!rd || !rd->queue || !rd->last_diff)
+     return;
+
+   rd->last_diff->buildable = buildable;
+}
+
diff --git a/src/lib/reference.c b/src/lib/reference.c
new file mode 100644 (file)
index 0000000..b07181d
--- /dev/null
@@ -0,0 +1,922 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+/* This is a node for a list structure.
+   Each node has its parent name list. */
+typedef struct keyword_s
+{
+   char *name;
+   char *desc;
+   Eina_List *children_list; //Children keyword data list
+   int ref_cnt;              //Reference count
+} keyword_data;
+
+typedef struct ref_s
+{
+   Eina_File *source_file;
+
+   keyword_data *keyword_root; //Root node of keyword data tree
+
+   char *keyword_name;
+   char *keyword_desc;
+
+   edit_data *ed;
+   Evas_Object *event_rect;
+   Evas_Object *layout;
+} ref_data;
+
+typedef struct inherit_s
+{
+   keyword_data *derived_keyword; //Derived keyword
+   char *base_keyword_full_name;  //Base keyword's name (e.g. collections.group)
+} inherit_data;
+
+static ref_data *g_rd = NULL;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void keyword_data_free(keyword_data *keyword);
+static void ref_event_rect_delete(void);
+static void ref_layout_delete(void);
+
+static void
+keyword_data_free(keyword_data *keyword)
+{
+   if (!keyword) return;
+
+   keyword->ref_cnt--;
+   if (keyword->ref_cnt > 0) return;
+
+   if (keyword->name)
+     free(keyword->name);
+   if (keyword->desc)
+     free(keyword->desc);
+
+   keyword_data *child_keyword;
+   EINA_LIST_FREE(keyword->children_list, child_keyword)
+     {
+        keyword_data_free(child_keyword);
+     }
+
+   free(keyword);
+}
+
+static char *
+cursor_keyword_name_find(Evas_Object *entry)
+{
+   Evas_Object *tb = NULL;
+   Evas_Textblock_Cursor *cur_orig = NULL;
+   Evas_Textblock_Cursor *cur_begin = NULL;
+   Evas_Textblock_Cursor *cur_end = NULL;
+   int cur_orig_pos = 0;
+   int cur_begin_pos = 0;
+   char *cur_orig_ptr = NULL;
+   char *cur_begin_ptr = NULL;
+   char *cur_end_ptr = NULL;
+   char *cur_text = NULL;
+   char *keyword_name = NULL;
+
+   tb = elm_entry_textblock_get(entry);
+   cur_orig = evas_object_textblock_cursor_get(tb);
+   if (!cur_orig) return NULL;
+
+   //Show keyword reference only if cursor is located in a correct keyword.
+   cur_text = evas_textblock_cursor_content_get(cur_orig);
+   if (!cur_text || (!isalnum(*cur_text) && (*cur_text != '_'))) goto end;
+   free(cur_text);
+   cur_text = NULL;
+   cur_orig_pos = evas_textblock_cursor_pos_get(cur_orig);
+
+   //Find beginning cursor position of the keyword.
+   cur_begin = evas_object_textblock_cursor_new(tb);
+   if (!cur_begin) goto end;
+
+   evas_textblock_cursor_pos_set(cur_begin, cur_orig_pos);
+   if (!evas_textblock_cursor_word_start(cur_begin)) goto end;
+
+   //Find ending cursor position of the keyword.
+   cur_end = evas_object_textblock_cursor_new(tb);
+   if (!cur_end) goto end;
+
+   evas_textblock_cursor_pos_set(cur_end, cur_orig_pos);
+   if (!evas_textblock_cursor_word_end(cur_end)) goto end;
+
+   /* Move ending cursor by one character because cursor_range_text_get does
+      not include character of ending cursor. */
+   evas_textblock_cursor_char_next(cur_end);
+   cur_text = evas_textblock_cursor_range_text_get(cur_begin, cur_end,
+                                                   EVAS_TEXTBLOCK_TEXT_PLAIN);
+   if (!cur_text) goto end;
+
+   //Need to check if cursor text contains special character such as '.'.
+   cur_begin_pos = evas_textblock_cursor_pos_get(cur_begin);
+   cur_orig_ptr = cur_text + (cur_orig_pos - cur_begin_pos);
+
+   //Find valid keyword beginning position from cursor text.
+   char *cur_ptr = cur_orig_ptr;
+   while (cur_ptr >= cur_text)
+     {
+        if (isalnum(*cur_ptr) || (*cur_ptr == '_'))
+          cur_begin_ptr = cur_ptr;
+        else
+          break;
+
+        cur_ptr--;
+     }
+
+   //Find valid keyword ending position from cursor text.
+   cur_ptr = cur_orig_ptr;
+   char *cur_text_end = cur_text + strlen(cur_text) - 1;
+   while (cur_ptr <= cur_text_end)
+     {
+        if (isalnum(*cur_ptr) || (*cur_ptr == '_'))
+          cur_end_ptr = cur_ptr;
+        else
+          break;
+
+        cur_ptr++;
+     }
+
+   keyword_name = strndup(cur_begin_ptr, (cur_end_ptr - cur_begin_ptr + 1));
+
+end:
+   if (cur_begin) evas_textblock_cursor_free(cur_begin);
+   if (cur_end) evas_textblock_cursor_free(cur_end);
+   if (cur_text) free(cur_text);
+
+   return keyword_name;
+}
+
+/* Find keyword hierarchy in the given text and keyword name.
+   (e.g. Keyword hierarchy of "parts" is collections -> group -> parts)
+   Return keyword name list (e.g. collections -> group -> parts). */
+static Eina_List *
+keyword_hierarchy_find(const char *text, const char *keyword_name)
+{
+   ref_data *rd = g_rd;
+   if (!rd) return NULL;
+   if (!rd->ed) return NULL;
+
+   if (!text) return NULL;
+   if (!keyword_name) return NULL;
+
+   Eina_List *keyword_hierarchy = eina_list_append(NULL, strdup(keyword_name));
+
+   //Check from the end of the text.
+   char *ptr = (char *)(text + ((strlen(text) - 1) * sizeof(char)));
+   int height = 0;
+   int next_height = height + 1;
+
+   const char *parent_begin = NULL;
+   const char *parent_end = NULL;
+
+   //Check if dot('.') grammar is valid to identify parent keyword.
+   Eina_Bool dot_grammar_valid = EINA_TRUE;
+
+   while (text <= ptr)
+     {
+        if ((*ptr == '{') || (dot_grammar_valid && (*ptr == '.')))
+          {
+             if (dot_grammar_valid)
+               dot_grammar_valid = EINA_FALSE;
+
+             height++;
+             if (height == next_height)
+               {
+                  ptr--;
+                  if (text > ptr) break;
+
+                  parent_begin = NULL;
+                  parent_end = NULL;
+                  while (text <= ptr)
+                    {
+                       if (isspace(*ptr))
+                         {
+                            if (parent_end)
+                              {
+                                 parent_begin = ptr + 1;
+                                 break;
+                              }
+                         }
+                       else
+                         {
+                            if (!parent_end)
+                              parent_end = ptr;
+                         }
+                       ptr--;
+                    }
+                  if (!parent_end)
+                    continue;
+
+                  if (parent_end && !parent_begin)
+                    parent_begin = text;
+
+                  char *parent_name = strndup(parent_begin,
+                                              (parent_end - parent_begin + 1));
+                  keyword_hierarchy = eina_list_prepend(keyword_hierarchy,
+                                                        parent_name);
+                  next_height++;
+               }
+          }
+        else if (*ptr == '}')
+          {
+             if (dot_grammar_valid)
+               dot_grammar_valid = EINA_FALSE;
+
+             height--;
+          }
+        else if (dot_grammar_valid && !isalnum(*ptr))
+          {
+             dot_grammar_valid = EINA_FALSE;
+          }
+        ptr--;
+     }
+
+   //In case of sub items, it won't contain "collections".
+   //We added it arbitrary.
+   if (!edit_is_main_file(rd->ed))
+     {
+        keyword_hierarchy = eina_list_prepend(keyword_hierarchy,
+                                              strdup("collections"));
+     }
+
+   return keyword_hierarchy;
+}
+
+static keyword_data *
+keyword_data_find_internal(Eina_List *keyword_list, const char *keyword_name)
+{
+   if (!keyword_list) return NULL;
+   if (!keyword_name) return NULL;
+
+   Eina_List *l = NULL;
+   keyword_data *keyword = NULL;
+
+   EINA_LIST_FOREACH(keyword_list, l, keyword)
+     {
+        if (!strcmp(keyword->name, keyword_name))
+          return keyword;
+     }
+
+   return NULL;
+}
+
+/* Find keyword which has the given keyword hierarchy.
+   (e.g. Find "group" keyword which has keyword hierarchy, collections -> group)
+ */
+static keyword_data *
+keyword_data_find(keyword_data *keyword_root, Eina_List *keyword_hierarchy)
+{
+   if (!keyword_root) return NULL;
+   if (!keyword_hierarchy) return NULL;
+
+   Eina_List *l = NULL;
+   char *keyword_name = NULL;
+   keyword_data *keyword = keyword_root;
+   keyword_data *found_keyword = NULL;
+
+   EINA_LIST_FOREACH(keyword_hierarchy, l, keyword_name)
+     {
+        keyword = keyword_data_find_internal(keyword->children_list,
+                                             keyword_name);
+        found_keyword = keyword;
+        if (!keyword) break;
+     }
+
+   return found_keyword;
+}
+
+static keyword_data *
+cursor_keyword_data_find(Evas_Object *entry, keyword_data *keyword_root,
+                         const char *keyword_name)
+{
+   keyword_data *found_keyword = NULL;
+
+   if (!entry) return NULL;
+   if (!keyword_root) return NULL;
+   if (!keyword_name) return NULL;
+
+   //Get text before cursor position.
+   Evas_Object *tb = elm_entry_textblock_get(entry);
+   Evas_Textblock_Cursor *cur_begin = evas_object_textblock_cursor_new(tb);
+   Evas_Textblock_Cursor *cur_end = evas_object_textblock_cursor_get(tb);
+   char *utf8_text = NULL;
+   Eina_List *keyword_hierarchy = NULL;
+
+   /* FIXME: Getting text from range with EVAS_TEXTBLOCK_TEXT_PLAIN generates
+      garbage characters.
+      So please use EVAS_TEXTBLOCK_TEXT_PLAIN after the bug is fixed. */
+   char *markup_text =
+      evas_textblock_cursor_range_text_get(cur_begin, cur_end,
+                                           EVAS_TEXTBLOCK_TEXT_MARKUP);
+   if (!markup_text) goto end;
+
+   utf8_text = evas_textblock_text_markup_to_utf8(NULL, markup_text);
+   free(markup_text);
+   markup_text = NULL;
+
+   //Find keyword hierarchy of the selected keyword in text.
+   keyword_hierarchy = keyword_hierarchy_find((const char *)utf8_text,
+                                              keyword_name);
+
+   found_keyword = keyword_data_find(keyword_root, keyword_hierarchy);
+
+end:
+   if (cur_begin) evas_textblock_cursor_free(cur_begin);
+   if (utf8_text) free(utf8_text);
+
+   char *keyword_hierarchy_name = NULL;
+   EINA_LIST_FREE(keyword_hierarchy, keyword_hierarchy_name)
+     {
+        free(keyword_hierarchy_name);
+     }
+
+   return found_keyword;
+}
+
+/* Parse keyword's full name into keyword name list.
+   (e.g. collections.group.parts is parsed into collections -> group -> parts)
+   Return keyword name list. */
+static Eina_List *
+keyword_full_name_parse(const char *keyword_full_name)
+{
+   if (!keyword_full_name) return NULL;
+
+   Eina_List *keyword_hierarchy = NULL;
+
+   int len = strlen(keyword_full_name);
+   char *keyword_name = NULL;
+   char *keyword_begin = (char *)keyword_full_name;
+   char *keyword_end = (char *)keyword_full_name + len;
+   char *dot = strstr(keyword_full_name, ".");
+   while (dot)
+     {
+        keyword_name = strndup(keyword_begin, (dot - keyword_begin));
+        keyword_hierarchy = eina_list_append(keyword_hierarchy, keyword_name);
+
+        keyword_begin = dot + 1; //Move pointer after ".".
+        if (keyword_begin >= keyword_end)
+          break;
+
+        dot = strstr(keyword_begin, ".");
+     }
+
+   keyword_hierarchy =
+      eina_list_append(keyword_hierarchy,
+                       strndup(keyword_begin, (keyword_end - keyword_begin)));
+
+   return keyword_hierarchy;
+}
+
+/* Find base keyword's full name for keyword inheritance.
+   inherit_end indicates the ending position of #inherit expression.
+   Return base keyword's full name. (e.g. collections.group.parts.part) */
+static char *
+inherit_find(const char *text_begin, const char *text_end, char **inherit_end)
+{
+   if (!text_begin) return NULL;
+   if (!text_end) return NULL;
+
+   char *base_keyword_full_name = NULL;
+   char *base_keyword_begin = NULL;
+   char *base_keyword_end = NULL;
+
+   base_keyword_begin = strstr(text_begin, "#inherit \"");
+   if (!base_keyword_begin || (base_keyword_begin > text_end))
+     return NULL;
+
+   base_keyword_begin += 10; //Move pointer after "\"".
+
+   base_keyword_end = strstr(base_keyword_begin, "\";");
+   if (!base_keyword_end || (base_keyword_end > text_end))
+     return NULL;
+
+   base_keyword_end--;
+
+   base_keyword_full_name =
+      strndup((const char *)base_keyword_begin,
+              (base_keyword_end - base_keyword_begin + 1));
+
+   //Indicates the ending position of #inherit expression.
+   *inherit_end = base_keyword_end + 3; //Move pointer after "\";".
+
+   return base_keyword_full_name;
+}
+
+static void
+keyword_tree_load_internal(keyword_data *keyword_root, char **ptr,
+                           Eina_List **inherit_list)
+{
+   if (!keyword_root) return;
+   if (!*ptr) return;
+   if (!inherit_list) return;
+
+   int len = strlen(*ptr);
+   const char *text_end = *ptr + len;
+
+   while (*ptr < text_end)
+     {
+        keyword_data *keyword = NULL;
+        char *keyword_name = NULL;
+        char *keyword_desc = NULL;
+        char *block_begin = NULL;
+        char *block_end = NULL;
+
+        //Find beginning position of keyword block to check pointer.
+        block_begin = strstr(*ptr, "{");
+        if (!block_begin) break;
+
+        //Find ending position of keyword block to check pointer.
+        block_end = strstr(*ptr, "}");
+        if (!block_end) break;
+
+        if (block_begin > block_end) break;
+
+        //Find keyword name.
+        char *keyword_name_begin = NULL;
+        char *keyword_name_end = NULL;
+
+        for ( ; *ptr < block_begin; (*ptr)++)
+          {
+             if (!isspace(**ptr))
+               {
+                  if (!keyword_name_begin)
+                    {
+                       keyword_name_begin = *ptr;
+                       keyword_name_end = *ptr;
+                    }
+                  else
+                    keyword_name_end = *ptr;
+               }
+          }
+        if (!keyword_name_begin || !keyword_name_end) break;
+
+        keyword_name = strndup(keyword_name_begin,
+                               (keyword_name_end - keyword_name_begin + 1));
+        if (!keyword_name) break;
+        (*ptr)++; //Move pointer after "{".
+
+        //Find keyword description.
+        char *keyword_desc_begin = NULL;
+        char *keyword_desc_end = NULL;
+
+        keyword_desc_begin = strstr(*ptr, "\"");
+        if (!keyword_desc_begin)
+          {
+             free(keyword_name);
+             break;
+          }
+        keyword_desc_begin++;
+
+        keyword_desc_end = strstr(keyword_desc_begin, "\";");
+        if (!keyword_desc_end)
+          {
+             free(keyword_name);
+             break;
+          }
+        keyword_desc_end--;
+
+        keyword_desc =
+           strndup((const char *)keyword_desc_begin,
+                   (keyword_desc_end - keyword_desc_begin + 1));
+
+        if (!keyword_desc)
+          {
+             free(keyword_name);
+             break;
+          }
+        *ptr = keyword_desc_end + 3; //Move pointer after "\";".
+
+        //Create a new keyword data and Append it to children list.
+        keyword = calloc(1, sizeof(keyword_data));
+        keyword->name = keyword_name;
+        keyword->desc = keyword_desc;
+        keyword->ref_cnt = 1;
+
+        //Find the next block regardless of the block type (i.e. "{" or "}").
+        char *next_block = strstr(*ptr, "{");
+        if (!next_block || (next_block > block_end))
+          next_block = block_end;
+
+        //Find #inherit expression for keyword inheritance.
+        inherit_data *inherit = NULL;
+        char *base_keyword_full_name = NULL;
+        char *inherit_end = NULL;
+
+        base_keyword_full_name = inherit_find(*ptr, next_block, &inherit_end);
+        if (base_keyword_full_name)
+          {
+             inherit = calloc(1, sizeof(inherit_data));
+             inherit->derived_keyword = keyword;
+             inherit->base_keyword_full_name = base_keyword_full_name;
+
+             *inherit_list = eina_list_append(*inherit_list, inherit);
+
+             *ptr = inherit_end;
+          }
+
+        //Set child keyword node recursively.
+        keyword_tree_load_internal(keyword, ptr, inherit_list);
+
+        //Find ending position of keyword block to update pointer.
+        block_end = strstr(*ptr, "}");
+        if (!block_end)
+          {
+             if (inherit)
+               {
+                  *inherit_list = eina_list_remove(*inherit_list, inherit);
+                  free(inherit->base_keyword_full_name);
+                  free(inherit);
+               }
+             keyword_data_free(keyword);
+             break;
+          }
+        *ptr = block_end + 1; //Move pointer after "}".
+
+        keyword_root->children_list =
+           eina_list_append(keyword_root->children_list, keyword);
+     }
+}
+
+/* Load keywords' names and descriptions into a tree structure. */
+static void
+keyword_tree_load(keyword_data *keyword_root, char **ptr)
+{
+   if (!keyword_root) return;
+   if (!*ptr) return;
+
+   Eina_List *inherit_list = NULL;
+   inherit_data *inherit = NULL;
+
+   //Load keywords' names and descriptions.
+   keyword_tree_load_internal(keyword_root, ptr, &inherit_list);
+
+   //Update keywords' children lists based on keyword inheritance.
+   EINA_LIST_FREE(inherit_list, inherit)
+     {
+        Eina_List *keyword_hierarchy = NULL;
+        keyword_data *base_keyword = NULL;
+
+        keyword_hierarchy =
+           keyword_full_name_parse(inherit->base_keyword_full_name);
+
+        /* Copy base child keyword to derive child keyword if it is not
+           overriding keyword. */
+        base_keyword = keyword_data_find(keyword_root, keyword_hierarchy);
+        if (base_keyword && (base_keyword->children_list))
+          {
+             Eina_List **derived_children_list = NULL;
+             Eina_List **base_children_list = NULL;
+             Eina_List *l = NULL;
+             keyword_data *base_child_keyword = NULL;
+
+             derived_children_list = &(inherit->derived_keyword->children_list);
+             base_children_list = &(base_keyword->children_list);
+
+             EINA_LIST_FOREACH(*base_children_list, l, base_child_keyword)
+               {
+                  keyword_data *overriding_keyword =
+                     keyword_data_find_internal(*derived_children_list,
+                                                base_child_keyword->name);
+                  if (!overriding_keyword)
+                    {
+                       *derived_children_list =
+                          eina_list_append(*derived_children_list,
+                                           base_child_keyword);
+
+                       base_child_keyword->ref_cnt++;
+                    }
+               }
+          }
+
+        char *keyword_hierarchy_name = NULL;
+        EINA_LIST_FREE(keyword_hierarchy, keyword_hierarchy_name)
+          {
+             free(keyword_hierarchy_name);
+          }
+        free(inherit->base_keyword_full_name);
+        free(inherit);
+     }
+}
+
+static void
+ref_load(ref_data *rd)
+{
+   if (!rd) return;
+
+   char buf[PATH_MAX];
+   snprintf(buf, sizeof(buf), "%s/reference/reference.src",
+            eina_prefix_data_get(PREFIX));
+
+   //Open source file.
+   rd->source_file = eina_file_open((const char *)buf, EINA_FALSE);
+   if (!rd->source_file) return;
+
+   //Load text from source file.
+   char *text = (char *)eina_file_map_all(rd->source_file, EINA_FILE_POPULATE);
+   if (!text) goto end;
+
+   if (rd->keyword_root)
+     {
+        keyword_data_free(rd->keyword_root);
+        rd->keyword_root = NULL;
+     }
+
+   //Create keyword root node.
+   keyword_data *keyword_root = calloc(1, sizeof(keyword_data));
+   keyword_root->name = NULL;
+   keyword_root->desc = NULL;
+   keyword_root->ref_cnt = 1;
+
+   char *ptr = text;
+   //Load keyword data tree from text.
+   keyword_tree_load(keyword_root, &ptr);
+   rd->keyword_root = keyword_root;
+
+end:
+   if (text) eina_file_map_free(rd->source_file, text);
+
+   eina_file_close(rd->source_file);
+   rd->source_file = NULL;
+}
+
+static void
+event_rect_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+                         Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   ref_event_rect_delete();
+   ref_layout_delete();
+}
+
+static void
+entry_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                   void *event_info EINA_UNUSED)
+{
+   ref_event_rect_delete();
+   ref_layout_delete();
+}
+
+static void
+entry_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+              Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   ref_event_rect_delete();
+   ref_layout_delete();
+}
+
+static void
+entry_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                 void *event_info EINA_UNUSED)
+{
+   ref_event_rect_delete();
+   ref_layout_delete();
+}
+
+static void
+entry_changed_user_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+   ref_event_rect_delete();
+   ref_layout_delete();
+}
+
+static void
+entry_cursor_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                        void *event_info EINA_UNUSED)
+{
+   ref_event_rect_delete();
+   ref_layout_delete();
+}
+
+static void
+entry_cursor_changed_manual_cb(void *data EINA_UNUSED,
+                               Evas_Object *obj EINA_UNUSED,
+                               void *event_info EINA_UNUSED)
+{
+   ref_event_rect_delete();
+   ref_layout_delete();
+}
+
+static void
+ref_event_rect_delete(void)
+{
+   ref_data *rd = g_rd;
+   if (!rd) return;
+
+   if (!rd->event_rect) return;
+   evas_object_del(rd->event_rect);
+   rd->event_rect = NULL;
+}
+
+static void
+ref_layout_delete(void)
+{
+   ref_data *rd = g_rd;
+   if (!rd) return;
+
+   if (!rd->layout) return;
+   evas_object_del(rd->layout);
+   rd->layout = NULL;
+
+   if (!rd->ed) return;
+   //Delete entry callbacks to delete reference layout.
+   Evas_Object *edit_entry = edit_entry_get(rd->ed);
+   evas_object_event_callback_del(edit_entry, EVAS_CALLBACK_MOVE,
+                                  entry_move_cb);
+   evas_object_smart_callback_del(edit_entry, "unfocused", entry_unfocused_cb);
+   evas_object_smart_callback_del(edit_entry, "changed", entry_changed_cb);
+   evas_object_smart_callback_del(edit_entry, "changed,user",
+                                  entry_changed_user_cb);
+   evas_object_smart_callback_del(edit_entry, "cursor,changed",
+                                  entry_cursor_changed_cb);
+   evas_object_smart_callback_del(edit_entry, "cursor,changed,manual",
+                                  entry_cursor_changed_manual_cb);
+}
+
+static Evas_Object *
+ref_event_rect_create(Evas_Object *edit_obj)
+{
+   if (!edit_obj) return NULL;
+
+   //event_rect catches mouse down event, which delete reference layout.
+   Evas_Object *win = elm_object_top_widget_get(edit_obj);
+   Evas *e = evas_object_evas_get(win);
+   Evas_Object *rect = evas_object_rectangle_add(e);
+   evas_object_repeat_events_set(rect, EINA_TRUE);
+   evas_object_color_set(rect, 0, 0, 0, 0);
+
+   evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_DOWN,
+                                  event_rect_mouse_down_cb, NULL);
+   evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, rect);
+   evas_object_show(rect);
+
+   return rect;
+}
+
+static Evas_Object *
+ref_layout_create(Evas_Object *edit_entry, const char *desc)
+{
+   if (!edit_entry) return NULL;
+   if (!desc) return NULL;
+
+   Evas_Object *layout = elm_layout_add(edit_entry);
+   if (!layout)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return NULL;
+     }
+   elm_layout_file_set(layout, EDJE_PATH, "reference_layout");
+
+   //Do not apply edit entry's font scale to reference layout.
+   elm_object_scale_set(layout, 1.0);
+
+   Evas_Object *entry = elm_entry_add(layout);
+   elm_object_style_set(entry, "enventor");
+   elm_entry_editable_set(entry, EINA_FALSE);
+   elm_entry_scrollable_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);
+   elm_entry_entry_set(entry, desc);
+
+   elm_object_part_content_set(layout, "elm.swallow.content", entry);
+   evas_object_show(layout);
+
+   //Add entry callbacks to delete reference layout.
+   evas_object_event_callback_add(edit_entry, EVAS_CALLBACK_MOVE, entry_move_cb,
+                                  NULL);
+   evas_object_smart_callback_add(edit_entry, "unfocused", entry_unfocused_cb,
+                                  NULL);
+   evas_object_smart_callback_add(edit_entry, "changed", entry_changed_cb,
+                                  NULL);
+   evas_object_smart_callback_add(edit_entry, "changed,user",
+                                  entry_changed_user_cb, NULL);
+   evas_object_smart_callback_add(edit_entry, "cursor,changed",
+                                  entry_cursor_changed_cb, NULL);
+   evas_object_smart_callback_add(edit_entry, "cursor,changed,manual",
+                                  entry_cursor_changed_manual_cb, NULL);
+
+   return layout;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+ref_show(edit_data *ed)
+{
+   ref_data *rd = g_rd;
+   Evas_Object *edit_obj = NULL;
+   Evas_Object *edit_entry = NULL;
+
+   if (!rd) return;
+   if (!ed) return;
+   rd->ed = ed;
+
+   //Return if reference layout is already shown.
+   if (rd->event_rect || rd->layout) return;
+
+   edit_obj = edit_obj_get(ed);
+   edit_entry = edit_entry_get(ed);
+
+   //Set keyword name.
+   if (rd->keyword_name) free(rd->keyword_name);
+   rd->keyword_name = cursor_keyword_name_find(edit_entry);
+   if (!rd->keyword_name) return;
+
+   //Set keyword desc.
+   if (rd->keyword_desc)
+     {
+        free(rd->keyword_desc);
+        rd->keyword_desc = NULL;
+     }
+   keyword_data *keyword = cursor_keyword_data_find(edit_entry,
+                                                    rd->keyword_root,
+                                                    rd->keyword_name);
+   if (keyword)
+     rd->keyword_desc = strdup(keyword->desc);
+   if (!rd->keyword_desc) return;
+
+   //Create event rect which catches mouse down event.
+   rd->event_rect = ref_event_rect_create(edit_obj);
+
+   //Create reference layout.
+   rd->layout = ref_layout_create(edit_entry, rd->keyword_desc);
+
+   //Calculate reference layout position.
+   Evas_Coord obj_x, obj_y, obj_w, obj_h;
+   evas_object_geometry_get(edit_obj, &obj_x, &obj_y, &obj_w, &obj_h);
+
+   Evas_Coord entry_x, entry_y;
+   evas_object_geometry_get(edit_entry, &entry_x, &entry_y, NULL, NULL);
+
+   Evas_Coord cur_x, cur_y, cur_h;
+   elm_entry_cursor_geometry_get(edit_entry, &cur_x, &cur_y, NULL, &cur_h);
+
+   char *layout_width =
+      (char *)edje_object_data_get(elm_layout_edje_get(rd->layout), "width");
+   char *layout_height =
+      (char *)edje_object_data_get(elm_layout_edje_get(rd->layout), "height");
+   if (!layout_width || !layout_height) return;
+
+   const Evas_Coord ref_w = ELM_SCALE_SIZE(atoi(layout_width));
+   const Evas_Coord ref_h = ELM_SCALE_SIZE(atoi(layout_height));
+   Evas_Coord ref_x = 0;
+   Evas_Coord ref_y = 0;
+
+   //The center of reference layout is the entry cursor position.
+   if (cur_x < (ref_w / 2))
+     ref_x = obj_x;
+   else if ((obj_w - (entry_x - obj_x + cur_x)) < (ref_w / 2))
+     ref_x = obj_x + obj_w - ref_w;
+   else
+     ref_x = entry_x + cur_x - (ref_w / 2);
+
+   if (((obj_y + obj_h) - (entry_y + cur_y + cur_h)) < ref_h)
+     ref_y = entry_y + cur_y - ref_h;
+   else
+     ref_y = entry_y + cur_y + cur_h;
+
+   evas_object_move(rd->layout, ref_x, ref_y);
+}
+
+void
+ref_init(void)
+{
+   ref_data *rd = calloc(1, sizeof(ref_data));
+   if (!rd)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return;
+     }
+
+   ref_load(rd);
+
+   g_rd = rd;
+}
+
+void
+ref_term(void)
+{
+   ref_data *rd = g_rd;
+
+   keyword_data_free(rd->keyword_root);
+
+   if (rd->keyword_name) free(rd->keyword_name);
+   if (rd->keyword_desc) free(rd->keyword_desc);
+
+   ref_event_rect_delete();
+   ref_layout_delete();
+
+   free(rd);
+   g_rd = NULL;
+}
diff --git a/src/lib/syntax_color.c b/src/lib/syntax_color.c
new file mode 100644 (file)
index 0000000..8b624ad
--- /dev/null
@@ -0,0 +1,1014 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+#define MAX_COL_NUM 6
+
+typedef struct color_tuple
+{
+   Eina_Stringshare *key;
+   Eina_Stringshare *col;
+} color_tuple;
+
+typedef struct color
+{
+   char *val;
+   Eina_List *keys;
+} color;
+
+typedef struct syntax_color_group
+{
+   char *string;
+   char *comment;
+   char *macro;
+   char *count;
+   color colors[MAX_COL_NUM];
+} syntax_color_group;
+
+typedef struct syntax_color_source
+{
+   Eina_Hash *color_hash;
+   Eina_Stringshare *col_string;
+   Eina_Stringshare *col_comment;
+   Eina_Stringshare *col_macro;
+   Eina_Stringshare *cols[MAX_COL_NUM];
+   int color_cnt;
+
+} syntax_color_source;
+
+struct syntax_color_s
+{
+   Eina_Strbuf *strbuf;
+   Eina_Strbuf *cachebuf;
+   Eina_List *macros;
+   syntax_color_source *col_src;
+};
+
+typedef struct color_hash_foreach_data
+{
+   Eina_Stringshare *cur_col;
+   Eina_Stringshare *new_col;
+} color_hash_foreach_data;
+
+static Eet_Data_Descriptor *edd_scg = NULL;
+static Eet_Data_Descriptor *edd_color = NULL;
+static syntax_color_group *scg = NULL;
+
+//We could share this color source through editor instances.
+static syntax_color_source g_color_src;
+static int init_count = 0;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+hash_free_cb(void *data)
+{
+   Eina_Inarray *inarray = data;
+   color_tuple *tuple;
+   EINA_INARRAY_FOREACH(inarray, tuple)
+     eina_stringshare_del(tuple->key);
+   eina_inarray_free(inarray);
+}
+
+static void
+eddc_init(void)
+{
+   Eet_Data_Descriptor_Class eddc;
+   eet_eina_stream_data_descriptor_class_set(&eddc, sizeof(eddc),
+                                             "syntax_color_group",
+                                             sizeof(syntax_color_group));
+   edd_scg = eet_data_descriptor_stream_new(&eddc);
+
+   eet_eina_stream_data_descriptor_class_set(&eddc, sizeof(eddc), "color",
+                                             sizeof(color));
+   edd_color = eet_data_descriptor_stream_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_scg, syntax_color_group, "string",
+                                 string, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_scg, syntax_color_group, "comment",
+                                 comment, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_scg, syntax_color_group, "macro",
+                                 macro, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_scg, syntax_color_group, "count",
+                                 count, EET_T_STRING);
+
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_color, color, "val", val, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(edd_color, color, "keys", keys);
+
+   EET_DATA_DESCRIPTOR_ADD_ARRAY(edd_scg, syntax_color_group, "colors",
+                                 colors, edd_color);
+}
+
+static void
+eddc_term(void)
+{
+   eet_data_descriptor_free(edd_scg);
+   eet_data_descriptor_free(edd_color);
+}
+
+static void
+color_load()
+{
+   char buf[PATH_MAX];
+   snprintf(buf, sizeof(buf), "%s/color/edc.eet", elm_app_data_dir_get());
+
+   Eet_File *ef = eet_open(buf, EET_FILE_MODE_READ);
+   if (ef)
+     {
+        scg = eet_data_read(ef, edd_scg, "color");
+        if (!scg) EINA_LOG_ERR("Failed to read syntax color group.");
+        eet_close(ef);
+     }
+   else EINA_LOG_ERR("Failed to open color data file \"%s\"", buf);
+}
+
+static void
+color_table_init(void)
+{
+   color_tuple tuple;
+   int i;
+   Eina_List *l;
+   char *key;
+   char tmp[2];
+   Eina_Inarray *inarray;
+
+   if (!scg) return;
+   syntax_color_source *color_src = &g_color_src;
+
+   color_src->col_string = eina_stringshare_add(scg->string);
+   //free(scg->string);
+   color_src->col_comment = eina_stringshare_add(scg->comment);
+   //free(scg->comment);
+   color_src->col_macro = eina_stringshare_add(scg->macro);
+   //free(scg->macro);
+   color_src->color_cnt = atoi(scg->count);
+   //free(scg->count);
+
+   color_src->color_hash = eina_hash_string_small_new(hash_free_cb);
+
+   for (i = 0; i < color_src->color_cnt; i++)
+     {
+        color_src->cols[i] = eina_stringshare_add(scg->colors[i].val);
+        //free(scg->colors[i].val);
+
+        EINA_LIST_FOREACH(scg->colors[i].keys, l, key)
+          {
+             tmp[0] = key[0];
+             tmp[1] = '\0';
+
+             inarray = eina_hash_find(color_src->color_hash, tmp);
+             if (!inarray)
+               {
+                  inarray = eina_inarray_new(sizeof(color_tuple), 20);
+                  eina_hash_add(color_src->color_hash, tmp, inarray);
+               }
+
+             tuple.col = color_src->cols[i];
+             tuple.key = eina_stringshare_add(key);
+             eina_inarray_push(inarray, &tuple);
+          }
+        eina_list_free(scg->colors[i].keys);
+     }
+
+   free(scg);
+   scg = NULL;
+}
+
+static void
+macro_key_push(color_data *cd, char *str)
+{
+   char *key = str;
+   syntax_color_source *col_src = cd->col_src;
+
+   //cutoff "()" from the macro name
+   char *cut = strchr(key, '(');
+   if (cut)
+     {
+        key = strndup(str, cut - str);
+        if (!key) return;
+     }
+
+   char tmp[2];
+   tmp[0] = key[0];
+   tmp[1] = '\0';
+
+   Eina_Inarray *inarray = eina_hash_find(col_src->color_hash, tmp);
+   if (!inarray)
+     {
+        inarray = eina_inarray_new(sizeof(color_tuple), 20);
+        eina_hash_add(col_src->color_hash, tmp, inarray);
+     }
+
+   color_tuple tuple;
+   tuple.col = col_src->col_macro;
+   tuple.key = eina_stringshare_add(key);
+   eina_inarray_push(inarray, &tuple);
+
+   cd->macros = eina_list_append(cd->macros, eina_stringshare_add(tuple.key));
+
+   if (cut) free(key);
+}
+
+static Eina_Bool
+color_markup_insert_internal(Eina_Strbuf *strbuf, const char **src, int length,
+                             char **cur, char **prev,  const char *cmp,
+                             Eina_Stringshare *col)
+{
+   char buf[128];
+
+   eina_strbuf_append_length(strbuf, *prev, *cur - *prev);
+   snprintf(buf, sizeof(buf), "<color=#%s>%s</color>", col, cmp);
+   eina_strbuf_append(strbuf, buf);
+   *cur += strlen(cmp);
+   if (*cur > (*src + length)) return EINA_FALSE;
+   *prev = *cur;
+
+   return EINA_TRUE;
+}
+
+static int
+markup_skip(Eina_Strbuf *strbuf, const char **src, int length, char **cur,
+            char **prev)
+{
+   eina_strbuf_append_length(strbuf, *prev, (*cur - *prev));
+   (*cur)++;
+
+   if (*cur > (*src + length)) return -1;
+   *prev = *cur;
+
+   *cur = strchr(*prev, '>');
+
+   if (*cur)
+     {
+        (*cur)++;
+        *prev = *cur;
+        return 1;
+     }
+   else
+     {
+        *prev = *cur;
+        return -1;
+     }
+
+   return 1;
+}
+
+static int
+comment_apply(Eina_Strbuf *strbuf, const char **src, int length, char **cur,
+              char **prev, const Eina_Stringshare *col,
+              Eina_Bool *inside_comment)
+{
+   if (!(*inside_comment))
+     {
+        if ((*cur)[0] != '/') return 0;
+        if ((*cur) + 1 > ((*src) + length)) return -1;
+        if ((*cur)[1] != '*') return 0;
+
+        eina_strbuf_append_length(strbuf, *prev, (*cur - *prev));
+
+        char buf[128];
+        snprintf(buf, sizeof(buf), "<color=#%s>/*", col);
+        eina_strbuf_append(strbuf, buf);
+
+        int cmp_size = 2;     //strlen("/*");
+
+        *cur += cmp_size;
+
+        if (*cur > (*src + length))
+          {
+             *inside_comment = EINA_TRUE;
+             return -1;
+          }
+
+        *prev = *cur;
+
+        *cur = strstr(*prev, "*/");
+
+        if (*cur)
+          {
+             eina_strbuf_append_length(strbuf, *prev, (*cur - *prev));
+             eina_strbuf_append(strbuf, "*/</color>");
+             *cur += cmp_size;
+             *prev = *cur;
+             return 0;
+          }
+
+        eina_strbuf_append(strbuf, *prev);
+        *prev = *cur;
+
+        *inside_comment = EINA_TRUE;
+        return -1;
+     }
+   else
+     {
+        if ((*cur)[0] != '*') return 0;
+        if ((*cur) + 1 > ((*src) + length)) return -1;
+        if ((*cur)[1] != '/') return 0;
+
+        eina_strbuf_append_length(strbuf, *prev, (*cur - *prev));
+        eina_strbuf_append(strbuf, "*/</color>");
+
+        int cmp_size = 2;     //strlen("*/");
+
+        *cur += cmp_size;
+        *inside_comment = EINA_FALSE;
+
+        if (*cur > (*src + length)) return -1;
+        *prev = *cur;
+        return 1;
+     }
+
+   return -1;
+}
+
+static int
+comment2_apply(Eina_Strbuf *strbuf, const char **src, int length, char **cur,
+               char **prev, const Eina_Stringshare *col,
+               Eina_Bool *inside_comment)
+{
+   if (*inside_comment) return 0;
+   if ((*cur)[0] != '/') return 0;
+   if (((*cur) + 1) > ((*src) + length)) return -1;
+   if ((*cur)[1] != '/') return 0;
+
+   eina_strbuf_append_length(strbuf, *prev, (*cur - *prev));
+
+   char buf[128];
+   snprintf(buf, sizeof(buf), "<color=#%s>//", col);
+   eina_strbuf_append(strbuf, buf);
+
+   int cmp_size = 2;    //strlen("//");
+   *cur += cmp_size;
+
+   if (*cur > (*src + length))
+     {
+        eina_strbuf_append(strbuf, "</color>");
+        return -1;
+     }
+
+   *prev = *cur;
+
+   *cur = strstr(*prev, EOL);
+
+   if (*cur)
+     {
+        eina_strbuf_append_length(strbuf, *prev, (*cur - *prev));
+        eina_strbuf_append(strbuf, "</color><br/>");
+        *cur += EOL_LEN;
+        *prev = *cur;
+        return 1;
+     }
+
+   eina_strbuf_append(strbuf, *prev);
+   *prev = *cur;
+
+   eina_strbuf_append(strbuf, "</color>");
+   return -1;
+}
+
+static int
+string_apply(Eina_Strbuf *strbuf, char **cur, char **prev,
+             const Eina_Stringshare *col, Eina_Bool inside_string)
+{
+   //escape string: " ~ "
+   Eina_Bool is_eol = EINA_FALSE;
+   if (inside_string && !strncmp(*cur, EOL, EOL_LEN)) is_eol = EINA_TRUE;
+   else if (strncmp(*cur, QUOT, QUOT_LEN)) return 0;
+
+   char buf[128];
+
+   eina_strbuf_append_length(strbuf, *prev, (*cur - *prev));
+
+   // these conditions limit string range to end of line
+   // case 1: this condition checks end of line for string
+   if (is_eol)
+     {
+        snprintf(buf, sizeof(buf), "</color>");
+        eina_strbuf_append(strbuf, buf);
+     }
+   // case 2: this condition checks start and end for string
+   else
+     {
+        if (!inside_string)
+          snprintf(buf, sizeof(buf), "<color=#%s>%s", col, QUOT);
+        else
+          snprintf(buf, sizeof(buf), "%s</color>", QUOT);
+        eina_strbuf_append(strbuf, buf);
+        *cur += QUOT_LEN;
+     }
+
+   *prev = *cur;
+
+   return 1;
+}
+
+static int
+macro_apply(Eina_Strbuf *strbuf, const char **src, int length, char **cur,
+            char **prev, const Eina_Stringshare *col, color_data *cd)
+{
+   if ((*cur)[0] != '#') return 0;
+
+   char *space = strchr(*cur, ' ');
+   const char *eol = strstr(*cur, EOL);
+
+   if (!eol) eol = (*src) + length;
+   if (!space) space = (char *) eol;
+
+   //Let's find the macro name
+   while ((*space == ' ') && (space != eol)) space++;
+   char *macro_begin = space;
+   char *macro_end = strchr(space, ' ');
+
+   //Excetional case 1
+   if (!macro_end) macro_end = (char *) eol;
+   //Exceptional case 2
+   else if (macro_end > eol) macro_end = (char *) eol;
+   //Let's check the macro function case
+   else
+   {
+     int macro_len = macro_end - macro_begin;
+     char *macro = alloca(macro_len);
+     strncpy(macro, macro_begin, macro_len);
+
+     //Check how many "(", ")" pairs are exists
+     int bracket_inside = 0;
+     while (macro_len >= 0)
+       {
+          if (macro[macro_len] == '(') bracket_inside++;
+          else if (macro[macro_len] == ')') bracket_inside--;
+          macro_len--;
+       }
+     if (bracket_inside > 0)
+       {
+          while (bracket_inside > 0)
+            {
+               macro_end = strchr(macro_end, ')');
+               if (!macro_end) break;
+               bracket_inside--;
+            }
+          if (!macro_end) macro_end = (char *) eol;
+          else if (macro_end > eol) macro_end = (char *) eol;
+          else macro_end++;
+       }
+   }
+
+   //#define, #ifdef, #if, #...
+   eina_strbuf_append_length(strbuf, *prev, (*cur - *prev));
+
+   char buf[128];
+   snprintf(buf, sizeof(buf), "<color=#%s>#", col);
+   eina_strbuf_append(strbuf, buf);
+
+   int cmp_size = 1;    //strlen("#");
+   *cur += cmp_size;
+
+   *prev = *cur;
+   *cur = macro_end;
+
+   //push the macro to color table but only not numeric case.
+   if ((macro_end > macro_begin) &&
+       ((macro_begin[0] < '0') || (macro_begin[0] > '9')))
+     {
+        char *macro = strndup(macro_begin, (macro_end - macro_begin));
+        macro_key_push(cd, macro);
+        free(macro);
+     }
+
+   //Apply macro color to whole macro area continues to the "\".
+   while (macro_end < (*src + length))
+     {
+        char *slash = strstr(macro_end, "\\");
+        char *endeol = strstr(macro_end, EOL);
+
+        if ((!slash && endeol) ||
+            ((slash && endeol) && (slash > endeol)))
+          {
+             macro_end = endeol;
+             break;
+          }
+
+        if (!slash || !endeol) break;
+        if (endeol < slash) break;
+
+        macro_end = endeol + 1;
+     }
+
+   *cur = macro_end;
+
+   eina_strbuf_append_length(strbuf, *prev, (*cur - *prev));
+   eina_strbuf_append(strbuf, "</color>");
+
+   *prev = *cur;
+
+   return 1;
+}
+
+const char *
+color_cancel(Ecore_Thread *thread, color_data *cd, const char *src,
+             int length, int from_pos, int to_pos, char **from, char **to)
+{
+   if (!src || length < 1) return NULL;
+   Eina_Strbuf *strbuf = cd->strbuf;
+   eina_strbuf_reset(strbuf);
+
+   const char *str = NULL;
+   char *prev = (char *) src;
+   char *cur = (char *) src;
+   int line = 1;
+   Eina_Bool find_from, find_to;
+
+   //if the from_pos equals -1, we wanna full text area of syntax color
+   if (from_pos == -1)
+     {
+        find_from = EINA_FALSE;
+        find_to = EINA_FALSE;
+     }
+   else
+     {
+        find_from = EINA_TRUE;
+        find_to = EINA_TRUE;
+     }
+
+   while (cur && (cur <= (src + length)))
+     {
+        if (thread && ecore_thread_check(thread)) return NULL;
+        //Capture start line
+        if (find_from && (line == from_pos))
+          {
+             from_pos = eina_strbuf_length_get(strbuf);
+             find_from = EINA_FALSE;
+          }
+
+        if (*cur == '<')
+          {
+             //escape EOL: <br/>
+             if (!strncmp(cur, EOL, EOL_LEN))
+               {
+                  //Capture end line
+                  if (find_to && (line == to_pos))
+                    {
+                       to_pos = eina_strbuf_length_get(strbuf);
+                       find_to = EINA_FALSE;
+                    }
+
+                  eina_strbuf_append_length(strbuf, prev,
+                                            (cur - prev + EOL_LEN));
+                  cur += EOL_LEN;
+                  prev = cur;
+                  line++;
+
+                  continue;
+               }
+             //escape TAB: <tab/>
+             if (!strncmp(cur, TAB, TAB_LEN))
+               {
+                  cur += TAB_LEN;
+                  continue;
+               }
+             //escape markups: <..> ~ </..>
+             if (markup_skip(strbuf, &src, length, &cur, &prev) == 1)
+               continue;
+          }
+        cur++;
+     }
+
+   //Capture end line
+   if (find_to && (line == to_pos))
+     {
+        to_pos = eina_strbuf_length_get(strbuf);
+        find_to = EINA_FALSE;
+     }
+
+   //Same with origin source.
+   if (prev == src)
+     str = src;
+   //Some color syntax is applied.
+   else
+     {
+        //append leftovers.
+        if (prev + 1 < cur) eina_strbuf_append(strbuf, prev);
+        str = eina_strbuf_string_get(strbuf);
+     }
+
+   //Exceptional Handling
+   if (find_from) from_pos = 0;
+   if (find_to) to_pos = eina_strbuf_length_get(strbuf);
+
+   if (from_pos != -1)
+     {
+        *from = ((char *) str) + from_pos;
+        *to = ((char *) str) + to_pos;
+     }
+
+   return str;
+}
+
+static void
+macro_keys_free(color_data *cd)
+{
+   Eina_Stringshare *macro;
+   Eina_Inarray *inarray;
+   color_tuple *tuple;
+   char key[2];
+   syntax_color_source *col_src = cd->col_src;
+
+   EINA_LIST_FREE(cd->macros, macro)
+     {
+        key[0] = macro[0];
+        key[1] = '\0';
+        inarray = eina_hash_find(col_src->color_hash, key);
+
+        if (inarray)
+          {
+             EINA_INARRAY_REVERSE_FOREACH(inarray, tuple)
+               {
+                  if (strlen(macro) != strlen(tuple->key)) continue;
+                  if (!strcmp(macro, tuple->key))
+                    {
+                       eina_inarray_pop(inarray);
+                       break;
+                    }
+               }
+          }
+     }
+}
+
+static int
+color_markup_insert(Eina_Strbuf *strbuf, const char **src, int length, char **cur,
+                    char **prev, color_data *cd)
+{
+   const char *SYMBOLS = " {}[];:.()!<>=&|/";
+   Eina_Bool symbol = EINA_FALSE;
+
+   if (strchr(SYMBOLS, (*cur)[0])) symbol = EINA_TRUE;
+
+   if (!symbol && (*cur > *src))
+     {
+        if (!strchr(SYMBOLS, *(*cur -1))) return 0;
+     }
+
+   syntax_color_source *col_src = cd->col_src;
+   char tmp[2];
+   tmp[0] = (*cur)[0];
+   tmp[1] = '\0';
+
+   Eina_Inarray *inarray = eina_hash_find(col_src->color_hash, tmp);
+   if (!inarray) return 0;
+
+   //Found tuple list. Search in detail.
+   color_tuple *tuple;
+   int len;
+
+   EINA_INARRAY_FOREACH(inarray, tuple)
+     {
+        len = strlen(tuple->key);
+        char *p = *cur + len;
+        if (!strncmp(*cur, tuple->key, len))
+          {
+             if (p <= (*src + length))
+               {
+                  if (!symbol &&
+                      /* Exceptional Case. For duplicated keywords, it
+                         subdivides with '.' ' '. See the config.src */
+                      (*(p - 1) != '.') &&
+                      (*(p - 1) != ' '))
+                    {
+                       if (!strchr(SYMBOLS, *p)) return 0;
+                    }
+                  if (color_markup_insert_internal(strbuf, src, length, cur,
+                                                   prev, tuple->key,
+                                                   tuple->col))
+                    return 1;
+                  else return -1;
+               }
+          }
+     }
+   return 0;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+color_data *
+color_init(Eina_Strbuf *strbuf)
+{
+   color_data *cd = calloc(1, sizeof(color_data));
+   if (!cd)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+
+   init_count++;
+
+   cd->strbuf = strbuf;
+   cd->cachebuf = eina_strbuf_new();
+
+   if (init_count == 1)
+     {
+        eddc_init();
+        color_load();
+        eddc_term();
+        color_table_init();
+     }
+   cd->col_src = &g_color_src;
+
+   /* TODO: Improve to share macro info through color instances. Might be this
+      could be global static instance and could be shared with locking
+      mechanism... */
+   cd->macros = NULL;
+
+   return cd;
+}
+
+void
+color_term(color_data *cd)
+{
+   Eina_Stringshare *macro;
+   EINA_LIST_FREE(cd->macros, macro) eina_stringshare_del(macro);
+
+   eina_strbuf_free(cd->cachebuf);
+
+   free(cd);
+
+   //release shared color source.
+   if ((--init_count) == 0)
+     {
+        syntax_color_source *col_src = &g_color_src;
+
+        eina_hash_free(col_src->color_hash);
+        eina_stringshare_del(col_src->col_string);
+        eina_stringshare_del(col_src->col_comment);
+        eina_stringshare_del(col_src->col_macro);
+
+        int i;
+        for(i = 0; i < col_src->color_cnt; i++)
+          eina_stringshare_del(col_src->cols[i]);
+     }
+}
+
+static Eina_Bool
+color_hash_foreach_cb(const Eina_Hash *hash EINA_UNUSED,
+                      const void *key EINA_UNUSED, void *data, void *fdata)
+{
+   Eina_Inarray *inarray = data;
+   color_hash_foreach_data *fd = fdata;
+   color_tuple *tuple;
+
+   EINA_INARRAY_FOREACH(inarray, tuple)
+     {
+        if (tuple->col == fd->cur_col)
+          tuple->col = fd->new_col;
+     }
+   return EINA_TRUE;
+}
+
+//FIXME: Need synchronization... ?
+void
+color_set(color_data *cd, Enventor_Syntax_Color_Type color_type,
+          const char *val)
+{
+   Eina_Stringshare *col;
+   color_hash_foreach_data fd;
+   syntax_color_source *col_src = cd->col_src;
+
+   switch (color_type)
+     {
+        case ENVENTOR_SYNTAX_COLOR_STRING:
+          {
+             eina_stringshare_del(col_src->col_string);
+             col_src->col_string = eina_stringshare_add(val);
+             break;
+          }
+        case ENVENTOR_SYNTAX_COLOR_COMMENT:
+          {
+             eina_stringshare_del(col_src->col_comment);
+             col_src->col_comment = eina_stringshare_add(val);
+             break;
+          }
+        case ENVENTOR_SYNTAX_COLOR_MACRO:
+          {
+             eina_stringshare_del(col_src->col_macro);
+             col_src->col_macro = eina_stringshare_add(val);
+             break;
+          }
+        case ENVENTOR_SYNTAX_COLOR_SYMBOL:
+          {
+             col = eina_stringshare_add(val);
+             fd.cur_col = col_src->cols[0];
+             fd.new_col = col;
+             eina_hash_foreach(col_src->color_hash, color_hash_foreach_cb, &fd);
+             eina_stringshare_del(col_src->cols[0]);
+             col_src->cols[0] = col;
+             break;
+          }
+        case ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD:
+          {
+             col = eina_stringshare_add(val);
+             fd.cur_col = col_src->cols[1];
+             fd.new_col = col;
+             eina_hash_foreach(col_src->color_hash, color_hash_foreach_cb, &fd);
+             eina_stringshare_del(col_src->cols[1]);
+             col_src->cols[1] = col;
+             break;
+          }
+        case ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD:
+          {
+             col = eina_stringshare_add(val);
+             fd.cur_col = col_src->cols[2];
+             fd.new_col = col;
+             eina_hash_foreach(col_src->color_hash, color_hash_foreach_cb, &fd);
+             eina_stringshare_del(col_src->cols[2]);
+             col_src->cols[2] = col;
+             break;
+          }
+        case ENVENTOR_SYNTAX_COLOR_CONSTANT:
+          {
+             col = eina_stringshare_add(val);
+             fd.cur_col = col_src->cols[3];
+             fd.new_col = col;
+             eina_hash_foreach(col_src->color_hash, color_hash_foreach_cb, &fd);
+             eina_stringshare_del(col_src->cols[3]);
+             col_src->cols[3] = col;
+             break;
+          }
+        case ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC:
+          {
+             col = eina_stringshare_add(val);
+             fd.cur_col = col_src->cols[4];
+             fd.new_col = col;
+             eina_hash_foreach(col_src->color_hash, color_hash_foreach_cb, &fd);
+             eina_stringshare_del(col_src->cols[4]);
+             col_src->cols[4] = col;
+             break;
+          }
+        case ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD:
+          {
+             col = eina_stringshare_add(val);
+             fd.cur_col = col_src->cols[5];
+             fd.new_col = col;
+             eina_hash_foreach(col_src->color_hash, color_hash_foreach_cb, &fd);
+             eina_stringshare_del(col_src->cols[5]);
+             col_src->cols[5] = col;
+             break;
+          }
+        case ENVENTOR_SYNTAX_COLOR_LAST:  //avoiding compiler warning
+          break;
+     }
+}
+
+const char *
+color_value_get(Enventor_Syntax_Color_Type color_type)
+{
+   syntax_color_source *col_src = &g_color_src;
+   if (!col_src) return NULL;
+
+   switch (color_type)
+     {
+        case ENVENTOR_SYNTAX_COLOR_STRING:
+          return (const char *) col_src->col_string;
+        case ENVENTOR_SYNTAX_COLOR_COMMENT:
+          return (const char *) col_src->col_comment;
+        case ENVENTOR_SYNTAX_COLOR_MACRO:
+          return (const char *) col_src->col_macro;
+        case ENVENTOR_SYNTAX_COLOR_SYMBOL:
+          return (const char *) col_src->cols[0];
+        case ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD:
+          return (const char *) col_src->cols[1];
+        case ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD:
+          return (const char *) col_src->cols[2];
+        case ENVENTOR_SYNTAX_COLOR_CONSTANT:
+          return (const char *) col_src->cols[3];
+        case ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC:
+          return (const char *) col_src->cols[4];
+        case ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD:
+          return (const char *) col_src->cols[5];
+        default:
+          return NULL;
+     }
+}
+
+const char *
+color_apply(Ecore_Thread *thread, color_data *cd, const char *src, int length,
+            char *from, char *to)
+{
+   Eina_Bool inside_string = EINA_FALSE;
+   Eina_Bool inside_comment = EINA_FALSE;
+
+   if (!src || (length < 1)) return NULL;
+
+   syntax_color_source *col_src = cd->col_src;
+
+   Eina_Strbuf *strbuf = cd->cachebuf;
+   eina_strbuf_reset(strbuf);
+
+   const char *str = NULL;
+   char *prev = (char *) src;
+   char *cur = (char *) src;
+   int ret;
+
+   while (cur && (cur <= (src + length)))
+     {
+        if (thread && ecore_thread_check(thread)) return NULL;
+
+        //escape empty string
+        if (!from || (cur >= from))
+          {
+             if (cur[0] == ' ')
+               {
+                  if (cur > prev)
+                    eina_strbuf_append_length(strbuf, prev, (cur - prev) + 1);
+                  else
+                    eina_strbuf_append_char(strbuf, ' ');
+                  ++cur;
+                  prev = cur;
+                  continue;
+               }
+          }
+
+        //escape string: " ~ "
+        ret = string_apply(strbuf, &cur, &prev, col_src->col_string,
+                           inside_string);
+        if (ret == 1)
+          {
+             inside_string = !inside_string;
+             continue;
+          }
+
+        if (inside_string || inside_comment)
+          {
+             cur++;
+             continue;
+          }
+
+        //handle comment: /* ~ */
+        ret = comment_apply(strbuf, &src, length, &cur, &prev,
+                            col_src->col_comment, &inside_comment);
+        if (ret == 1) continue;
+        else if (ret == -1) goto finished;
+
+        //handle comment: //
+        if (!from || (cur >= from))
+          {
+             ret = comment2_apply(strbuf, &src, length, &cur, &prev,
+                                  col_src->col_comment, &inside_comment);
+             if (ret == 1) continue;
+             else if (ret == -1) goto finished;
+          }
+
+        if (*cur == '<')
+          {
+             //escape EOL: <br/>
+             if (!strncmp(cur, EOL, EOL_LEN))
+               {
+                  cur += EOL_LEN;
+                  continue;
+               }
+
+             //escape TAB: <tab/>
+             if (!strncmp(cur, TAB, TAB_LEN))
+               {
+                  cur += TAB_LEN;
+                  continue;
+               }
+          }
+
+        //handle comment: preprocessors, #
+        ret = macro_apply(strbuf, &src, length, &cur, &prev, col_src->col_macro,
+                          cd);
+        if (ret == 1) continue;
+
+        //apply color markup
+        if (!from || (cur >= from))
+          {
+             ret = color_markup_insert(strbuf, &src, length, &cur, &prev, cd);
+             if (ret == 1) continue;
+             else if (ret == -1) goto finished;
+          }
+
+        cur++;
+        if (to && (cur > to)) goto finished;
+     }
+
+   //Same with origin source.
+   if (prev == src)
+     str = src;
+   //Some color syntax is applied.
+   else
+     {
+finished:
+        //append leftovers.
+        if (prev < cur) eina_strbuf_append(strbuf, prev);
+        str = eina_strbuf_string_get(strbuf);
+     }
+
+   macro_keys_free(cd);
+
+   return str;
+}
diff --git a/src/lib/syntax_helper.c b/src/lib/syntax_helper.c
new file mode 100644 (file)
index 0000000..b09a1b4
--- /dev/null
@@ -0,0 +1,76 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+struct syntax_helper_s
+{
+   color_data *cd;
+   indent_data *id;
+   Eina_Strbuf *strbuf;
+   Ecore_Timer *buf_flush_timer;
+};
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static Eina_Bool
+buf_flush_timer_cb(void *data)
+{
+   syntax_helper *sh = data;
+   /* At this moment, I have no idea the policy of the eina strbuf.
+      If the string buffer wouldn't reduce the buffer size, it needs to prevent
+      the buffer size not to be grown endlessly. */
+   eina_strbuf_free(sh->strbuf);
+   sh->strbuf = eina_strbuf_new();
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+syntax_helper *
+syntax_init(edit_data *ed)
+{
+   syntax_helper *sh = malloc(sizeof(syntax_helper));
+   if (!sh)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+   sh->strbuf = eina_strbuf_new();
+   sh->buf_flush_timer = ecore_timer_add(1800, buf_flush_timer_cb, sh);
+
+   sh->cd = color_init(sh->strbuf);
+   sh->id = indent_init(sh->strbuf, ed);
+
+   return sh;
+}
+
+void
+syntax_term(syntax_helper *sh)
+{
+   color_term(sh->cd);
+   indent_term(sh->id);
+
+   ecore_timer_del(sh->buf_flush_timer);
+   eina_strbuf_free(sh->strbuf);
+   free(sh);
+}
+
+color_data *
+syntax_color_data_get(syntax_helper *sh)
+{
+   return sh->cd;
+}
+
+indent_data *
+syntax_indent_data_get(syntax_helper *sh)
+{
+   return sh->id;
+}
diff --git a/src/lib/syntax_indent.c b/src/lib/syntax_indent.c
new file mode 100644 (file)
index 0000000..176e643
--- /dev/null
@@ -0,0 +1,1033 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+struct indent_s
+{
+   Eina_Strbuf *strbuf;
+   Evas_Object *entry;
+   redoundo_data *rd;
+};
+
+typedef struct indent_line_s
+{
+   Eina_Stringshare *str;
+   Eina_Bool indent_apply;
+   int indent_depth;
+} indent_line;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static int
+indent_depth_get(indent_data *id EINA_UNUSED, char *src, int pos)
+{
+   const char *quot = "\"";
+   const int quot_len = 1;
+
+   if (!src || (pos < 1)) return 0;
+
+   int depth = 0;
+   char *cur = (char *) src;
+   char *end = ((char *) src) + pos;
+
+   while (cur && (cur < end))
+     {
+        //Skip "" range
+        if (*cur == *quot)
+          {
+             cur += quot_len;
+             cur = strstr(cur, quot);
+             if (!cur) return depth;
+             cur += quot_len;
+          }
+
+        if (*cur == '{') depth++;
+        else if (*cur == '}') depth--;
+        cur++;
+     }
+
+   return depth;
+}
+
+static void
+indent_insert_br_case(indent_data *id)
+{
+   Evas_Object *entry = id->entry;
+   Evas_Object *tb = elm_entry_textblock_get(entry);
+   Evas_Textblock_Cursor *cur = evas_object_textblock_cursor_get(tb);
+   const char *text = evas_textblock_cursor_paragraph_text_get(cur);
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   Eina_Strbuf* diff = id->strbuf;
+   eina_strbuf_reset(diff);
+   int rd_cur_pos = evas_textblock_cursor_pos_get(cur);
+
+   if (strlen(utf8) > 0)
+     {
+        evas_textblock_cursor_paragraph_char_first(cur);
+        int i = 0;
+        while (utf8[i] == ' ')
+          {
+             eina_strbuf_append(diff, evas_textblock_cursor_content_get(cur));
+             evas_textblock_cursor_char_delete(cur);
+             i++;
+          }
+     }
+   free(utf8);
+   redoundo_text_push(id->rd, eina_strbuf_string_get(diff), rd_cur_pos, 0,
+                      EINA_FALSE);
+
+   int space = indent_space_get(id);
+   if (space <= 0) return;
+
+   //Alloc Empty spaces
+   char *p = alloca(space + 1);
+   memset(p, ' ', space);
+   p[space] = '\0';
+
+   redoundo_text_push(id->rd, p, elm_entry_cursor_pos_get(entry), 0, EINA_TRUE);
+
+   elm_entry_entry_insert(entry, p);
+}
+
+static void
+indent_insert_tab_case(indent_data *id)
+{
+   Evas_Object *entry = id->entry;
+   Evas_Object *tb = elm_entry_textblock_get(entry);
+   Evas_Textblock_Cursor *cur_orig = evas_object_textblock_cursor_get(tb);
+   Evas_Textblock_Cursor *cur = evas_object_textblock_cursor_new(tb);
+   char *utf8 = NULL;
+   int utf8_len = 0;
+   char *p = NULL;
+   Eina_Bool insert_indent_space = EINA_FALSE;
+
+   //Remove inserted "<tab/>".
+   evas_textblock_cursor_pos_set(cur, evas_textblock_cursor_pos_get(cur_orig));
+   evas_textblock_cursor_char_prev(cur);
+   if (!strncmp(evas_textblock_cursor_content_get(cur), TAB, TAB_LEN))
+     {
+        //Cancel added "<tab/>" from redoundo.
+        redoundo_n_diff_cancel(id->rd, 1);
+        evas_textblock_cursor_char_delete(cur);
+     }
+   evas_textblock_cursor_pos_set(cur, evas_textblock_cursor_pos_get(cur_orig));
+
+   /* Spaces for indent are not required.
+      Insert spaces for tab. */
+   int space = indent_space_get(id);
+   if (space <= 0) goto end;
+
+   evas_textblock_cursor_paragraph_prev(cur);
+   evas_textblock_cursor_paragraph_next(cur);
+   utf8 = evas_textblock_cursor_range_text_get(cur, cur_orig,
+                                               EVAS_TEXTBLOCK_TEXT_PLAIN);
+   /* There is no paragraph.
+      Insert spaces for indent. */
+   if (!utf8)
+     {
+        insert_indent_space = EINA_TRUE;
+        goto end;
+     }
+
+   utf8_len = strlen(utf8);
+   /* Paragraph is shorter than spaces for indent.
+      Insert spaces for indent. */
+   if (utf8_len < space)
+     insert_indent_space = EINA_TRUE;
+
+end:
+   if (insert_indent_space)
+     {
+        //Allocate spaces for indent.
+        p = alloca(space - utf8_len + 1);
+        memset(p, ' ', space - utf8_len);
+        p[space - utf8_len] = '\0';
+     }
+   else
+     {
+        //Allocate spaces for tab.
+        p = alloca(TAB_SPACE + 1);
+        memset(p, ' ', TAB_SPACE);
+        p[TAB_SPACE] = '\0';
+     }
+
+   redoundo_text_push(id->rd, p, elm_entry_cursor_pos_get(entry), 0, EINA_TRUE);
+   elm_entry_entry_insert(entry, p);
+
+   if (utf8) free(utf8);
+   evas_textblock_cursor_free(cur);
+}
+
+static void
+indent_insert_bracket_case(indent_data *id, int cur_line)
+{
+   Evas_Object *entry = id->entry;
+   Evas_Object *tb = elm_entry_textblock_get(entry);
+   Evas_Textblock_Cursor *cur = evas_object_textblock_cursor_new(tb);
+   evas_textblock_cursor_line_set(cur, cur_line - 1);
+   const char *text = evas_textblock_cursor_paragraph_text_get(cur);
+   char *utf8 = elm_entry_markup_to_utf8(text);
+
+   int len = strlen(utf8) - 1;
+   if (len < 0) return;
+
+   while (len)
+     {
+        if (utf8[len] == '}') break;
+        len--;
+     }
+
+   int space = indent_space_get(id);
+   if (space == len)
+     {
+        free(utf8);
+        return;
+     }
+
+   int i = 0;
+   if (len > space)
+     {
+        evas_textblock_cursor_paragraph_char_last(cur);
+        evas_textblock_cursor_char_prev(cur);
+
+        while (i < (len - space))
+          {
+             if ((utf8[(len - 1) - i] == ' ') &&
+                 (utf8[(len - 2) - i] == ' '))
+               {
+                  evas_textblock_cursor_char_prev(cur);
+                  evas_textblock_cursor_char_delete(cur);
+               }
+             else break;
+             i++;
+          }
+        //leftover
+        if (space == 0 && utf8[0] ==  ' ')
+          {
+             evas_textblock_cursor_char_prev(cur);
+             evas_textblock_cursor_char_delete(cur);
+          }
+     }
+   else
+     {
+        //Alloc Empty spaces
+        space = (space - len);
+        char *p = alloca(space + 1);
+        memset(p, ' ', space);
+        p[space] = '\0';
+        evas_textblock_cursor_text_prepend(cur, p);
+     }
+
+   elm_entry_calc_force(entry);
+   evas_textblock_cursor_free(cur);
+   free(utf8);
+}
+
+static Eina_List *
+indent_code_line_list_create(indent_data *id EINA_UNUSED, const char *utf8)
+{
+   Eina_List *code_line_list = NULL;
+   indent_line *code_line = NULL;
+
+   char *utf8_ptr = NULL;
+   char *utf8_end = NULL;
+   char *utf8_lexem = NULL;
+   char *utf8_appended = NULL;
+
+   Eina_Bool keep_lexem = EINA_FALSE;
+
+   //Single line comment begins in the beginning of the line.
+   Eina_Bool single_comment_begin = EINA_FALSE;
+   //Single line comment begins in the middle of the line.
+   Eina_Bool single_comment_middle = EINA_FALSE;
+
+   //Multi line comment begins in the beginning of the line.
+   Eina_Bool multi_comment_begin = EINA_FALSE;
+   //Multi line comment begins in the middle of the line.
+   Eina_Bool multi_comment_middle = EINA_FALSE;
+   //Multi line comment ends in the line.
+   Eina_Bool multi_comment_end = EINA_FALSE;
+
+   //Macro begins in the beginning of the line.
+   Eina_Bool macro_begin = EINA_FALSE;
+   //Macro begins in the middle of the line.
+   Eina_Bool macro_middle = EINA_FALSE;
+
+   int cur_indent_depth = 0;
+   int new_indent_depth = 0;
+
+   if (!utf8) return NULL;
+
+   utf8_ptr = (char *)utf8;
+   utf8_end = utf8_ptr + strlen(utf8);
+
+   /* Create a list of code line strings from inserted string.
+      Each code line string is generated based on lexeme.
+      Here, lexeme starts with nonspace character and ends with newline. */
+   for ( ; utf8_ptr < utf8_end; utf8_ptr++)
+     {
+        if (*utf8_ptr == '\n')
+          {
+             if (!keep_lexem)
+               utf8_lexem = utf8_ptr;
+             keep_lexem = EINA_FALSE;
+
+             code_line = (indent_line *)calloc(1, sizeof(indent_line));
+
+             char *append_begin = NULL;
+             if (!utf8_appended) append_begin = (char *)utf8;
+
+             if (single_comment_begin || multi_comment_begin ||
+                 macro_begin || macro_middle)
+               {
+                  if (!append_begin)
+                    append_begin = utf8_appended + 1;
+
+                  code_line->indent_apply = EINA_FALSE;
+               }
+             else
+               {
+                  if (!append_begin)
+                    append_begin = utf8_lexem;
+
+                  //Newline only string does not need indentation.
+                  if (utf8_ptr == append_begin)
+                    code_line->indent_apply = EINA_FALSE;
+                  else
+                    code_line->indent_apply = EINA_TRUE;
+               }
+             code_line->str
+                = eina_stringshare_add_length(append_begin,
+                                              utf8_ptr - append_begin + 1);
+             code_line->indent_depth = cur_indent_depth;
+             cur_indent_depth = new_indent_depth;
+
+             code_line_list = eina_list_append(code_line_list, code_line);
+             utf8_appended = utf8_ptr;
+
+             if (single_comment_begin)
+               single_comment_begin = EINA_FALSE;
+             if (single_comment_middle)
+               single_comment_middle = EINA_FALSE;
+             if (multi_comment_middle)
+               {
+                  multi_comment_middle = EINA_FALSE;
+                  multi_comment_begin = EINA_TRUE;
+               }
+             if (multi_comment_end)
+               {
+                  multi_comment_begin = EINA_FALSE;
+                  multi_comment_middle = EINA_FALSE;
+                  multi_comment_end = EINA_FALSE;
+               }
+
+             //Check if macro ends.
+             if (macro_begin || macro_middle)
+               {
+                  if (*(utf8_ptr - 1) != '\\')
+                    {
+                       macro_begin = EINA_FALSE;
+                       macro_middle = EINA_FALSE;
+                    }
+               }
+          }
+        else if ((*utf8_ptr != ' ') && (*utf8_ptr != '\t') &&
+                 (*utf8_ptr != '\r'))
+          {
+             if (!keep_lexem)
+               {
+                  utf8_lexem = utf8_ptr;
+                  keep_lexem = EINA_TRUE;
+               }
+
+             //Check if current character is outside of line comment.
+             if ((!single_comment_begin && !single_comment_middle) &&
+                 ((!multi_comment_begin && !multi_comment_middle) ||
+                  (multi_comment_end)))
+               {
+                  if ((*utf8_ptr == '/') && (utf8_ptr + 1 < utf8_end))
+                    {
+                       //Check if single line comment begins.
+                       if (*(utf8_ptr + 1) == '/')
+                         {
+                            if (utf8_ptr == utf8_lexem)
+                              single_comment_begin = EINA_TRUE;
+                            else
+                              single_comment_middle = EINA_TRUE;
+                         }
+                       //Check if multi line comment begins.
+                       else if (*(utf8_ptr + 1) == '*')
+                         {
+                            if (utf8_ptr == utf8_lexem)
+                              multi_comment_begin = EINA_TRUE;
+                            else
+                              multi_comment_middle = EINA_TRUE;
+                         }
+                    }
+                  else if (*utf8_ptr == '#')
+                    {
+                       if (utf8_ptr == utf8_lexem)
+                         macro_begin = EINA_TRUE;
+                       else
+                         macro_middle = EINA_TRUE;
+                    }
+                  else if (*utf8_ptr == '{')
+                    new_indent_depth++;
+                  else if (*utf8_ptr == '}')
+                    {
+                       new_indent_depth--;
+
+                       /* Indentation depth decreases from the current code line
+                          if string begins with '}'. */
+                       if (utf8_ptr == utf8_lexem)
+                         cur_indent_depth = new_indent_depth;
+                    }
+               }
+
+             //Check if multi line comment ends.
+             if (multi_comment_begin || multi_comment_middle)
+               {
+                  if ((*utf8_ptr == '*') && (utf8_ptr + 1 < utf8_end) &&
+                      (*(utf8_ptr + 1) == '/'))
+                    {
+                       multi_comment_end = EINA_TRUE;
+                    }
+               }
+          }
+     }
+
+   /* Append rest of the input string which does not end with newline. */
+   if (!utf8_appended || (utf8_appended < utf8_end - 1))
+     {
+        char *append_begin = NULL;
+        if (!utf8_appended) append_begin = (char *)utf8;
+
+        code_line = (indent_line *)calloc(1, sizeof(indent_line));
+
+        if (single_comment_begin || multi_comment_begin || macro_begin)
+          {
+             if (!append_begin)
+               append_begin = utf8_appended + 1;
+
+             code_line->indent_apply = EINA_FALSE;
+          }
+        else
+          {
+             if (!append_begin)
+               {
+                  //Only spaces are in the rest of the input string.
+                  if (utf8_lexem <= utf8_appended)
+                    {
+                       append_begin = utf8_appended + 1;
+                       code_line->indent_apply = EINA_FALSE;
+                    }
+                  //Non-space characters are in the rest of the input string.
+                  else
+                    {
+                       append_begin = utf8_lexem;
+                       code_line->indent_apply = EINA_TRUE;
+                    }
+               }
+             else
+               code_line->indent_apply = EINA_TRUE;
+          }
+        code_line->str
+           = eina_stringshare_add_length(append_begin,
+                                         utf8_end - append_begin);
+        code_line->indent_depth = cur_indent_depth;
+
+        code_line_list = eina_list_append(code_line_list, code_line);
+     }
+
+   return code_line_list;
+}
+
+static int
+indent_text_auto_format(indent_data *id, const char *insert)
+{
+   int line_cnt = 0;
+   //FIXME: To improve performance, change logic not to translate text.
+   char *utf8 = evas_textblock_text_markup_to_utf8(NULL, insert);
+   int utf8_size = strlen(utf8);
+
+   Evas_Object *tb = elm_entry_textblock_get(id->entry);
+   Evas_Textblock_Cursor *cur_start = evas_object_textblock_cursor_new(tb);
+   Evas_Textblock_Cursor *cur_end = evas_object_textblock_cursor_get(tb);
+   int tb_cur_pos = 0;
+
+   Eina_List *code_line_list = indent_code_line_list_create(id, utf8);
+   indent_line *code_line = NULL;
+   free(utf8);
+   if (!code_line_list) goto end;
+
+   /* Check if indentation should be applied to the first code line.
+      Indentation is applied if prior string has only spaces. */
+   code_line= eina_list_data_get(code_line_list);
+   if (code_line->indent_apply)
+     {
+        Evas_Textblock_Cursor *check_start
+           = evas_object_textblock_cursor_new(tb);
+        Evas_Textblock_Cursor *check_end
+           = evas_object_textblock_cursor_new(tb);
+
+        tb_cur_pos = evas_textblock_cursor_pos_get(cur_end);
+        evas_textblock_cursor_pos_set(check_end, tb_cur_pos - utf8_size);
+        evas_textblock_cursor_pos_set(check_start, tb_cur_pos - utf8_size);
+        evas_textblock_cursor_line_char_first(check_start);
+
+        char *check_range
+           = evas_textblock_cursor_range_text_get(check_start, check_end,
+                                                  EVAS_TEXTBLOCK_TEXT_PLAIN);
+
+        evas_textblock_cursor_free(check_start);
+        evas_textblock_cursor_free(check_end);
+
+        Eina_Bool nonspace_found = EINA_FALSE;
+        if (check_range)
+          {
+             int check_len = strlen(check_range);
+             int index = 0;
+             for ( ; index < check_len; index++)
+               {
+                  if (check_range[index] != ' ')
+                    {
+                       nonspace_found = EINA_TRUE;
+                       break;
+                    }
+               }
+             free(check_range);
+          }
+        if (nonspace_found)
+          {
+             code_line->indent_apply = EINA_FALSE;
+          }
+        else
+          {
+             int str_len = eina_stringshare_strlen(code_line->str);
+             int index = 0;
+             for ( ; index < str_len; index++)
+               {
+                  if ((code_line->str[index] != ' ') &&
+                      (code_line->str[index] != '\t') &&
+                      (code_line->str[index] != '\r'))
+                    break;
+               }
+             if (index < str_len)
+               {
+                  char *new_str = strdup(&code_line->str[index]);
+                  if (new_str)
+                    {
+                       eina_stringshare_del(code_line->str);
+                       code_line->str = eina_stringshare_add(new_str);
+                       free(new_str);
+                    }
+               }
+          }
+     }
+
+   tb_cur_pos = evas_textblock_cursor_pos_get(cur_end);
+   evas_textblock_cursor_pos_set(cur_start, tb_cur_pos - utf8_size);
+   evas_textblock_cursor_range_delete(cur_start, cur_end);
+
+   //Cancel last added diff, that was created when text pasted into entry.
+   redoundo_n_diff_cancel(id->rd, 1);
+
+   evas_textblock_cursor_line_char_first(cur_start);
+
+   //Move cursor to the position where the inserted string will be prepended.
+   code_line= eina_list_data_get(code_line_list);
+   if (code_line->indent_apply)
+     {
+        evas_textblock_cursor_line_char_first(cur_start);
+        int space_pos_start = evas_textblock_cursor_pos_get(cur_start);
+        int space_pos_end = evas_textblock_cursor_pos_get(cur_end);
+
+        if (space_pos_start < space_pos_end)
+          {
+             //Delete prior spaces.
+             char *prior_space =
+                evas_textblock_cursor_range_text_get(cur_start, cur_end,
+                   EVAS_TEXTBLOCK_TEXT_MARKUP);
+
+             if (prior_space)
+               {
+                  evas_textblock_cursor_range_delete(cur_start, cur_end);
+
+                  tb_cur_pos = evas_textblock_cursor_pos_get(cur_end);
+                  /* Add data about removal of prior spaces into the redoundo
+                     queue. */
+                  redoundo_text_push(id->rd, prior_space, tb_cur_pos, 0,
+                                     EINA_FALSE);
+                  free(prior_space);
+               }
+          }
+     }
+   else
+     {
+        tb_cur_pos = evas_textblock_cursor_pos_get(cur_end);
+        evas_textblock_cursor_pos_set(cur_start, tb_cur_pos);
+     }
+
+   int space = indent_space_get(id);
+
+   Eina_List *l = NULL;
+   Eina_Strbuf *buf = id->strbuf;
+   eina_strbuf_reset(buf);
+
+   EINA_LIST_FOREACH(code_line_list, l, code_line)
+     {
+        Eina_Stringshare *line_str = code_line->str;
+
+        if (code_line->indent_apply == EINA_FALSE)
+          {
+             eina_strbuf_append_printf(buf, "%s", line_str);
+          }
+        else
+          {
+             int cur_space = space + (code_line->indent_depth * TAB_SPACE);
+             if (cur_space <= 0)
+               {
+                  eina_strbuf_append_printf(buf, "%s", line_str);
+               }
+             else
+               {
+                  char *p = alloca(cur_space + 1);
+                  memset(p, ' ', cur_space);
+                  p[cur_space] = '\0';
+                  eina_strbuf_append_printf(buf, "%s%s", p, line_str);
+                  memset(p, 0x0, cur_space);
+               }
+          }
+        eina_stringshare_del(line_str);
+        free(code_line);
+     }
+   eina_list_free(code_line_list);
+
+   char *utf8_buf = eina_strbuf_string_steal(buf);
+   char *newline_ptr = utf8_buf;
+   line_cnt = 1;
+   newline_ptr = strstr(newline_ptr, "\n");
+   while (newline_ptr)
+     {
+        line_cnt++;
+        newline_ptr = strstr(newline_ptr + 1, "\n");
+     }
+
+   //FIXME: To improve performance, change logic not to translate text.
+   char *markup_buf = evas_textblock_text_utf8_to_markup(NULL, utf8_buf);
+   free(utf8_buf);
+
+   //Initialize cursor position to the beginning of the pasted string.
+   tb_cur_pos = evas_textblock_cursor_pos_get(cur_start);
+   evas_textblock_cursor_pos_set(cur_end, tb_cur_pos);
+
+   evas_object_textblock_text_markup_prepend(cur_start, markup_buf);
+
+   //Add data about formatted change into the redoundo queue.
+   redoundo_text_push(id->rd, markup_buf, tb_cur_pos, 0, EINA_TRUE);
+   free(markup_buf);
+
+   //Update cursor position to the end of the pasted string.
+   tb_cur_pos = evas_textblock_cursor_pos_get(cur_start);
+   evas_textblock_cursor_pos_set(cur_end, tb_cur_pos);
+
+end:
+   evas_textblock_cursor_free(cur_start);
+   return line_cnt;
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+indent_data *
+indent_init(Eina_Strbuf *strbuf, edit_data *ed)
+{
+   indent_data *id = malloc(sizeof(indent_data));
+   if (!id)
+     {
+        mem_fail_msg();
+        return NULL;
+     }
+   id->strbuf = strbuf;
+   id->entry = edit_entry_get(ed);
+   id->rd = edit_redoundo_get(ed);
+
+   if (!id->entry || !id->rd)
+     EINA_LOG_ERR("Should be called after edit entry and redoundo is initialized!");
+
+   return id;
+}
+
+void
+indent_term(indent_data *id)
+{
+   free(id);
+}
+
+int
+indent_space_get(indent_data *id)
+{
+   //Get the indentation depth
+   int pos = elm_entry_cursor_pos_get(id->entry);
+   char *src = elm_entry_markup_to_utf8(elm_entry_entry_get(id->entry));
+   int space = indent_depth_get(id, src, pos);
+   if (space < 0) space = 0;
+   space *= TAB_SPACE;
+   free(src);
+
+   return space;
+}
+
+void
+indent_delete_apply(indent_data *id, const char *del, int cur_line)
+{
+   if (del[0] != ' ') return;
+
+   Evas_Object *tb = elm_entry_textblock_get(id->entry);
+   Evas_Textblock_Cursor *cur = evas_object_textblock_cursor_new(tb);
+   evas_textblock_cursor_line_set(cur, cur_line - 1);
+   const char *text = evas_textblock_cursor_paragraph_text_get(cur);
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   char *last_markup = NULL;
+   Eina_Strbuf* diff = id->strbuf;
+   eina_strbuf_reset(diff);
+
+   int rd_cur_pos = evas_textblock_cursor_pos_get(cur);
+
+   int len = 0;
+   if (utf8) len = strlen(utf8);
+   if (len <= 0) goto end;
+
+   evas_textblock_cursor_paragraph_char_last(cur);
+   last_markup = evas_textblock_cursor_content_get(cur);
+   if (last_markup && !strncmp(last_markup, "<br/>", 5))
+     evas_textblock_cursor_char_prev(cur);
+
+   while (len > 0)
+     {
+        if (utf8[(len - 1)] == ' ')
+          {
+             eina_strbuf_append(diff, evas_textblock_cursor_content_get(cur));
+             evas_textblock_cursor_char_delete(cur);
+             evas_textblock_cursor_char_prev(cur);
+          }
+        else break;
+        len--;
+     }
+   redoundo_text_push(id->rd, eina_strbuf_string_get(diff), rd_cur_pos, 0,
+                      EINA_FALSE);
+   elm_entry_calc_force(id->entry);
+
+end:
+   evas_textblock_cursor_free(cur);
+   if (utf8) free(utf8);
+   if (last_markup) free(last_markup);
+}
+
+
+/* Check if indentation of input text is correct.
+   Return EINA_TRUE if indentation is correct.
+   Return EINA_FALSE if indentation is not correct. */
+Eina_Bool
+indent_text_check(indent_data *id EINA_UNUSED, const char *utf8)
+{
+   char *utf8_ptr = NULL;
+   char *utf8_end = NULL;
+   int utf8_size = 0;
+   int depth = 0;
+   int space = 0;
+   Eina_Bool nonspace_found = EINA_FALSE;
+   Eina_Bool comment_found = EINA_FALSE;
+   Eina_Bool macro_found = EINA_FALSE;
+
+   if (!utf8) return EINA_TRUE;
+
+   utf8_ptr = (char *)utf8;
+   utf8_size = strlen(utf8);
+   utf8_end = (char *)utf8 + utf8_size;
+
+   /* Check indentation spaces of each line.
+      Indentation spaces are checked within line comment and macro. */
+   while (utf8_ptr < utf8_end)
+     {
+        comment_found = EINA_FALSE;
+        macro_found = EINA_FALSE;
+
+        if (*utf8_ptr == '}')
+          {
+             depth--;
+             if (depth < 0) depth = 0;
+          }
+
+        //Tab is not allowed.
+        if (*utf8_ptr == '\t')
+          return EINA_FALSE;
+        else if (*utf8_ptr == ' ')
+          {
+             if (!nonspace_found)
+               space++;
+          }
+        else if (*utf8_ptr == '\n')
+          {
+             //Do not allow space only line.
+             if (!nonspace_found && (space > 0))
+               return EINA_FALSE;
+
+             //Do not allow newline at the end.
+             if (utf8_ptr == utf8_end - 1)
+               return EINA_FALSE;
+
+             space = 0;
+             nonspace_found = EINA_FALSE;
+          }
+        else if (*utf8_ptr != '\r')
+          {
+             char *comment_end = NULL;
+
+             //Check line comment
+             if ((*utf8_ptr == '/') && (utf8_ptr + 1 < utf8_end))
+               {
+                  //Start of single line comment.
+                  if (*(utf8_ptr + 1) == '/')
+                    {
+                       comment_found = EINA_TRUE;
+
+                       comment_end = strstr(utf8_ptr + 2, "\n");
+                       if (comment_end) comment_end--;
+                    }
+                  //Start of multi line comment.
+                  else if (*(utf8_ptr + 1) == '*')
+                    {
+                       comment_found = EINA_TRUE;
+
+                       comment_end = strstr(utf8_ptr + 2, "*/");
+                       if (comment_end) comment_end++;
+                    }
+
+                  if (comment_found)
+                    {
+                       if (comment_end)
+                         utf8_ptr = comment_end;
+                       else
+                         return EINA_TRUE;
+                    }
+               }
+
+             //Check macro
+             else if (*utf8_ptr == '#')
+               {
+                  macro_found = EINA_TRUE;
+
+                  char *macro_end = utf8_ptr;
+                  while (macro_end)
+                    {
+                       char *backslash = strstr(macro_end + 1, "\\");
+                       macro_end = strstr(macro_end + 1, "\n");
+                       if (macro_end)
+                         {
+                            if (!backslash || (macro_end < backslash))
+                              break;
+                         }
+                    }
+
+                  if (macro_end)
+                    {
+                       macro_end--;
+                       utf8_ptr = macro_end;
+                    }
+                  else
+                    return EINA_TRUE;
+               }
+
+             if (comment_found || macro_found)
+               {
+                  if (!nonspace_found)
+                    nonspace_found = EINA_TRUE;
+               }
+             //No line comment and No macro.
+             else
+               {
+                  if (!nonspace_found)
+                    {
+                       if (space != depth * TAB_SPACE)
+                         return EINA_FALSE;
+
+                       nonspace_found = EINA_TRUE;
+                    }
+
+                  if (*utf8_ptr == '}')
+                    {
+                       if ((utf8_ptr + 1 < utf8_end) &&
+                           (*(utf8_ptr + 1) != '\n'))
+                         return EINA_FALSE;
+                    }
+                  else if (*utf8_ptr == ';')
+                    {
+                       if (utf8_ptr + 1 < utf8_end &&
+                           *(utf8_ptr + 1) != '\n')
+                         return EINA_FALSE;
+                    }
+
+                  if (*utf8_ptr == '{')
+                    {
+                       char *bracket_right_ptr = utf8_ptr + 1;
+                       while (bracket_right_ptr < utf8_end)
+                         {
+                            if (*bracket_right_ptr != ' ' &&
+                                *bracket_right_ptr != '\t')
+                              break;
+                            bracket_right_ptr++;
+                         }
+                       if (bracket_right_ptr < utf8_end &&
+                           *bracket_right_ptr != '\n')
+                         {
+                            //Check block name after '{'.
+                            Eina_Bool block_name_found = EINA_FALSE;
+
+                            if (*bracket_right_ptr == '\"')
+                              block_name_found = EINA_TRUE;
+                            else if (bracket_right_ptr + 4 < utf8_end)
+                              {
+                                 if (!strncmp(bracket_right_ptr,
+                                              "name:", 5))
+                                   block_name_found = EINA_TRUE;
+                                 else if (!strncmp(bracket_right_ptr,
+                                                   "state:", 5))
+                                   block_name_found = EINA_TRUE;
+                              }
+
+                            if (!block_name_found)
+                              return EINA_FALSE;
+                         }
+                    }
+               }
+          }
+
+        if (!comment_found && !macro_found && (*utf8_ptr == '{'))
+          depth++;
+
+        utf8_ptr++;
+     }
+
+   return EINA_TRUE;
+}
+
+/* Create indented markup text from input utf8 text.
+   Count the number of lines of indented text.
+   Return created indented markup text. */
+char *
+indent_text_create(indent_data *id, const char *utf8, int *indented_line_cnt)
+{
+   if (!utf8)
+     {
+        if (indented_line_cnt) *indented_line_cnt = 0;
+        return NULL;
+     }
+
+   Eina_List *code_line_list = indent_code_line_list_create(id, utf8);
+   if (!code_line_list)
+     {
+        if (indented_line_cnt) *indented_line_cnt = 0;
+        return NULL;
+     }
+
+   indent_line *code_line = NULL;
+   Eina_List *l = NULL;
+   Eina_Strbuf *buf = id->strbuf;
+   eina_strbuf_reset(buf);
+
+   EINA_LIST_FOREACH(code_line_list, l, code_line)
+     {
+        Eina_Stringshare *line_str = code_line->str;
+
+        if (!code_line->indent_apply)
+          {
+             eina_strbuf_append_printf(buf, "%s", line_str);
+          }
+        else
+          {
+             int space = code_line->indent_depth * TAB_SPACE;
+             if (space <= 0)
+               {
+                  eina_strbuf_append_printf(buf, "%s", line_str);
+               }
+             else
+               {
+                  char *p = alloca(space + 1);
+                  memset(p, ' ', space);
+                  p[space] = '\0';
+                  eina_strbuf_append_printf(buf, "%s%s", p, line_str);
+                  memset(p, 0x0, space);
+               }
+          }
+        eina_stringshare_del(line_str);
+        free(code_line);
+     }
+   eina_list_free(code_line_list);
+
+   char *utf8_buf = eina_strbuf_string_steal(buf);
+   char *newline_ptr = utf8_buf;
+   int line_cnt = 1;
+   newline_ptr = strstr(newline_ptr, "\n");
+   while (newline_ptr)
+     {
+        line_cnt++;
+        newline_ptr = strstr(newline_ptr + 1, "\n");
+     }
+
+   //FIXME: This translation may cause low performance.
+   char *indented_markup = evas_textblock_text_utf8_to_markup(NULL, utf8_buf);
+   free(utf8_buf);
+
+   if (indented_line_cnt) *indented_line_cnt = line_cnt;
+   return indented_markup;
+}
+
+int
+indent_insert_apply(indent_data *id, const char *insert, int cur_line)
+{
+   int len = strlen(insert);
+   if (len == 0)
+     {
+        return 0;
+     }
+   else if (len == 1)
+     {
+        if (insert[0] == '}')
+          indent_insert_bracket_case(id, cur_line);
+        return 0;
+     }
+   else
+     {
+        if (!strcmp(insert, EOL))
+          {
+             indent_insert_br_case(id);
+             return 1;
+          }
+        else if (!strcmp(insert, TAB))
+          {
+             indent_insert_tab_case(id);
+             return 0;
+          }
+        else if (!strcmp(insert, QUOT))
+          return 0;
+        else if (!strcmp(insert, LESS))
+          return 0;
+        else if (!strcmp(insert, GREATER))
+          return 0;
+        else if (!strcmp(insert, AMP))
+          return 0;
+        else
+          {
+             int increase = indent_text_auto_format(id, insert);
+             if (increase > 0) increase--;
+             return increase;
+          }
+     }
+}
diff --git a/src/lib/template.c b/src/lib/template.c
new file mode 100644 (file)
index 0000000..4e807cf
--- /dev/null
@@ -0,0 +1,1097 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+#include "template_code.h"
+
+//Tizen Only : Support Tizen version 2.3 for 2.x (2.3, 2.3.1, 2.3.2, 2.4)
+#include "template_code_2.3.h"
+//
+
+const char *NAME_SEED = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+const int NAME_SEED_LEN = 52;
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+//Tizen Only : Support Tizen version 2.3 for 2.x (2.3, 2.3.1, 2.3.2, 2.4)
+static Eina_Bool template_insert_2_3(edit_data *ed, char *syntax, size_t n);
+static Eina_Bool template_part_insert_2_3(edit_data *ed, Edje_Part_Type part_type, Enventor_Template_Insert_Type insert_type, Eina_Bool fixed_w, Eina_Bool fixed_h, char *rel1_x_to, char *rel1_y_to, char *rel2_x_to, char *rel2_y_to, float align_x, float align_y, int min_w, int min_h, float rel1_x, float rel1_y, float rel2_x, float rel2_y, const Eina_Stringshare *group_name, char *syntax, size_t n);
+//
+
+static void
+template_random_string_create(char *paragh, char *buf, int size)
+{
+   int i, paragh_len = 0;
+
+   if (paragh)
+     paragh_len = strlen(paragh);
+
+   if (paragh_len > 0)
+     {
+        memcpy(buf, paragh, paragh_len);
+        buf[paragh_len++] = '_';
+     }
+
+   for (i = 0; i < size; i++)
+     buf[paragh_len + i] = NAME_SEED[(rand() % NAME_SEED_LEN)];
+   buf[paragh_len + i] = '\0';
+}
+
+static void
+image_description_add(edit_data *ed)
+{
+   int cursor_pos;
+   Evas_Object * edit_entry = edit_entry_get(ed);
+
+   Evas_Coord cursor_pos_to_restore = elm_entry_cursor_pos_get(edit_entry_get(ed));
+
+   Eina_Bool images_block = parser_images_pos_get(edit_entry, &cursor_pos);
+   if (cursor_pos == -1) return;
+
+   elm_entry_cursor_pos_set(edit_entry, cursor_pos);
+   elm_entry_cursor_line_begin_set(edit_entry);
+   int cursor_pos1 = elm_entry_cursor_pos_get(edit_entry);
+   int cursor_pos2;
+   if (images_block)
+     {
+        // the first line of TEMPLATE_IMG to check it is already exist
+        const char *template_image_str = TEMPLATE_IMG[0];
+        if (parser_is_image_name(edit_entry, template_image_str))
+          cursor_pos2 = cursor_pos1;
+        else
+          {
+             //Tizen Only : Support Tizen version
+             //template_insert(ed, NULL, 0);
+             template_insert(ed, NULL, 0, NULL);
+             //
+             cursor_pos2 = elm_entry_cursor_pos_get(edit_entry);
+          }
+     }
+   else
+     {
+        int space = edit_cur_indent_depth_get(ed);
+
+        //Alloc Empty spaces
+        char *p = alloca(space + 1);
+        memset(p, ' ', space);
+        p[space] = '\0';
+
+        int i;
+        for (i = 0; i < (TEMPLATE_IMG_BLOCK_LINE_CNT - 1); i++)
+          {
+             elm_entry_entry_insert(edit_entry, p);
+             elm_entry_entry_insert(edit_entry, TEMPLATE_IMG_BLOCK[i]);
+          }
+        elm_entry_entry_insert(edit_entry, p);
+        elm_entry_entry_insert(edit_entry, TEMPLATE_IMG_BLOCK[i]);
+
+        edit_line_increase(ed, TEMPLATE_IMG_BLOCK_LINE_CNT);
+        cursor_pos2 = elm_entry_cursor_pos_get(edit_entry);
+        edit_redoundo_region_push(ed, cursor_pos1, cursor_pos2);
+     }
+   cursor_pos_to_restore += (cursor_pos2 - cursor_pos1);
+   elm_entry_cursor_pos_set(edit_entry, cursor_pos_to_restore);
+}
+
+static void
+textblock_style_add(edit_data *ed, const char *style_name)
+{
+   int cursor_pos;
+   Evas_Object * edit_entry = edit_entry_get(ed);
+   Eina_Bool styles_block = parser_styles_pos_get(edit_entry, &cursor_pos);
+   if (cursor_pos == -1) return;
+   int cursor_pos_to_restore = elm_entry_cursor_pos_get(edit_entry_get(ed));
+
+   elm_entry_cursor_pos_set(edit_entry, cursor_pos);
+   elm_entry_cursor_line_begin_set(edit_entry);
+   int cursor_pos1 = elm_entry_cursor_pos_get(edit_entry);
+
+   int space = edit_cur_indent_depth_get(ed);
+   if (styles_block)
+      space -= TAB_SPACE;
+
+   //Alloc Empty spaces
+   char *p = alloca(space + 1);
+   memset(p, ' ', space);
+   p[space] = '\0';
+
+   if (!styles_block)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        elm_entry_entry_insert(edit_entry, TEMPLATE_TEXTBLOCK_STYLE_BLOCK[0]);
+     }
+
+   int buf_len = strlen(TEMPLATE_TEXTBLOCK_STYLE_BLOCK[1]) + strlen(style_name);
+   char *buf = malloc(buf_len);
+   snprintf(buf, buf_len, TEMPLATE_TEXTBLOCK_STYLE_BLOCK[1], style_name);
+   elm_entry_entry_insert(edit_entry, p);
+   elm_entry_entry_insert(edit_entry, buf);
+   elm_entry_entry_insert(edit_entry, p);
+   elm_entry_entry_insert(edit_entry, TEMPLATE_TEXTBLOCK_STYLE_BLOCK[2]);
+   elm_entry_entry_insert(edit_entry, p);
+   elm_entry_entry_insert(edit_entry, TEMPLATE_TEXTBLOCK_STYLE_BLOCK[3]);
+   free(buf);
+
+   if (!styles_block)
+     {
+       elm_entry_entry_insert(edit_entry, p);
+       elm_entry_entry_insert(edit_entry, TEMPLATE_TEXTBLOCK_STYLE_BLOCK[4]);
+     }
+
+   int line_inc = TEMPLATE_TEXTBLOCK_STYLE_LINE_CNT;
+   if (styles_block) line_inc -= 2;
+   edit_line_increase(ed, line_inc);
+
+   int cursor_pos2 = elm_entry_cursor_pos_get(edit_entry);
+   edit_redoundo_region_push(ed, cursor_pos1, cursor_pos2);
+
+   cursor_pos_to_restore += (cursor_pos2 - cursor_pos1);
+   elm_entry_cursor_pos_set(edit_entry, cursor_pos_to_restore);
+}
+
+static int
+template_part_insert_cursor_pos_set(Evas_Object *edit_entry,
+                                    Enventor_Template_Insert_Type insert_type,
+                                    const Eina_Stringshare *group_name)
+{
+   int cursor_pos = -1;
+   if (insert_type == ENVENTOR_TEMPLATE_INSERT_LIVE_EDIT)
+     {
+        cursor_pos = parser_end_of_parts_block_pos_get(edit_entry, group_name);
+        if (cursor_pos != -1)
+          elm_entry_cursor_pos_set(edit_entry, cursor_pos);
+     }
+   else
+     {
+        cursor_pos = elm_entry_cursor_pos_get(edit_entry);
+     }
+   elm_entry_cursor_line_begin_set(edit_entry);
+   return cursor_pos;
+}
+
+static void
+select_random_name(Evas_Object *entry, const char* first_line,
+                   const char* random_name, int space)
+{
+   char *matched = strstr(first_line, random_name);
+   if (matched)
+     {
+        int random_name_pos = matched - first_line;
+        random_name_pos += space;
+        elm_entry_cursor_line_begin_set(entry);
+        int line_start = elm_entry_cursor_pos_get(entry);
+        int start = line_start + random_name_pos;
+        int end = start + strlen(random_name);
+        elm_entry_select_region_set(entry, start, end);
+     }
+}
+
+static const char *
+_posix_fp(double fp, double fp2, const char *fmt)
+{
+   static Eina_Strbuf *strbuf = NULL;
+   static char storage[16];
+   struct lconv *lconv;
+
+   if (EINA_UNLIKELY(strbuf == NULL))
+     {
+        strbuf = eina_strbuf_manage_new_length(storage, sizeof(storage));
+        if (EINA_UNLIKELY(!strbuf))
+          {
+             storage[0] = '\0';
+             return storage;
+          }
+     }
+
+   lconv = localeconv();
+
+   eina_strbuf_reset(strbuf);
+   eina_strbuf_append_printf(strbuf, fmt, fp);
+   eina_strbuf_append(strbuf, " ");
+   eina_strbuf_append_printf(strbuf, fmt, fp2);
+   eina_strbuf_replace_all(strbuf, lconv->decimal_point, ".");
+
+   return eina_strbuf_string_get(strbuf);
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+//Tizen Only : Support Tizen version
+//Eina_Bool
+//template_part_insert(edit_data *ed, Edje_Part_Type part_type,
+//                     Enventor_Template_Insert_Type insert_type,
+//                     Eina_Bool fixed_w, Eina_Bool fixed_h,
+//                     char *rel1_x_to, char *rel1_y_to,
+//                     char *rel2_x_to, char *rel2_y_to,
+//                     float align_x, float align_y, int min_w, int min_h,
+//                     float rel1_x, float rel1_y, float rel2_x, float rel2_y,
+//                     const Eina_Stringshare *group_name, char *syntax, size_t n)
+Eina_Bool
+template_part_insert(edit_data *ed, Edje_Part_Type part_type,
+                     Enventor_Template_Insert_Type insert_type,
+                     Eina_Bool fixed_w, Eina_Bool fixed_h,
+                     char *rel1_x_to, char *rel1_y_to,
+                     char *rel2_x_to, char *rel2_y_to,
+                     float align_x, float align_y, int min_w, int min_h,
+                     float rel1_x, float rel1_y, float rel2_x, float rel2_y,
+                     const Eina_Stringshare *group_name, char *syntax, size_t n,
+                     const char *tizen_version)
+//
+{
+   //Tizen Only : Support Tizen version 2.3 for 2.x (2.3, 2.3.1, 2.3.2, 2.4)
+   if (tizen_version)
+     {
+        if (!strncmp(tizen_version, "2.", strlen("2.")))
+          return template_part_insert_2_3(ed, part_type, insert_type, fixed_w,
+                                          fixed_h, rel1_x_to, rel1_y_to,
+                                          rel2_x_to, rel2_y_to, align_x,
+                                          align_y, min_w, min_h, rel1_x, rel1_y,
+                                          rel2_x, rel2_y, group_name, syntax,
+                                          n);
+     }
+   //
+
+   Evas_Object *edit_entry = edit_entry_get(ed);
+
+   if (insert_type == ENVENTOR_TEMPLATE_INSERT_LIVE_EDIT)
+     group_name = view_group_name_get(VIEW_DATA);
+
+   int cursor_pos = template_part_insert_cursor_pos_set(edit_entry, insert_type,
+                                                        group_name);
+   if (cursor_pos == -1) return EINA_FALSE;
+
+   int cursor_pos1 = elm_entry_cursor_pos_get(edit_entry);
+   int space = edit_cur_indent_depth_get(ed);
+
+   //Alloc Empty spaces
+   char *p = alloca(space + 1);
+   memset(p, ' ', space);
+   p[space] = '\0';
+
+   int line_cnt = 0;
+   char **t = NULL;
+   char buf[64];
+   char type_name[20] = {0, };
+
+   switch(part_type)
+     {
+        case EDJE_PART_TYPE_RECTANGLE:
+           line_cnt = TEMPLATE_PART_RECT_LINE_CNT;
+           t = (char **) &TEMPLATE_PART_RECT;
+           strncpy(type_name, "rect\0", 5);
+           break;
+        case EDJE_PART_TYPE_TEXT:
+           line_cnt = TEMPLATE_PART_TEXT_LINE_CNT;
+           t = (char **) &TEMPLATE_PART_TEXT;
+           strncpy(type_name, "text\0", 5);
+           break;
+        case EDJE_PART_TYPE_SWALLOW:
+           line_cnt = TEMPLATE_PART_SWALLOW_LINE_CNT;
+           t = (char **) &TEMPLATE_PART_SWALLOW;
+           strncpy(type_name, "swallow\0", 8);
+           break;
+        case EDJE_PART_TYPE_TEXTBLOCK:
+           line_cnt = TEMPLATE_PART_TEXTBLOCK_LINE_CNT;
+           t = (char **) &TEMPLATE_PART_TEXTBLOCK;
+           strncpy(type_name, "textblock\0", 10);
+           break;
+        case EDJE_PART_TYPE_SPACER:
+           line_cnt = TEMPLATE_PART_SPACER_LINE_CNT;
+           t = (char **) &TEMPLATE_PART_SPACER;
+           strncpy(type_name, "spacer\0", 7);
+           break;
+        case EDJE_PART_TYPE_IMAGE:
+        case EDJE_PART_TYPE_NONE:
+        case EDJE_PART_TYPE_GRADIENT:
+        case EDJE_PART_TYPE_GROUP:
+        case EDJE_PART_TYPE_BOX:
+        case EDJE_PART_TYPE_TABLE:
+        case EDJE_PART_TYPE_EXTERNAL:
+        case EDJE_PART_TYPE_PROXY:
+        case EDJE_PART_TYPE_MESH_NODE:
+        case EDJE_PART_TYPE_LIGHT:
+        case EDJE_PART_TYPE_CAMERA:
+        case EDJE_PART_TYPE_SNAPSHOT:
+        //Tizen Only
+        //case EDJE_PART_TYPE_VECTOR:
+        case EDJE_PART_TYPE_LAST:
+           line_cnt = TEMPLATE_PART_IMAGE_LINE_CNT;
+           t = (char **) &TEMPLATE_PART_IMAGE;
+           strncpy(type_name, "image\0", 6);
+           break;
+     }
+
+   //Insert first line of the part block with generated name.
+   char first_line[40];
+   char random_name[15];
+   template_random_string_create(type_name, random_name, 4);
+
+   elm_entry_entry_insert(edit_entry, p);
+   snprintf(first_line, 40, "%s { \"%s\";<br/>", type_name, random_name);
+   elm_entry_entry_insert(edit_entry, first_line);
+
+   //Insert part body
+   int i;
+   for (i = 0; i < line_cnt; i++)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        elm_entry_entry_insert(edit_entry, t[i]);
+     }
+
+   if (part_type == EDJE_PART_TYPE_TEXTBLOCK)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      text.style: \"%s\";<br/>",
+                 random_name);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt++;
+     }
+
+   //Apply align values
+   elm_entry_entry_insert(edit_entry, p);
+   snprintf(buf, sizeof(buf), "      align: %s;<br/>",
+            _posix_fp(align_x, align_y, "%.1f"));
+   elm_entry_entry_insert(edit_entry, buf);
+   line_cnt++;
+
+   //Width is fixed or Height is fixed
+   if (fixed_w || fixed_h)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      fixed: %d %d;<br/>", fixed_w, fixed_h);
+        elm_entry_entry_insert(edit_entry, buf);
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      min: %d %d;<br/>", min_w, min_h);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt += 2;
+     }
+
+   //If there are some relative_to part then insert relative_to 
+   if (rel1_x_to)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel1.to_x: \"%s\";<br/>", rel1_x_to);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt++;
+     }
+   if (rel1_y_to)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel1.to_y: \"%s\";<br/>", rel1_y_to);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt++;
+     }
+   if (rel2_x_to)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel2.to_x: \"%s\";<br/>", rel2_x_to);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt++;
+     }
+   if (rel2_y_to)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel2.to_y: \"%s\";<br/>", rel2_y_to);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt++;
+     }
+
+   //Insert relatives
+   elm_entry_entry_insert(edit_entry, p);
+
+   //These conditions check whether the relative number is 4 places of decimals or not
+   //Condition 1: relative values are 4 places of decimals
+   if ((int)(rel1_x * 10000 + 0.5) % 100 ||
+       (int)(rel1_y * 10000 + 0.5) % 100 ||
+       (int)(rel2_x * 10000 + 0.5) % 100 ||
+       (int)(rel2_y * 10000 + 0.5) % 100)
+     {
+        snprintf(buf, sizeof(buf), "      rel1.relative: %s;<br/>",
+                 _posix_fp(rel1_x, rel1_y, "%.4f"));
+        elm_entry_entry_insert(edit_entry, buf);
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel2.relative: %s;<br/>",
+                 _posix_fp(rel2_x, rel2_y, "%.4f"));
+     }
+   //Condition 2: relative values are 2 places of decimals
+   else
+     {
+        snprintf(buf, sizeof(buf), "      rel1.relative: %s;<br/>",
+                 _posix_fp(rel1_x, rel1_y, "%.2f"));
+        elm_entry_entry_insert(edit_entry, buf);
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel2.relative: %s;<br/>",
+                 _posix_fp(rel2_x, rel2_y, "%.2f"));
+     }
+
+   elm_entry_entry_insert(edit_entry, buf);
+
+   //Insert the tale of the part that contains closing brackets
+   t = (char **) &TEMPLATE_PART_TALE;
+   for (i = 0; i < TEMPLATE_PART_TALE_LINE_CNT; i++)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        elm_entry_entry_insert(edit_entry, t[i]);
+     }
+
+   //Add a new line in the end of inserted template
+   elm_entry_entry_insert(edit_entry, "<br/>");
+
+   //Increase (part name + body + relatives + tail) line
+   int line_inc = 1 + line_cnt + 2 + TEMPLATE_PART_TALE_LINE_CNT;
+   edit_line_increase(ed, line_inc);
+
+   int cursor_pos2 = elm_entry_cursor_pos_get(edit_entry);
+   edit_redoundo_region_push(ed, cursor_pos1, cursor_pos2);
+
+   elm_entry_cursor_pos_set(edit_entry, cursor_pos);
+
+   if (part_type == EDJE_PART_TYPE_IMAGE)
+     image_description_add(ed);
+   else if (part_type == EDJE_PART_TYPE_TEXTBLOCK)
+     textblock_style_add(ed, random_name);
+
+   //select random name
+   select_random_name(edit_entry, first_line, random_name, space);
+
+   edit_syntax_color_partial_apply(ed, 0);
+   edit_changed_set(ed, EINA_TRUE);
+
+   strncpy(syntax, type_name, n);
+
+   return EINA_TRUE;
+}
+
+//Tizen Only : Support Tizen version
+//Eina_Bool
+//template_insert(edit_data *ed, char *syntax, size_t n)
+Eina_Bool
+template_insert(edit_data *ed, char *syntax, size_t n,
+                const char *tizen_version)
+//
+{
+   //Tizen Only : Support Tizen version 2.3 for 2.x (2.3, 2.3.1, 2.3.2, 2.4)
+   if (tizen_version)
+     {
+        if (!strncmp(tizen_version, "2.", strlen("2.")))
+          return template_insert_2_3(ed, syntax, n);
+     }
+   //
+
+   Evas_Object *entry = edit_entry_get(ed);
+   Eina_Stringshare *paragh = edit_cur_paragh_get(ed);
+
+   Eina_Bool ret = EINA_FALSE;
+   if (!paragh) return EINA_FALSE;
+
+   //Move cursor position to the beginning of the next line to apply indentation
+   elm_entry_cursor_line_end_set(entry);
+   int cursor_line_end_pos = elm_entry_cursor_pos_get(entry);
+   elm_entry_cursor_pos_set(entry, cursor_line_end_pos + 1);
+
+   if (!strcmp(paragh, "parts"))
+     {
+        //Tizen Only : Support Tizen version
+        //ret = template_part_insert(ed, EDJE_PART_TYPE_IMAGE,
+        //                           ENVENTOR_TEMPLATE_INSERT_DEFAULT,
+        //                           EINA_FALSE, EINA_FALSE,
+        //                           NULL, NULL, NULL, NULL,
+        //                           0.5, 0.5, 0, 0,
+        //                           REL1_X, REL1_Y, REL2_X, REL2_Y, NULL, syntax,
+        //                           n);
+        ret = template_part_insert(ed, EDJE_PART_TYPE_IMAGE,
+                                   ENVENTOR_TEMPLATE_INSERT_DEFAULT,
+                                   EINA_FALSE, EINA_FALSE,
+                                   NULL, NULL, NULL, NULL,
+                                   0.5, 0.5, 0, 0,
+                                   REL1_X, REL1_Y, REL2_X, REL2_Y, NULL, syntax,
+                                   n, NULL);
+        //
+        goto end;
+     }
+
+   int line_cnt;
+   char **t = NULL;
+   char first_line[42] = {0, };
+   char random_name[9];
+   int space = edit_cur_indent_depth_get(ed);
+
+   //Alloc Empty spaces
+   char *p = alloca(space + 1);
+   memset(p, ' ', space);
+   p[space] = '\0';
+
+   template_random_string_create(NULL, random_name, 8);
+   elm_entry_cursor_line_begin_set(entry);
+
+   if (!strcmp(paragh, "part") || !strcmp(paragh, "image") ||
+       !strcmp(paragh, "rect") || !strcmp(paragh, "swallow") ||
+       !strcmp(paragh, "text") || !strcmp(paragh, "textblock"))
+     {
+        line_cnt = TEMPLATE_DESC_LINE_CNT;
+        t = (char **) &TEMPLATE_DESC;
+        strncpy(syntax, "Description", n);
+        snprintf(first_line, 40, "desc { \"%s\";<br/>", random_name);
+     }
+   else if (!strcmp(paragh, "spacer"))
+     {
+        line_cnt = TEMPLATE_DESC_SPACER_LINE_CNT;
+        t = (char **) &TEMPLATE_DESC_SPACER;
+        strncpy(syntax, "Description", n);
+        snprintf(first_line, 40, "desc { \"%s\";<br/>", random_name);
+     }
+   else if (!strcmp(paragh, "programs"))
+     {
+        line_cnt = TEMPLATE_PROG_LINE_CNT;
+        t = (char **) &TEMPLATE_PROG;
+        strncpy(syntax, "Program", n);
+        snprintf(first_line, 40, "program { \"%s\";<br/>", random_name);
+     }
+   else if (!strcmp(paragh, "images"))
+     {
+        line_cnt = TEMPLATE_IMG_LINE_CNT;
+        t = (char **) &TEMPLATE_IMG;
+        strncpy(syntax, "Image File", n);
+     }
+   else if (!strcmp(paragh, "collections"))
+     {
+        line_cnt = TEMPLATE_GROUP_LINE_CNT;
+        t = (char **) &TEMPLATE_GROUP;
+        strncpy(syntax, "Group", n);
+        snprintf(first_line, 40, "group { \"%s\";<br/>", random_name);
+     }
+
+   if (!t) goto end;
+
+   int cursor_pos = elm_entry_cursor_pos_get(entry);
+   int cursor_pos1 = elm_entry_cursor_pos_get(entry);
+
+   if (strcmp(paragh, "images"))
+     {
+        elm_entry_entry_insert(entry, p);
+        elm_entry_entry_insert(entry, first_line);
+     }
+
+   int i;
+   for (i = 0; i < (line_cnt - 1); i++)
+     {
+        elm_entry_entry_insert(entry, p);
+        elm_entry_entry_insert(entry, t[i]);
+     }
+   elm_entry_entry_insert(entry, p);
+   elm_entry_entry_insert(entry, t[i]);
+
+   //Add a new line in the end of inserted template
+   elm_entry_entry_insert(entry, "<br/>");
+
+   //Increase (template + last new line) line
+   edit_line_increase(ed, line_cnt + 1);
+
+   int cursor_pos2 = elm_entry_cursor_pos_get(entry);
+   edit_redoundo_region_push(ed, cursor_pos1, cursor_pos2);
+
+   if (!strcmp(paragh, "images"))
+     cursor_pos += (cursor_pos2 - cursor_pos1);
+
+   elm_entry_cursor_pos_set(entry, cursor_pos);
+
+   //select random name
+   select_random_name(entry, first_line, random_name, space);
+
+   edit_syntax_color_partial_apply(ed, 0);
+   edit_changed_set(ed, EINA_TRUE);
+
+   ret = EINA_TRUE;
+
+end:
+   eina_stringshare_del(paragh);
+
+   return ret;
+}
+
+
+
+
+//Tizen Only : Support Tizen version 2.3 for 2.x (2.3, 2.3.1, 2.3.2, 2.4)
+static void
+image_description_add_2_3(edit_data *ed)
+{
+   int cursor_pos;
+   Evas_Object * edit_entry = edit_entry_get(ed);
+
+   Evas_Coord cursor_pos_to_restore = elm_entry_cursor_pos_get(edit_entry_get(ed));
+
+   Eina_Bool images_block = parser_images_pos_get(edit_entry, &cursor_pos);
+   if (cursor_pos == -1) return;
+
+   elm_entry_cursor_pos_set(edit_entry, cursor_pos);
+   elm_entry_cursor_line_begin_set(edit_entry);
+   int cursor_pos1 = elm_entry_cursor_pos_get(edit_entry);
+   int cursor_pos2;
+   if (images_block)
+     {
+        // the first line of TEMPLATE_2_3_IMG to check it is already exist
+        const char *template_image_str = TEMPLATE_2_3_IMG[0];
+        if (parser_is_image_name(edit_entry, template_image_str))
+          cursor_pos2 = cursor_pos1;
+        else
+          {
+             template_insert_2_3(ed, NULL, 0);
+             cursor_pos2 = elm_entry_cursor_pos_get(edit_entry);
+          }
+     }
+   else
+     {
+        int space = edit_cur_indent_depth_get(ed);
+
+        //Alloc Empty spaces
+        char *p = alloca(space + 1);
+        memset(p, ' ', space);
+        p[space] = '\0';
+
+        int i;
+        for (i = 0; i < (TEMPLATE_2_3_IMG_BLOCK_LINE_CNT - 1); i++)
+          {
+             elm_entry_entry_insert(edit_entry, p);
+             elm_entry_entry_insert(edit_entry, TEMPLATE_2_3_IMG_BLOCK[i]);
+          }
+        elm_entry_entry_insert(edit_entry, p);
+        elm_entry_entry_insert(edit_entry, TEMPLATE_2_3_IMG_BLOCK[i]);
+
+        edit_line_increase(ed, TEMPLATE_2_3_IMG_BLOCK_LINE_CNT);
+        cursor_pos2 = elm_entry_cursor_pos_get(edit_entry);
+        edit_redoundo_region_push(ed, cursor_pos1, cursor_pos2);
+     }
+   cursor_pos_to_restore += (cursor_pos2 - cursor_pos1);
+   elm_entry_cursor_pos_set(edit_entry, cursor_pos_to_restore);
+}
+
+//Tizen Only : Support Tizen version 2.3 for 2.x (2.3, 2.3.1, 2.3.2, 2.4)
+static void
+textblock_style_add_2_3(edit_data *ed, const char *style_name)
+{
+   int cursor_pos;
+   Evas_Object * edit_entry = edit_entry_get(ed);
+   Eina_Bool styles_block = parser_styles_pos_get(edit_entry, &cursor_pos);
+   if (cursor_pos == -1) return;
+   int cursor_pos_to_restore = elm_entry_cursor_pos_get(edit_entry_get(ed));
+
+   elm_entry_cursor_pos_set(edit_entry, cursor_pos);
+   elm_entry_cursor_line_begin_set(edit_entry);
+   int cursor_pos1 = elm_entry_cursor_pos_get(edit_entry);
+
+   int space = edit_cur_indent_depth_get(ed);
+   if (styles_block)
+      space -= TAB_SPACE;
+
+   //Alloc Empty spaces
+   char *p = alloca(space + 1);
+   memset(p, ' ', space);
+   p[space] = '\0';
+
+   if (!styles_block)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        elm_entry_entry_insert(edit_entry, TEMPLATE_2_3_TEXTBLOCK_STYLE_BLOCK[0]);
+     }
+
+   int buf_len = strlen(TEMPLATE_2_3_TEXTBLOCK_STYLE_BLOCK[1]) + strlen(style_name);
+   char *buf = malloc(buf_len);
+   snprintf(buf, buf_len, TEMPLATE_2_3_TEXTBLOCK_STYLE_BLOCK[1], style_name);
+   elm_entry_entry_insert(edit_entry, p);
+   elm_entry_entry_insert(edit_entry, buf);
+   elm_entry_entry_insert(edit_entry, p);
+   elm_entry_entry_insert(edit_entry, TEMPLATE_2_3_TEXTBLOCK_STYLE_BLOCK[2]);
+   elm_entry_entry_insert(edit_entry, p);
+   elm_entry_entry_insert(edit_entry, TEMPLATE_2_3_TEXTBLOCK_STYLE_BLOCK[3]);
+   free(buf);
+
+   if (!styles_block)
+     {
+       elm_entry_entry_insert(edit_entry, p);
+       elm_entry_entry_insert(edit_entry, TEMPLATE_2_3_TEXTBLOCK_STYLE_BLOCK[4]);
+     }
+
+   int line_inc = TEMPLATE_2_3_TEXTBLOCK_STYLE_LINE_CNT;
+   if (styles_block) line_inc -= 2;
+   edit_line_increase(ed, line_inc);
+
+   int cursor_pos2 = elm_entry_cursor_pos_get(edit_entry);
+   edit_redoundo_region_push(ed, cursor_pos1, cursor_pos2);
+
+   cursor_pos_to_restore += (cursor_pos2 - cursor_pos1);
+   elm_entry_cursor_pos_set(edit_entry, cursor_pos_to_restore);
+}
+
+//Tizen Only : Support Tizen version 2.3 for 2.x (2.3, 2.3.1, 2.3.2, 2.4)
+static Eina_Bool
+template_part_insert_2_3(edit_data *ed, Edje_Part_Type part_type,
+                         Enventor_Template_Insert_Type insert_type,
+                         Eina_Bool fixed_w, Eina_Bool fixed_h,
+                         char *rel1_x_to, char *rel1_y_to,
+                         char *rel2_x_to, char *rel2_y_to,
+                         float align_x, float align_y, int min_w, int min_h,
+                         float rel1_x, float rel1_y, float rel2_x, float rel2_y,
+                         const Eina_Stringshare *group_name, char *syntax,
+                         size_t n)
+{
+   Evas_Object *edit_entry = edit_entry_get(ed);
+
+   if (insert_type == ENVENTOR_TEMPLATE_INSERT_LIVE_EDIT)
+     group_name = view_group_name_get(VIEW_DATA);
+
+   int cursor_pos = template_part_insert_cursor_pos_set(edit_entry, insert_type,
+                                                        group_name);
+   if (cursor_pos == -1) return EINA_FALSE;
+
+   int cursor_pos1 = elm_entry_cursor_pos_get(edit_entry);
+   int space = edit_cur_indent_depth_get(ed);
+
+   //Alloc Empty spaces
+   char *p = alloca(space + 1);
+   memset(p, ' ', space);
+   p[space] = '\0';
+
+   int line_cnt = 0;
+   char **t = NULL;
+   char buf[64];
+   char type_name[20] = {0, };
+
+   switch(part_type)
+     {
+        case EDJE_PART_TYPE_RECTANGLE:
+           line_cnt = TEMPLATE_2_3_PART_RECT_LINE_CNT;
+           t = (char **) &TEMPLATE_2_3_PART_RECT;
+           strncpy(type_name, "rect\0", 5);
+           break;
+        case EDJE_PART_TYPE_TEXT:
+           line_cnt = TEMPLATE_2_3_PART_TEXT_LINE_CNT;
+           t = (char **) &TEMPLATE_2_3_PART_TEXT;
+           strncpy(type_name, "text\0", 5);
+           break;
+        case EDJE_PART_TYPE_SWALLOW:
+           line_cnt = TEMPLATE_2_3_PART_SWALLOW_LINE_CNT;
+           t = (char **) &TEMPLATE_2_3_PART_SWALLOW;
+           strncpy(type_name, "swallow\0", 8);
+           break;
+        case EDJE_PART_TYPE_TEXTBLOCK:
+           line_cnt = TEMPLATE_2_3_PART_TEXTBLOCK_LINE_CNT;
+           t = (char **) &TEMPLATE_2_3_PART_TEXTBLOCK;
+           strncpy(type_name, "textblock\0", 10);
+           break;
+        case EDJE_PART_TYPE_SPACER:
+           line_cnt = TEMPLATE_2_3_PART_SPACER_LINE_CNT;
+           t = (char **) &TEMPLATE_2_3_PART_SPACER;
+           strncpy(type_name, "spacer\0", 7);
+           break;
+        case EDJE_PART_TYPE_IMAGE:
+        case EDJE_PART_TYPE_NONE:
+        case EDJE_PART_TYPE_GRADIENT:
+        case EDJE_PART_TYPE_GROUP:
+        case EDJE_PART_TYPE_BOX:
+        case EDJE_PART_TYPE_TABLE:
+        case EDJE_PART_TYPE_EXTERNAL:
+        case EDJE_PART_TYPE_PROXY:
+        case EDJE_PART_TYPE_LAST:
+           line_cnt = TEMPLATE_2_3_PART_IMAGE_LINE_CNT;
+           t = (char **) &TEMPLATE_2_3_PART_IMAGE;
+           strncpy(type_name, "image\0", 6);
+           break;
+        //for avoiding compiler warning.
+        case EDJE_PART_TYPE_MESH_NODE:
+        case EDJE_PART_TYPE_LIGHT:
+        case EDJE_PART_TYPE_CAMERA:
+        //case EDJE_PART_TYPE_SNAPSHOT:
+           break;
+     }
+
+   //Insert first line of the part block with generated name.
+   char first_line[40];
+   char random_name[15];
+   template_random_string_create(type_name, random_name, 4);
+
+   elm_entry_entry_insert(edit_entry, p);
+   //TIZEN_ONLY(20160315): support old edc script
+   //snprintf(first_line, 40, "%s { \"%s\";<br/>", type_name, random_name);
+   snprintf(first_line, 40, "part { name: \"%s\";<br/>", random_name);
+   //
+   elm_entry_entry_insert(edit_entry, first_line);
+
+   //Insert part body
+   int i;
+   for (i = 0; i < line_cnt; i++)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        elm_entry_entry_insert(edit_entry, t[i]);
+     }
+
+   if (part_type == EDJE_PART_TYPE_TEXTBLOCK)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      text.style: \"%s\";<br/>",
+                 random_name);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt++;
+     }
+
+   //Apply align values
+   elm_entry_entry_insert(edit_entry, p);
+   snprintf(buf, sizeof(buf), "      align: %s;<br/>",
+            _posix_fp(align_x, align_y, "%.1f"));
+   elm_entry_entry_insert(edit_entry, buf);
+   line_cnt++;
+
+   //Width is fixed or Height is fixed
+   if (fixed_w || fixed_h)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      fixed: %d %d;<br/>", fixed_w, fixed_h);
+        elm_entry_entry_insert(edit_entry, buf);
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      min: %d %d;<br/>", min_w, min_h);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt += 2;
+     }
+
+   //If there are some relative_to part then insert relative_to 
+   if (rel1_x_to)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel1.to_x: \"%s\";<br/>", rel1_x_to);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt++;
+     }
+   if (rel1_y_to)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel1.to_y: \"%s\";<br/>", rel1_y_to);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt++;
+     }
+   if (rel2_x_to)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel2.to_x: \"%s\";<br/>", rel2_x_to);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt++;
+     }
+   if (rel2_y_to)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel2.to_y: \"%s\";<br/>", rel2_y_to);
+        elm_entry_entry_insert(edit_entry, buf);
+        line_cnt++;
+     }
+
+   //Insert relatives
+   elm_entry_entry_insert(edit_entry, p);
+
+   //These conditions check whether the relative number is 4 places of decimals or not
+   //Condition 1: relative values are 4 places of decimals
+   if ((int)(rel1_x * 10000 + 0.5) % 100 ||
+       (int)(rel1_y * 10000 + 0.5) % 100 ||
+       (int)(rel2_x * 10000 + 0.5) % 100 ||
+       (int)(rel2_y * 10000 + 0.5) % 100)
+     {
+        snprintf(buf, sizeof(buf), "      rel1.relative: %s;<br/>",
+                 _posix_fp(rel1_x, rel1_y, "%.4f"));
+        elm_entry_entry_insert(edit_entry, buf);
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel2.relative: %s;<br/>",
+                 _posix_fp(rel2_x, rel2_y, "%.4f"));
+     }
+   //Condition 2: relative values are 2 places of decimals
+   else
+     {
+        snprintf(buf, sizeof(buf), "      rel1.relative: %s;<br/>",
+                 _posix_fp(rel1_x, rel1_y, "%.2f"));
+        elm_entry_entry_insert(edit_entry, buf);
+        elm_entry_entry_insert(edit_entry, p);
+        snprintf(buf, sizeof(buf), "      rel2.relative: %s;<br/>",
+                 _posix_fp(rel2_x, rel2_y, "%.2f"));
+     }
+
+   elm_entry_entry_insert(edit_entry, buf);
+
+   //Insert the tale of the part that contains closing brackets
+   t = (char **) &TEMPLATE_2_3_PART_TALE;
+   for (i = 0; i < TEMPLATE_2_3_PART_TALE_LINE_CNT; i++)
+     {
+        elm_entry_entry_insert(edit_entry, p);
+        elm_entry_entry_insert(edit_entry, t[i]);
+     }
+
+   //Add a new line in the end of inserted template
+   elm_entry_entry_insert(edit_entry, "<br/>");
+
+   //Increase (part name + body + relatives + tail) line
+   int line_inc = 1 + line_cnt + 2 + TEMPLATE_2_3_PART_TALE_LINE_CNT;
+   edit_line_increase(ed, line_inc);
+
+   int cursor_pos2 = elm_entry_cursor_pos_get(edit_entry);
+   edit_redoundo_region_push(ed, cursor_pos1, cursor_pos2);
+
+   elm_entry_cursor_pos_set(edit_entry, cursor_pos);
+
+   if (part_type == EDJE_PART_TYPE_IMAGE)
+     image_description_add_2_3(ed);
+   else if (part_type == EDJE_PART_TYPE_TEXTBLOCK)
+     textblock_style_add_2_3(ed, random_name);
+
+   //select random name
+   select_random_name(edit_entry, first_line, random_name, space);
+
+   edit_syntax_color_partial_apply(ed, 0);
+   edit_changed_set(ed, EINA_TRUE);
+
+   strncpy(syntax, type_name, n);
+
+   return EINA_TRUE;
+}
+
+//Tizen Only : Support Tizen version 2.3 for 2.x (2.3, 2.3.1, 2.3.2, 2.4)
+static Eina_Bool
+template_insert_2_3(edit_data *ed, char *syntax, size_t n)
+{
+   Evas_Object *entry = edit_entry_get(ed);
+   Eina_Stringshare *paragh = edit_cur_paragh_get(ed);
+
+   Eina_Bool ret = EINA_FALSE;
+   if (!paragh) return EINA_FALSE;
+
+   //Move cursor position to the beginning of the next line to apply indentation
+   elm_entry_cursor_line_end_set(entry);
+   int cursor_line_end_pos = elm_entry_cursor_pos_get(entry);
+   elm_entry_cursor_pos_set(entry, cursor_line_end_pos + 1);
+
+   if (!strcmp(paragh, "parts"))
+     {
+        ret = template_part_insert_2_3(ed, EDJE_PART_TYPE_IMAGE,
+                                       ENVENTOR_TEMPLATE_INSERT_DEFAULT,
+                                       EINA_FALSE, EINA_FALSE,
+                                       NULL, NULL, NULL, NULL,
+                                       0.5, 0.5, 0, 0,
+                                       REL1_X, REL1_Y, REL2_X, REL2_Y, NULL,
+                                       syntax, n);
+        goto end;
+     }
+
+   int line_cnt;
+   char **t = NULL;
+   char first_line[42] = {0, };
+   char random_name[9];
+   int space = edit_cur_indent_depth_get(ed);
+
+   //Alloc Empty spaces
+   char *p = alloca(space + 1);
+   memset(p, ' ', space);
+   p[space] = '\0';
+
+   template_random_string_create(NULL, random_name, 8);
+   elm_entry_cursor_line_begin_set(entry);
+
+   if (!strcmp(paragh, "part"))
+     {
+        line_cnt = TEMPLATE_2_3_DESC_LINE_CNT;
+        Eina_Stringshare *part_name = edit_cur_part_name_get(ed);
+        if (!part_name) goto end;
+        view_data *vd = edj_mgr_view_get(NULL);
+        Edje_Part_Type part_type = view_part_type_get(vd, part_name);
+        if (part_type == EDJE_PART_TYPE_SPACER)
+          t = (char **) &TEMPLATE_2_3_DESC_SPACER;
+        else
+          t = (char **) &TEMPLATE_2_3_DESC;
+        strncpy(syntax, "Description", n);
+        snprintf(first_line, 42, TEMPLATE_2_3_DESC_FIRST_LINE, random_name);
+        eina_stringshare_del(part_name);
+     }
+   else if (!strcmp(paragh, "image") || !strcmp(paragh, "rect") ||
+            !strcmp(paragh, "swallow") || !strcmp(paragh, "text") ||
+            !strcmp(paragh, "textblock"))
+     {
+        line_cnt = TEMPLATE_2_3_DESC_LINE_CNT;
+        t = (char **) &TEMPLATE_2_3_DESC;
+        strncpy(syntax, "Description", n);
+        snprintf(first_line, 42, TEMPLATE_2_3_DESC_FIRST_LINE, random_name);
+     }
+   else if (!strcmp(paragh, "spacer"))
+     {
+        line_cnt = TEMPLATE_2_3_DESC_SPACER_LINE_CNT;
+        t = (char **) &TEMPLATE_2_3_DESC_SPACER;
+        strncpy(syntax, "Description", n);
+        snprintf(first_line, 42, TEMPLATE_2_3_DESC_FIRST_LINE, random_name);
+     }
+   else if (!strcmp(paragh, "programs"))
+     {
+        line_cnt = TEMPLATE_2_3_PROG_LINE_CNT;
+        t = (char **) &TEMPLATE_2_3_PROG;
+        strncpy(syntax, "Program", n);
+        snprintf(first_line, 42, TEMPLATE_2_3_PROG_FIRST_LINE, random_name);
+     }
+   else if (!strcmp(paragh, "images"))
+     {
+        line_cnt = TEMPLATE_2_3_IMG_LINE_CNT;
+        t = (char **) &TEMPLATE_2_3_IMG;
+        strncpy(syntax, "Image File", n);
+     }
+   else if (!strcmp(paragh, "collections"))
+     {
+        line_cnt = TEMPLATE_2_3_GROUP_LINE_CNT;
+        t = (char **) &TEMPLATE_2_3_GROUP;
+        strncpy(syntax, "Group", n);
+        snprintf(first_line, 42, TEMPLATE_2_3_GROUP_FIRST_LINE, random_name);
+     }
+
+   if (!t) goto end;
+
+   int cursor_pos = elm_entry_cursor_pos_get(entry);
+   int cursor_pos1 = elm_entry_cursor_pos_get(entry);
+
+   if (strcmp(paragh, "images"))
+     {
+        elm_entry_entry_insert(entry, p);
+        elm_entry_entry_insert(entry, first_line);
+     }
+
+   int i;
+   for (i = 0; i < (line_cnt - 1); i++)
+     {
+        elm_entry_entry_insert(entry, p);
+        elm_entry_entry_insert(entry, t[i]);
+     }
+   elm_entry_entry_insert(entry, p);
+   elm_entry_entry_insert(entry, t[i]);
+
+   //Add a new line in the end of inserted template
+   elm_entry_entry_insert(entry, "<br/>");
+
+   //Increase (template + last new line) line
+   edit_line_increase(ed, line_cnt + 1);
+
+   int cursor_pos2 = elm_entry_cursor_pos_get(entry);
+   edit_redoundo_region_push(ed, cursor_pos1, cursor_pos2);
+
+   if (!strcmp(paragh, "images"))
+     cursor_pos += (cursor_pos2 - cursor_pos1);
+
+   elm_entry_cursor_pos_set(entry, cursor_pos);
+
+   //select random name
+   select_random_name(entry, first_line, random_name, space);
+
+   edit_syntax_color_partial_apply(ed, 0);
+   edit_changed_set(ed, EINA_TRUE);
+
+   ret = EINA_TRUE;
+
+end:
+   eina_stringshare_del(paragh);
+
+   return ret;
+}
diff --git a/src/lib/template_code.h b/src/lib/template_code.h
new file mode 100644 (file)
index 0000000..1595f29
--- /dev/null
@@ -0,0 +1,180 @@
+#define TEMPLATE_GROUP_LINE_CNT 30
+
+const char *TEMPLATE_GROUP[TEMPLATE_GROUP_LINE_CNT] =
+{
+   "   /* TODO: Please replace embedded image files to your application image files. */<br/>",
+   "   images {<br/>",
+   "      image: \"EDC_EDITOR_EMBEDDED_IMAGE.png\" COMP;<br/>",
+   "   }<br/>",
+   "   parts {<br/>",
+   "      image { \"XXX\";<br/>",
+   "         scale: 1;<br/>",
+   "         desc { \"default\";<br/>",
+   "            rel1 { relative: 0.25 0.25; offset: 0 0; /*to: \"XXX\";*/ }<br/>",
+   "            rel2 { relative: 0.75 0.75; offset: -1 -1; /*to: \"XXX\";*/ }<br/>",
+   "            align: 0.5 0.5;<br/>",
+   "            fixed: 0 0;<br/>",
+   "            min: 0 0;<br/>",
+   "            visible: 1;<br/>",
+   "            /* TODO: Please replace embedded image files to your application image files. */<br/>",
+   "            image.normal: \"EDC_EDITOR_EMBEDDED_IMAGE.png\";<br/>"
+   "            //aspect: 1 1;<br/>",
+   "         }<br/>",
+   "      }<br/>",
+   "   }<br/>",
+   "   programs {<br/>",
+   "      program { \"XXX\";<br/>",
+   "         //signal: \"XXX\";<br/>",
+   "         //source: \"XXX\";<br/>",
+   "         action: STATE_SET \"default\";<br/>",
+   "         target: \"XXX\";<br/>",
+   "         //transition: LINEAR 1.0;<br/>",
+   "      }<br/>",
+   "   }<br/>",
+   "}"
+};
+
+#define TEMPLATE_PART_TALE_LINE_CNT 2
+
+const char *TEMPLATE_PART_TALE[TEMPLATE_PART_TALE_LINE_CNT] =
+{
+   "   }<br/>",
+   "}"
+};
+
+#define TEMPLATE_PART_IMAGE_LINE_CNT 6
+
+const char *TEMPLATE_PART_IMAGE[TEMPLATE_PART_IMAGE_LINE_CNT] =
+{
+   "   scale: 1;<br/>",
+   "   desc { \"default\";<br/>",
+   "      visible: 1;<br/>",
+   "      /* TODO: Please replace embedded image files to your application image files. */<br/>",
+   "      image.normal: \"EDC_EDITOR_EMBEDDED_IMAGE.png\";<br/>",
+   "      //aspect: 1 1;<br/>"
+};
+
+#define TEMPLATE_PART_RECT_LINE_CNT 4
+
+const char *TEMPLATE_PART_RECT[TEMPLATE_PART_RECT_LINE_CNT] =
+{
+   "   scale: 1;<br/>",
+   "   desc { \"default\";<br/>",
+   "      color: 0 136 170 255;<br/>",
+   "      visible: 1;<br/>"
+};
+
+#define TEMPLATE_PART_SWALLOW_LINE_CNT 3
+
+const char *TEMPLATE_PART_SWALLOW[TEMPLATE_PART_SWALLOW_LINE_CNT] =
+{
+   "   scale: 1;<br/>",
+   "   desc { \"default\";<br/>",
+   "      visible: 1;<br/>"
+};
+
+#define TEMPLATE_PART_SPACER_LINE_CNT 2
+
+const char *TEMPLATE_PART_SPACER[TEMPLATE_PART_SPACER_LINE_CNT] =
+{
+   "   scale: 1;<br/>",
+   "   desc { \"default\";<br/>",
+};
+
+#define TEMPLATE_PART_TEXT_LINE_CNT 13
+
+const char *TEMPLATE_PART_TEXT[TEMPLATE_PART_TEXT_LINE_CNT] =
+{
+   "   scale: 1;<br/>",
+   "   effect: SOFT_OUTLINE;<br/>",
+   "   desc { \"default\";<br/>",
+   "      color: 255 255 255 255;<br/>",
+   "      color2: 0 136 170 100;<br/>",
+   "      visible: 1;<br/>",
+   "      text {<br/>",
+   "         size: 50;<br/>",
+   "         font: \"Sans\";<br/>",
+   "         text: \"TEXT\";<br/>",
+   "         align: 0.5 0.5;<br/>",
+   "         min: 0 0;<br/>",
+   "      }<br/>"
+};
+
+#define TEMPLATE_PART_TEXTBLOCK_LINE_CNT 4
+
+const char *TEMPLATE_PART_TEXTBLOCK[TEMPLATE_PART_TEXTBLOCK_LINE_CNT] =
+{
+   "   scale: 1;<br/>",
+   "   desc { \"default\";<br/>",
+   "      visible: 1;<br/>",
+   "      text.text: \"TEXTBLOCK\";<br/>"
+};
+
+#define TEMPLATE_DESC_LINE_CNT 9
+
+const char *TEMPLATE_DESC[TEMPLATE_DESC_LINE_CNT] =
+{
+   "   //inherit: \"default\";<br/>",
+   "   rel1 { relative: 0.0 0.0; offset: 0 0; /*to: \"XXX\";*/ }<br/>",
+   "   rel2 { relative: 1.0 1.0; offset: -1 -1; /*to: \"XXX\";*/ }<br/>",
+   "   align: 0.5 0.5;<br/>",
+   "   fixed: 0 0;<br/>",
+   "   min: 0 0;<br/>",
+   "   visible: 1;<br/>",
+   "   color: 255 255 255 255;<br/>",
+   "}"
+};
+
+#define TEMPLATE_DESC_SPACER_LINE_CNT 7
+
+const char *TEMPLATE_DESC_SPACER[TEMPLATE_DESC_SPACER_LINE_CNT] =
+{
+   "   //inherit: \"default\";<br/>",
+   "   rel1 { relative: 0.0 0.0; offset: 0 0; /*to: \"XXX\";*/ }<br/>",
+   "   rel2 { relative: 1.0 1.0; offset: -1 -1; /*to: \"XXX\";*/ }<br/>",
+   "   align: 0.5 0.5;<br/>",
+   "   fixed: 0 0;<br/>",
+   "   min: 0 0;<br/>",
+   "}"
+};
+
+#define TEMPLATE_PROG_LINE_CNT 6
+
+const char *TEMPLATE_PROG[TEMPLATE_PROG_LINE_CNT] =
+{
+   "   //signal: \"XXX\";<br/>",
+   "   //source: \"XXX\";<br/>",
+   "   //action: STATE_SET \"default\";<br/>",
+   "   //target: \"XXX\";<br/>",
+   "   //transition: LINEAR 1.0;<br/>",
+   "}"
+};
+
+#define TEMPLATE_IMG_LINE_CNT 1
+
+const char *TEMPLATE_IMG[TEMPLATE_IMG_LINE_CNT] =
+{
+   "image: \"EDC_EDITOR_EMBEDDED_IMAGE.png\" COMP;<br/>"
+};
+
+#define TEMPLATE_IMG_BLOCK_LINE_CNT 4
+
+const char *TEMPLATE_IMG_BLOCK[TEMPLATE_IMG_BLOCK_LINE_CNT] =
+{
+   "/* TODO: Please replace embedded image files to your application image files. */<br/>",
+   "images {<br/>",
+   "   image: \"EDC_EDITOR_EMBEDDED_IMAGE.png\" COMP;<br/>",
+   "}<br/>"
+};
+
+#define TEMPLATE_TEXTBLOCK_STYLE_LINE_CNT 5
+
+const char *TEMPLATE_TEXTBLOCK_STYLE_BLOCK[TEMPLATE_TEXTBLOCK_STYLE_LINE_CNT] =
+{
+   "styles {<br/>",
+   "   style { \"%s\";<br/>",
+   "      base: \"font=\"Sans\" font_size=30 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0088AA64 valign=0.5 ellipsis=1.0 wrap=none align=center\";<br/>",
+   "   }<br/>",
+   "}<br/>"
+};
+
diff --git a/src/lib/template_code_2.3.h b/src/lib/template_code_2.3.h
new file mode 100644 (file)
index 0000000..65ed3c2
--- /dev/null
@@ -0,0 +1,192 @@
+const char TEMPLATE_2_3_GROUP_FIRST_LINE[] = "group { name: \"%s\";<br/>";
+const char TEMPLATE_2_3_DESC_FIRST_LINE[] = "description { state: \"%s\" 0.0;<br/>";
+const char TEMPLATE_2_3_PROG_FIRST_LINE[] = "program { name: \"%s\";<br/>";
+
+#define TEMPLATE_2_3_GROUP_LINE_CNT 32
+
+const char *TEMPLATE_2_3_GROUP[TEMPLATE_2_3_GROUP_LINE_CNT] =
+{
+   "   /* TODO: Please replace embedded image files to your application image files. */<br/>",
+   "   images {<br/>",
+   "      image: \"EDC_EDITOR_EMBEDDED_IMAGE.png\" COMP;<br/>",
+   "   }<br/>",
+   "   parts {<br/>",
+   "      part { name: \"XXX\";<br/>",
+   "         type: IMAGE;<br/>",
+   "         scale: 1;<br/>",
+   "         mouse_events: 1;<br/>",
+   "         description { state: \"default\" 0.0;<br/>",
+   "            rel1 { relative: 0.25 0.25; offset: 0 0; /*to: \"XXX\";*/ }<br/>",
+   "            rel2 { relative: 0.75 0.75; offset: -1 -1; /*to: \"XXX\";*/ }<br/>",
+   "            align: 0.5 0.5;<br/>",
+   "            fixed: 0 0;<br/>",
+   "            min: 0 0;<br/>",
+   "            visible: 1;<br/>",
+   "            /* TODO: Please replace embedded image files to your application image files. */<br/>",
+   "            image.normal: \"EDC_EDITOR_EMBEDDED_IMAGE.png\";<br/>"
+   "            //aspect: 1 1;<br/>",
+   "         }<br/>",
+   "      }<br/>",
+   "   }<br/>",
+   "   programs {<br/>",
+   "      program { name: \"XXX\";<br/>",
+   "         //signal: \"XXX\";<br/>",
+   "         //source: \"XXX\";<br/>",
+   "         action: STATE_SET \"default\" 0.0;<br/>",
+   "         target: \"XXX\";<br/>",
+   "         //transition: LINEAR 1.0;<br/>",
+   "      }<br/>",
+   "   }<br/>",
+   "}"
+};
+
+#define TEMPLATE_2_3_PART_TALE_LINE_CNT 2
+
+const char *TEMPLATE_2_3_PART_TALE[TEMPLATE_2_3_PART_TALE_LINE_CNT] =
+{
+   "   }<br/>",
+   "}"
+};
+
+#define TEMPLATE_2_3_PART_IMAGE_LINE_CNT 7
+
+const char *TEMPLATE_2_3_PART_IMAGE[TEMPLATE_2_3_PART_IMAGE_LINE_CNT] =
+{
+   "   type: IMAGE;<br/>",
+   "   scale: 1;<br/>",
+   "   description { state: \"default\" 0.0;<br/>",
+   "      visible: 1;<br/>",
+   "      /* TODO: Please replace embedded image files to your application image files. */<br/>",
+   "      image.normal: \"EDC_EDITOR_EMBEDDED_IMAGE.png\";<br/>",
+   "      //aspect: 1 1;<br/>"
+};
+
+#define TEMPLATE_2_3_PART_RECT_LINE_CNT 5
+
+const char *TEMPLATE_2_3_PART_RECT[TEMPLATE_2_3_PART_RECT_LINE_CNT] =
+{
+   "   type: RECT;<br/>",
+   "   scale: 1;<br/>",
+   "   description { state: \"default\" 0.0;<br/>",
+   "      color: 0 136 170 255;<br/>",
+   "      visible: 1;<br/>"
+};
+
+#define TEMPLATE_2_3_PART_SWALLOW_LINE_CNT 4
+
+const char *TEMPLATE_2_3_PART_SWALLOW[TEMPLATE_2_3_PART_SWALLOW_LINE_CNT] =
+{
+   "   type: SWALLOW;<br/>",
+   "   scale: 1;<br/>",
+   "   description { state: \"default\" 0.0;<br/>",
+   "      visible: 1;<br/>"
+};
+
+#define TEMPLATE_2_3_PART_SPACER_LINE_CNT 3
+
+const char *TEMPLATE_2_3_PART_SPACER[TEMPLATE_2_3_PART_SPACER_LINE_CNT] =
+{
+   "   type: SPACER;<br/>",
+   "   scale: 1;<br/>",
+   "   description { state: \"default\" 0.0;<br/>",
+};
+
+#define TEMPLATE_2_3_PART_TEXT_LINE_CNT 14
+
+const char *TEMPLATE_2_3_PART_TEXT[TEMPLATE_2_3_PART_TEXT_LINE_CNT] =
+{
+   "   type: TEXT;<br/>",
+   "   scale: 1;<br/>",
+   "   effect: SOFT_OUTLINE;<br/>",
+   "   description { state: \"default\" 0.0;<br/>",
+   "      color: 255 255 255 255;<br/>",
+   "      color2: 0 136 170 100;<br/>",
+   "      visible: 1;<br/>",
+   "      text {<br/>",
+   "         size: 50;<br/>",
+   "         font: \"Sans\";<br/>",
+   "         text: \"TEXT\";<br/>",
+   "         align: 0.5 0.5;<br/>",
+   "         min: 0 0;<br/>",
+   "      }<br/>"
+};
+
+#define TEMPLATE_2_3_PART_TEXTBLOCK_LINE_CNT 5
+
+const char *TEMPLATE_2_3_PART_TEXTBLOCK[TEMPLATE_2_3_PART_TEXTBLOCK_LINE_CNT] =
+{
+   "   type: TEXTBLOCK;<br/>",
+   "   scale: 1;<br/>",
+   "   description { state: \"default\" 0.0;<br/>",
+   "      visible: 1;<br/>",
+   "      text.text: \"TEXTBLOCK\";<br/>"
+};
+
+#define TEMPLATE_2_3_DESC_LINE_CNT 10
+
+const char *TEMPLATE_2_3_DESC[TEMPLATE_2_3_DESC_LINE_CNT] =
+{
+   "   //inherit: \"default\";<br/>",
+   "   rel1 { relative: 0.0 0.0; offset: 0 0; /*to: \"XXX\";*/ }<br/>",
+   "   rel2 { relative: 1.0 1.0; offset: -1 -1; /*to: \"XXX\";*/ }<br/>",
+   "   align: 0.5 0.5;<br/>",
+   "   fixed: 0 0;<br/>",
+   "   min: 0 0;<br/>",
+   "   visible: 1;<br/>",
+   "   color: 255 255 255 255;<br/>",
+   "}"
+};
+
+#define TEMPLATE_2_3_DESC_SPACER_LINE_CNT 7
+
+const char *TEMPLATE_2_3_DESC_SPACER[TEMPLATE_2_3_DESC_SPACER_LINE_CNT] =
+{
+   "   //inherit: \"default\";<br/>",
+   "   rel1 { relative: 0.0 0.0; offset: 0 0; /*to: \"XXX\";*/ }<br/>",
+   "   rel2 { relative: 1.0 1.0; offset: -1 -1; /*to: \"XXX\";*/ }<br/>",
+   "   align: 0.5 0.5;<br/>",
+   "   fixed: 0 0;<br/>",
+   "   min: 0 0;<br/>",
+   "}"
+};
+
+#define TEMPLATE_2_3_PROG_LINE_CNT 7
+
+const char *TEMPLATE_2_3_PROG[TEMPLATE_2_3_PROG_LINE_CNT] =
+{
+   "   //signal: \"XXX\";<br/>",
+   "   //source: \"XXX\";<br/>",
+   "   //action: STATE_SET \"default\" 0.0;<br/>",
+   "   //target: \"XXX\";<br/>",
+   "   //transition: LINEAR 1.0;<br/>",
+   "}"
+};
+
+#define TEMPLATE_2_3_IMG_LINE_CNT 1
+
+const char *TEMPLATE_2_3_IMG[TEMPLATE_2_3_IMG_LINE_CNT] =
+{
+   "image: \"EDC_EDITOR_EMBEDDED_IMAGE.png\" COMP;<br/>"
+};
+
+#define TEMPLATE_2_3_IMG_BLOCK_LINE_CNT 4
+
+const char *TEMPLATE_2_3_IMG_BLOCK[TEMPLATE_2_3_IMG_BLOCK_LINE_CNT] =
+{
+   "/* TODO: Please replace embedded image files to your application image files. */<br/>",
+   "images {<br/>",
+   "   image: \"EDC_EDITOR_EMBEDDED_IMAGE.png\" COMP;<br/>",
+   "}<br/>"
+};
+
+#define TEMPLATE_2_3_TEXTBLOCK_STYLE_LINE_CNT 5
+
+const char *TEMPLATE_2_3_TEXTBLOCK_STYLE_BLOCK[TEMPLATE_2_3_TEXTBLOCK_STYLE_LINE_CNT] =
+{
+   "styles {<br/>",
+   "   style { name: \"%s\";<br/>",
+   "      base: \"font=\"Sans\" font_size=30 text_class=entry color=#FFFFFF style=soft_outline outline_color=#0088AA64 valign=0.5 ellipsis=1.0 wrap=none align=center\";<br/>",
+   "   }<br/>",
+   "}<br/>"
+};
+
diff --git a/src/lib/util.c b/src/lib/util.c
new file mode 100644 (file)
index 0000000..43b2358
--- /dev/null
@@ -0,0 +1,33 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <Enventor.h>
+#include "enventor_private.h"
+
+void mem_fail_msg(void)
+{
+   EINA_LOG_ERR("Failed to allocate Memory!");
+}
+
+const char*
+part_type_str_convert(Edje_Part_Type type)
+{
+   switch (type)
+     {
+        case EDJE_PART_TYPE_RECTANGLE:
+          return "rect";
+        case EDJE_PART_TYPE_TEXT:
+           return "text";
+        case EDJE_PART_TYPE_IMAGE:
+           return "image";
+        case EDJE_PART_TYPE_SWALLOW:
+           return "swallow";
+        case EDJE_PART_TYPE_TEXTBLOCK:
+           return "textblock";
+        case EDJE_PART_TYPE_SPACER:
+           return "spacer";
+        default:
+           return "part";
+     }
+}
diff --git a/src/lib/wireframes_obj.c b/src/lib/wireframes_obj.c
new file mode 100644 (file)
index 0000000..a2a832c
--- /dev/null
@@ -0,0 +1,343 @@
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#define EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT 1
+
+#include <Enventor.h>
+#include <Edje_Edit.h>
+#include "enventor_private.h"
+
+typedef struct part_obj_s
+{
+   Evas_Object *obj;
+   Eina_Stringshare *name;
+} part_obj;
+
+typedef struct wireframes_obj_s
+{
+   Evas_Object *layout;
+   Eina_List *part_list;
+   Ecore_Animator *animator;
+} wireframes_obj;
+
+const char *OUTLINEOBJ = "wireframes_obj";
+const char *OUTLINE_EDIT_LAYOUT_KEY = "edit_layout";
+
+/*****************************************************************************/
+/* Internal method implementation                                            */
+/*****************************************************************************/
+
+static void
+wireframes_objs_update(wireframes_obj *wireframes)
+{
+   Eina_List *parts = edje_edit_parts_list_get(wireframes->layout);
+   Eina_List *l, *l_next, *l2;
+   char *part_name;
+   part_obj *po;
+   Eina_Bool removed;
+
+   //Remove the wireframes objects that parts are removed.
+   EINA_LIST_FOREACH_SAFE(wireframes->part_list, l, l_next, po)
+     {
+        removed = EINA_TRUE;
+
+        EINA_LIST_FOREACH(parts, l2, part_name)
+          {
+             if (!part_name || !po->name[0]) continue;
+             if (po->name[0] != part_name[0]) continue;
+             if ((strlen(po->name) != strlen(part_name))) continue;
+             if (!strcmp(po->name, part_name))
+               {
+                  removed = EINA_FALSE;
+                  break;
+               }
+          }
+        if (removed)
+          {
+             evas_object_del(po->obj);
+             eina_stringshare_del(po->name);
+             wireframes->part_list = eina_list_remove_list(wireframes->part_list, l);
+             free(po);
+          }
+     }
+
+   //Trick!. set smart members of actual live view object.
+   Evas_Object *scroller = view_obj_get(VIEW_DATA);
+   if (!scroller) goto end;
+   Evas_Object *o = elm_object_content_get(scroller);
+   if (!o) goto end;
+   Evas_Object *o2 =
+      elm_object_part_content_get(o, "elm.swallow.content");
+   if (!o2) goto end;
+
+   Evas_Coord part_lx = 0, part_ly = 0;
+   evas_object_geometry_get(wireframes->layout, &part_lx, &part_ly,
+                            NULL, NULL);
+
+   //Add new part object or Update changed part.
+   EINA_LIST_FOREACH(parts, l, part_name)
+     {
+        Eina_List *part_l;
+        Evas_Object *pobj = NULL;
+        Evas_Coord part_x = 0, part_y = 0, part_w = 0, part_h = 0;
+
+        EINA_LIST_FOREACH(wireframes->part_list, part_l, po)
+          {
+             if (po->name != part_name) continue;
+             pobj = po->obj;
+             break;
+          }
+        if (!pobj)
+          {
+             pobj = edje_object_add(scroller);
+             edje_object_file_set(pobj, EDJE_PATH, "wireframes");
+             po = malloc(sizeof(part_obj));
+             po->obj = pobj;
+             po->name = eina_stringshare_add(part_name);
+             wireframes->part_list =
+                eina_list_append(wireframes->part_list, po);
+             evas_object_show(pobj);
+             evas_object_data_set(pobj, OUTLINE_EDIT_LAYOUT_KEY,
+                                  wireframes->layout);
+          }
+        //Up to date smart members.
+        evas_object_smart_member_del(pobj);
+        evas_object_smart_member_add(pobj, o2);
+
+        edje_object_part_geometry_get(wireframes->layout, part_name,
+                                      &part_x, &part_y, &part_w, &part_h);
+        evas_object_resize(pobj, part_w, part_h);
+        evas_object_move(pobj, part_lx + part_x, part_ly + part_y);
+     }
+end:
+   edje_edit_string_list_free(parts);
+}
+
+static void
+layout_geom_changed_cb(void *data, Evas *evas EINA_UNUSED,
+                       Evas_Object *obj, void *ei EINA_UNUSED)
+{
+   wireframes_obj *wireframes = (wireframes_obj *)data;
+
+   Eina_List *spacer_l;
+   part_obj *po;
+   int x = 0, y = 0, w = 0, h = 0, lx = 0, ly = 0;
+
+   evas_object_geometry_get(obj, &lx, &ly, NULL, NULL);
+
+   EINA_LIST_FOREACH(wireframes->part_list, spacer_l, po)
+   {
+      const char *sel_part = edje_edit_part_selected_state_get(obj,
+                                                               po->name, NULL);
+      // In case of spacer and text, it should be updated
+      // since spacer part can not receive the resize callback and
+      // text is part has delay in update_wireframe_cb.
+      if (edje_object_part_exists(obj, po->name)
+          && ((edje_edit_part_type_get(obj, po->name) == EDJE_PART_TYPE_SPACER)
+          || (edje_edit_part_type_get(obj, po->name) == EDJE_PART_TYPE_TEXT)
+          ||  !edje_edit_state_visible_get(obj, po->name, sel_part, 0.0)))
+        {
+           edje_object_part_geometry_get(obj, po->name, &x, &y, &w, &h);
+           evas_object_resize(po->obj, w, h);
+           evas_object_move(po->obj, lx + x, ly + y);
+        }
+    }
+}
+
+static Eina_Bool
+animator_cb(void *data)
+{
+   wireframes_obj *wireframes = data;
+   wireframes_objs_update(wireframes);
+   wireframes->animator = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+layout_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
+              void *event_info EINA_UNUSED)
+{
+   wireframes_obj_del(obj);
+}
+
+static void
+update_wireframe_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
+                    void *event_info EINA_UNUSED)
+{
+   wireframes_obj *wireframes = data;
+
+   Eina_List *part_l;
+   part_obj *po;
+   Evas_Object *pobj = NULL;
+
+   const char *part_name = evas_object_data_get(obj, "part_name");
+
+   //Find the wireframe matched to the part name.
+   EINA_LIST_FOREACH(wireframes->part_list, part_l, po)
+     {
+        if (po->name != part_name) continue;
+        pobj = po->obj;
+        break;
+     }
+
+   //Update the wireframe of the part name.
+   if (pobj)
+     {
+        Evas_Coord part_lx = 0, part_ly = 0;
+        Evas_Coord part_x = 0, part_y = 0, part_w = 0, part_h = 0;
+
+        //Case 1: If Part is the TEXT, the geometry information is different
+        //between edje_object_part_geometry_get and evas_object_geometry_get.
+        //So here, it should be considered.
+        if (edje_edit_part_type_get(wireframes->layout, part_name)
+            == EDJE_PART_TYPE_TEXT)
+          {
+             evas_object_geometry_get(wireframes->layout, &part_lx, &part_ly,
+                                      NULL, NULL);
+             edje_object_part_geometry_get(wireframes->layout, part_name,
+                                           &part_x, &part_y, &part_w, &part_h);
+          }
+        //Case 2: In case of not text case, evas_object_geomtry_get is more
+        //precise than edje_object_part_geometry_get.
+        else
+          {
+             Evas_Object *pobj2 = (Evas_Object *)
+                                 edje_object_part_object_get(wireframes->layout,
+                                                             part_name);
+             evas_object_geometry_get(pobj2, &part_x, &part_y,
+                                      &part_w, &part_h);
+          }
+
+        evas_object_resize(pobj, part_w, part_h);
+        evas_object_move(pobj, part_lx + part_x, part_ly + part_y);
+     }
+}
+
+static void
+wireframes_callbacks_set(wireframes_obj *wireframes, Evas_Object *layout)
+{
+   Eina_List *l = NULL;
+   Eina_Stringshare *part_name = NULL;
+   Eina_List *parts = edje_edit_parts_list_get(layout);
+
+   //Set resize and move callback to the edje part in layout to update wireframe.
+   EINA_LIST_FOREACH(parts, l, part_name)
+     {
+        Evas_Object *edje_part =
+              (Evas_Object *)edje_object_part_object_get(layout, part_name);
+        if (edje_part)
+          {
+             evas_object_event_callback_del(edje_part, EVAS_CALLBACK_RESIZE,
+                                            update_wireframe_cb);
+             evas_object_event_callback_del(edje_part, EVAS_CALLBACK_MOVE,
+                                            update_wireframe_cb);
+             evas_object_event_callback_add(edje_part, EVAS_CALLBACK_RESIZE,
+                                            update_wireframe_cb, wireframes);
+             evas_object_event_callback_add(edje_part, EVAS_CALLBACK_MOVE,
+                                            update_wireframe_cb, wireframes);
+          }
+     }
+}
+
+static void
+wireframes_callbacks_del(wireframes_obj *wireframes EINA_UNUSED, Evas_Object *layout)
+{
+   Eina_List *l = NULL;
+   Eina_Stringshare *part_name = NULL;
+   Eina_List *parts = edje_edit_parts_list_get(layout);
+
+   //Remove the callback of wireframe
+   EINA_LIST_FOREACH(parts, l, part_name)
+     {
+        Evas_Object *edje_part =
+              (Evas_Object *)edje_object_part_object_get(layout, part_name);
+        if (edje_part)
+          {
+             evas_object_event_callback_del(edje_part, EVAS_CALLBACK_RESIZE,
+                                            update_wireframe_cb);
+             evas_object_event_callback_del(edje_part, EVAS_CALLBACK_MOVE,
+                                            update_wireframe_cb);
+          }
+     }
+
+}
+
+/*****************************************************************************/
+/* Externally accessible calls                                               */
+/*****************************************************************************/
+
+void
+wireframes_obj_update(Evas_Object *layout)
+{
+   wireframes_obj *wireframes = evas_object_data_get(layout, OUTLINEOBJ);
+   if (!wireframes) return;
+   wireframes_objs_update(wireframes);
+}
+
+void
+wireframes_obj_callbacks_set(Evas_Object *layout)
+{
+   wireframes_obj *wireframes = evas_object_data_get(layout, OUTLINEOBJ);
+   if (!wireframes) return;
+   wireframes_callbacks_set(wireframes, layout);
+}
+
+void
+wireframes_obj_new(Evas_Object *layout)
+{
+   if (!layout) return;
+
+   wireframes_obj *wireframes = evas_object_data_get(layout, OUTLINEOBJ);
+   if (wireframes) return;
+
+   wireframes = calloc(1, sizeof(wireframes_obj));
+   if (!wireframes)
+     {
+        mem_fail_msg();
+        return;
+     }
+
+   Ecore_Animator *animator = ecore_animator_add(animator_cb, wireframes);
+   evas_object_data_set(layout, OUTLINEOBJ, wireframes);
+
+   evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, layout_del_cb,
+                                  wireframes);
+
+   evas_object_event_callback_add(layout, EVAS_CALLBACK_RESIZE,
+                                  layout_geom_changed_cb, wireframes);
+   evas_object_event_callback_add(layout, EVAS_CALLBACK_MOVE,
+                                  layout_geom_changed_cb, wireframes);
+
+   wireframes->layout = layout;
+   wireframes->animator = animator;
+   wireframes_callbacks_set(wireframes, layout);
+}
+
+void
+wireframes_obj_del(Evas_Object *layout)
+{
+   wireframes_obj *wireframes = evas_object_data_get(layout, OUTLINEOBJ);
+   if (!wireframes) return;
+
+   evas_object_event_callback_del_full(layout, EVAS_CALLBACK_RESIZE,
+                                  layout_geom_changed_cb, wireframes);
+   evas_object_event_callback_del_full(layout, EVAS_CALLBACK_MOVE,
+                                  layout_geom_changed_cb, wireframes);
+
+   wireframes_callbacks_del(wireframes, layout);
+
+   part_obj *po;
+   EINA_LIST_FREE(wireframes->part_list, po)
+     {
+        evas_object_del(po->obj);
+        eina_stringshare_del(po->name);
+        free(po);
+     }
+
+   ecore_animator_del(wireframes->animator);
+   free(wireframes);
+
+   evas_object_data_set(layout, OUTLINEOBJ, NULL);
+   evas_object_event_callback_del(layout, EVAS_CALLBACK_DEL, layout_del_cb);
+}
diff --git a/windows-32_pkg/windows-32_pkg.tar.gz b/windows-32_pkg/windows-32_pkg.tar.gz
new file mode 100644 (file)
index 0000000..b26f8f1
Binary files /dev/null and b/windows-32_pkg/windows-32_pkg.tar.gz differ
diff --git a/windows-64_pkg/windows-64_pkg.tar.gz b/windows-64_pkg/windows-64_pkg.tar.gz
new file mode 100644 (file)
index 0000000..5f88c15
Binary files /dev/null and b/windows-64_pkg/windows-64_pkg.tar.gz differ